我正在尝试制作类似于Photo应用的照片查看器,用户可以放大和缩小特定图像。
图像最初的大小非常适合屏幕,但缩放时可以扩展以覆盖整个屏幕。
我在一个collectionView单元格中发生这种情况,该单元格是屏幕大小并启用了分页。在该单元格中是一个scrollView,其故事板约束设置为顶部/底部/前导/尾随它的超级视图。其余的发生在下面的代码中,即自定义单元格。
根据iOS 11中引入的scrollView的新行为,contentView(在我的情况下为imageView)应该在scrollView中居中使用:
imageView.centerXAnchor.constraint(equalTo: scrollView.contentLayoutGuide.centerXAnchor).isActive = true
imageView.centerYAnchor.constraint(equalTo: scrollView.contentLayoutGuide.centerYAnchor).isActive = true
但是我没有在任何地方看到它的解释,并且在我的代码中添加这两行绝对没有。
scrollView中的imageView继续位于左上角。
希望有人知道如何做到这一点并且可以提供帮助。
import UIKit
class ImageCollectionViewCell: UICollectionViewCell, UIScrollViewDelegate {
@IBOutlet weak var scrollView: UIScrollView! {
didSet {
scrollView.delegate = self
scrollView.minimumZoomScale = 0.2
scrollView.maximumZoomScale = 2.0
scrollView.contentSize = imageView.frame.size
scrollView.addSubview(imageView)
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.widthAnchor.constraint(equalToConstant: 350).isActive = true
imageView.heightAnchor.constraint(equalToConstant: 350).isActive = true
imageView.centerXAnchor.constraint(equalTo: scrollView.contentLayoutGuide.centerXAnchor).isActive = true
imageView.centerYAnchor.constraint(equalTo: scrollView.contentLayoutGuide.centerYAnchor).isActive = true
}
}
var imageView = UIImageView()
var image: UIImage? {
get {
return imageView.image
}
set {
imageView.image = newValue
scrollView?.contentSize = imageView.frame.size
}
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return self.imageView
}
}
答案 0 :(得分:1)
我已经面对同样的问题大约一天了,我终于弄明白了。仅将宽度和高度限制添加到图像是不够的。为了使用contentLayoutGuide
进行此操作,图像视图实际上必须与滚动视图相同。因此,您将必须执行以下任一操作:
选项1
将图像视图的宽度和高度限制更改为与滚动视图相同的大小。
imageView.widthAnchor.constraint(equalToConstant: scrollView.bounds.width).isActive = true
imageView.heightAnchor.constraint(equalToConstant: scrollView.bounds.height).isActive = true
选项2 -首选
删除图像视图的宽度和高度限制。而是添加约束,将图像视图的顶部,底部,前导和尾随锚固定到滚动视图。我都尝试过,这种方法似乎效果最好。
imageView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
imageView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
imageView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
imageView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
根据使用方式/位置的不同,您可能需要使用scrollView.layoutMarginGuide
作为锚点。
我还建议将这段代码从didSet
移到名为setup()
的私有方法,或者类似的方法。然后,从viewWillAppear
呼叫setup()
。这是一种更一致的方法。希望这会有所帮助!