ios - Swift - UIImageView 缩放比 UIScrollView 大

标签 ios swift uiscrollview uiimageview

我在缩放 UIImageView 时遇到问题,它设置在 UIScrollView 中。图像缩放以响应用户的捏合输入,但图像会缩放并变大直到占据整个屏幕,而不是停留在我的 UIScrollView 的边界内。我查看了一大堆不同的 SO 问题、文章和 YouTube 视频,试图找到问题的根源,但一无所获。

以下 SO 问题似乎松散相关,但在查看它们后我仍然无法解决我的问题:

我的 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/

相关文章:

performance - iOS UI 性能分析

ios - LocationManager 区域监视器不是我所期望的。区域边界看起来比我的设置大

ios - 有没有办法在编辑时只激活搜索栏上的取消按钮?

ios - 二维码扫描不工作

ios - 延迟加载 UIScrollView 或 UITableView

ios - 水平 UIScrollView 自动布局约束本地化

iphone - 使 UIScrollView (和内容)不透明

ios - 不确定如何在 iOS 应用程序中管理数据

ios - 在代码中使用 NSManagedObject 模型

swift - 如何通过单击下一步按钮添加和查看数组中下一张图像的图像