我在缩放 UIImageView
时遇到问题,它设置在 UIScrollView
中。图像缩放以响应用户的捏合输入,但图像会缩放并变大直到占据整个屏幕,而不是停留在我的 UIScrollView
的边界内。我查看了一大堆不同的 SO 问题、文章和 YouTube 视频,试图找到问题的根源,但一无所获。
以下 SO 问题似乎松散相关,但在查看它们后我仍然无法解决我的问题:
- content size of UIScrollView
- UIScrollView with scaled UIImageView using autolayout
- UIScrollView squashes UIImageView image
- Swift UIImageView Stretched Aspect
- UIImageView pinch zoom swift
我的 UIScrollView
是在我的 Storyboard中创建的,我使用在界面构建器中创建的布局约束将其固定到位。我在 viewDidLoad()
中将 ScrollView 的委托(delegate)设置为 self(并将 UIScrollViewDelegate
添加到我的类的顶部)。 UIImageView
以编程方式创建。我在类的顶部声明 ImageView ,如下所示:
class VCImageViewer: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var lblImageTitle: UILabel!
@IBOutlet weak var btnBack: UIButton!
@IBOutlet weak var scrollView: UIScrollView!
var imageView:UIImageView = UIImageView() // <-- Image view
然后我使用以下代码行将 ImageView 添加为我的 UIScrollView
的 subview ,在 viewDidLoad()
期间调用:
self.scrollView.addSubview(self.imageView)
将 ImageView 添加到 ScrollView 后,我将图像加载到 ImageView 中。我从 URL 获取图像,并使用以下代码加载它。同样,这在 viewDidLoad()
中调用。
self.imageView.image = UIImage(data: data)
self.imageView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: (self.imageView.image?.size)!)
if self.imageView.image != nil {
self.lblError.isHidden = true
self.FormatImageViewerWithImage()
}
这确认图像已正确加载,隐藏警告标签,如果没有,我会显示,并调用 self.FormatImageViewerWithImage()
,如下所示:
func FormatImageViewerWithImage() {
// Constraints
let constraintImageViewTop:NSLayoutConstraint = NSLayoutConstraint(item: self.imageView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: self.scrollView, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 0)
let constraintImageViewBottom:NSLayoutConstraint = NSLayoutConstraint(item: self.imageView, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: self.scrollView, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 0)
let constraintImageViewLeft:NSLayoutConstraint = NSLayoutConstraint(item: self.imageView, attribute: NSLayoutAttribute.left, relatedBy: NSLayoutRelation.equal, toItem: self.scrollView, attribute: NSLayoutAttribute.left, multiplier: 1, constant: 0)
let constraintImageViewRight:NSLayoutConstraint = NSLayoutConstraint(item: self.imageView, attribute: NSLayoutAttribute.right, relatedBy: NSLayoutRelation.equal, toItem: self.scrollView, attribute: NSLayoutAttribute.right, multiplier: 1, constant: 0)
self.view.addConstraints([constraintImageViewTop, constraintImageViewBottom, constraintImageViewLeft, constraintImageViewRight])
self.scrollView.contentSize = self.imageView.image!.size
self.scrollView.clipsToBounds = false
let scrollViewFrame = scrollView.frame
let scaleWidth = scrollViewFrame.size.width / self.scrollView.contentSize.width
let scaleHeight = scrollViewFrame.size.height / self.scrollView.contentSize.height
let minScale = min(scaleWidth, scaleHeight)
self.scrollView.minimumZoomScale = minScale
self.scrollView.maximumZoomScale = 1.0
self.scrollView.zoomScale = minScale
}
我还实现了 scrollViewDidZoom
:
func scrollViewDidZoom(_ scrollView: UIScrollView) {
self.CentreScrollViewContents()
}
func CentreScrollViewContents() {
let boundsSize = self.scrollView.bounds.size
var contentsFrame = self.imageView.frame
if contentsFrame.size.width < boundsSize.width {
contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2
} else {
contentsFrame.origin.x = 0
}
if contentsFrame.size.height < boundsSize.height {
contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2
} else {
contentsFrame.origin.y = 0
}
self.imageView.frame = contentsFrame
}
和viewForZooming
:
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return self.imageView
}
我看到以前的问题(包括上面列出的一些)建议将代码添加到 viewWillLayoutSubviews()
,但我没有成功,所以我的 viewWillLayoutSubviews()
为空。
谁能看出我做错了什么?
最佳答案
请更改此行:
self.scrollView.clipsToBounds = false
到这一行:
self.scrollView.clipsToBounds = true
希望这对您有所帮助!
关于ios - Swift - UIImageView 缩放比 UIScrollView 大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45689009/