swift - 缩小时如何使 UIImageView 居中于 Scrollview?

标签 swift uiscrollview nslayoutconstraint

只是想找出一种方法来为 iPhone 制作一个普通的照片查看器,但我就是无法进行缩放。

    myimageview = UIImageView()
    myimageview.translatesAutoresizingMaskIntoConstraints = false
    myimageview.image = UIImage(named: "1")
    scrollview = UIScrollView()
    scrollview.delegate = self
    scrollview.backgroundColor = UIColor.brownColor()
    scrollview.minimumZoomScale = self.view.frame.width/myimageview.image!.size.width
    scrollview.maximumZoomScale = 1.0
    scrollview.translatesAutoresizingMaskIntoConstraints = false

    self.view.addSubview(scrollview)
    scrollview.addSubview(myimageview)
    let views = ["scrollview":scrollview,"myimageview":myimageview]
    //add scrollview constraints
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollview]|", options: [], metrics: nil, views: views))
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollview]|", options: [], metrics: nil, views: views))
    scrollview.contentSize = myimageview.image!.size
    //add contentview:myimageview constraints
    let imagesize = myimageview.image!.size
    //let dd = (self.view.frame.height-imagesize.height*self.view.frame.width/imagesize.width)/2
    scrollview.addConstraint(NSLayoutConstraint(item: myimageview, attribute: .CenterY, relatedBy: .Equal, toItem: scrollview, attribute: .CenterY, multiplier: 1.0, constant: 0))
    scrollview.addConstraint(NSLayoutConstraint(item: myimageview, attribute: .Left, relatedBy: .Equal, toItem: scrollview, attribute: .Left, multiplier: 1.0, constant: 0))

    scrollview.addConstraint(NSLayoutConstraint(item: myimageview, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: myimageview.image!.size.width))
    scrollview.addConstraint(NSLayoutConstraint(item: myimageview, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: myimageview.image!.size.height))

基本上,我得到了一个 ScrollView 和一个 ImageView ,然后将它添加到 uiscrollview 的 subview 中。我手动设置 ScrollView 的内容大小并设置缩放。我还添加了 viewForZoomingInScrollView 委托(delegate)函数。缩放效果很好。

问题: 缩小时,我希望图像显示在屏幕中间(uiscrollview),但现在它位于顶部。如下图所示,图片在顶部,我希望它位于屏幕中间。 CenterY 似乎不起作用。没有发现错误。我粘贴的代码在 ViewDidLoad 函数中。 enter image description here

最佳答案

好吧,我发现2年后,自动布局仍然无法解决这个问题,你必须手动编写。很伤心。

var myimageview:UIImageView!
var scrollview:UIScrollView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    myimageview = UIImageView()
    //myimageview.translatesAutoresizingMaskIntoConstraints = false
    myimageview.image = UIImage(named: "1")
    myimageview.frame = CGRectMake(0, 0, myimageview.image!.size.width, myimageview.image!.size.height)
    scrollview = UIScrollView()
    scrollview.delegate = self
    scrollview.backgroundColor = UIColor.brownColor()
    scrollview.minimumZoomScale = self.view.frame.width/myimageview.image!.size.width
    scrollview.maximumZoomScale = 1.0
    scrollview.translatesAutoresizingMaskIntoConstraints = false

    self.view.addSubview(scrollview)
    scrollview.addSubview(myimageview)
    let views = ["scrollview":scrollview,"myimageview":myimageview]
    //add scrollview constraints
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollview]|", options: [], metrics: nil, views: views))
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollview]|", options: [], metrics: nil, views: views))
    scrollview.contentSize = myimageview.image!.size

}

func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
    // center the image as it becomes smaller than the size of the screen
    return myimageview
}

func scrollViewDidZoom(scrollView: UIScrollView) {
    let boundsSize = self.scrollview.bounds.size
    var contentsFrame = self.myimageview.frame

    if (contentsFrame.size.width < boundsSize.width) {
        contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0
    } else {
        contentsFrame.origin.x = 0.0
    }

    if (contentsFrame.size.height < boundsSize.height) {
        contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0
    } else {
        contentsFrame.origin.y = 0.0
    }

    myimageview.frame = contentsFrame;
}

关于swift - 缩小时如何使 UIImageView 居中于 Scrollview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33594250/

相关文章:

ios - 如何在不破坏从中分离的类的情况下以编程方式进行分离

ios - ScrollView 不缩放和水平滚动一起吗?

ios - UIScrollview 限制滑动区域

swift - 我如何解决此 : UILabel. 文本必须仅从主线程使用

ios - 有没有正确的方法来实现 TableView

ios - 如何使用 Swift 在后台线程中保存文件?

ios - Swift iOS - 在文本字段内输入时按下 uiview

objective-c - UIScrollView 中的滚动条大小异常行为

c# - 某些东西超越了我的约束

ios - 错误的NSLayoutConstraint导致黑屏