如何处理UIScrollView缩放UIImageview时的偏移?

5

我有一个带有一个视图的UIScrollView,用于放大这个视图中的内容:UIImageView

这是当我仅显示图片时的样子:

enter image description here

当我捏住时:

enter image description here

然后我向下滑动:

enter image description here

现在出现了我不想看到的黑色区域。有没有办法设置一些偏移量并防止滚动过度?

在代码中我只是简单地使用:

//MARK: - UIScrollViewDelegate

public func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return photoImageView
}

黑色区域是图片的一部分吗? - Benjamin Lowry
你有任何想法要处理什么吗?我猜这可能涉及到内容偏移、插入等问题... - Bartłomiej Semańczyk
抱歉,我正在研究这个问题,寻找一些灵感,但我认为这超出了我的专业领域。 - Benjamin Lowry
@AhmadF 请查看我下面的回答。 - Bartłomiej Semańczyk
1
请在此处查看答案。https://dev59.com/cVkS5IYBdhLWcg3wzJL2 - Vlad Pulichev
显示剩余2条评论
1个回答

3

只需实现UIScrollViewDelegate

//MARK: - UIScrollViewDelegate

public func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return photoImageView
}

public func scrollViewDidZoom(_ scrollView: UIScrollView) {

    let imageViewSize = photoImageView.frame.size
    let scrollViewSize = scrollView.bounds.size

    let verticalPadding = imageViewSize.height < scrollViewSize.height ? (scrollViewSize.height - imageViewSize.height) / 2 : 0
    let horizontalPadding = imageViewSize.width < scrollViewSize.width ? (scrollViewSize.width - imageViewSize.width) / 2 : 0

    if verticalPadding >= 0 {
        scrollView.contentInset = UIEdgeInsets(top: verticalPadding, left: horizontalPadding, bottom: verticalPadding, right: horizontalPadding)
    } else {
        scrollView.contentSize = imageViewSize
    }
}

并准备在 viewDidLoad 中显示:

private func setupInitialView() {

    photoImageView.sizeToFit()

    let imageViewSize = photoImageView.bounds.size
    let scrollViewSize = scrollView.bounds.size
    let widthScale = scrollViewSize.width / imageViewSize.width
    let heightScale = scrollViewSize.height / imageViewSize.height

    scrollView.minimumZoomScale = min(widthScale, heightScale)
    scrollView.setZoomScale(scrollView.minimumZoomScale, animated: false)

    scrollViewDidZoom(scrollView)
}

加油!感谢您分享解决方案,它对我很有效,因此建议接受它。 - Ahmad F
1
你好!我知道这是一个很老的问题,但是对于我来说代码没能运行。你有可能展示一下你的限制条件吗?因为让imageViewSize = photoImageView.bounds.size不仅会写入图片大小,而且imageView的大小也等于全屏(从你的评论中得出)。我和你处于相同的情况,但是这个解决方案对我并没有起作用。谢谢。 - Vlad Pulichev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接