缩放和重绘 UIScrollView 内容后设置 contentOffset

Posted

技术标签:

【中文标题】缩放和重绘 UIScrollView 内容后设置 contentOffset【英文标题】:Setting contentOffset after zooming and redrawing UIScrollView content 【发布时间】:2016-02-09 00:37:40 【问题描述】:

我有一个UIScrollView,其中包含一个在缩放期间重绘自身的视图。缩放效果很好,但设置 contentOffset 不起作用。这是代码

func scrollViewDidZoom(scrollView: UIScrollView) 

    // Get relative position of content view
    let pX = (scrollView.contentOffset.x + scrollView.frame.width / 2.0) / scrollView.contentSize.width
    let pY = (scrollView.contentOffset.y + scrollView.frame.height / 2.0) / scrollView.contentSize.height

    // Rescale and redraw content view        
    contentView.frame=CGRect(x: 0,
        y: 0,
        width: contentView.frame.width * scrollView.zoomScale,
        height: contentView.frame.height * scrollView.zoomScale)
    contentView.scale *= scrollView.zoomScale
    contentView.setNeedsDisplay()

    // Recalculate content offsets so that relative position of content is the same as before
    let nX = contentView.frame.width * pX - scrollView.frame.width / 2.0
    let nY = contentView.frame.height * pY - scrollView.frame.height / 2.0

    // Reset zoom level of scroll view and content offsets
    scrollView.setZoomScale(1.0, animated: false)
    scrollView.setContentOffset(CGPoint(x: nX, y: nY), animated: false)

结果是,当内容视图应该放大时,它只会在正 x 和 y 方向(向下和向右)扩展。我已经看到其他一些 potential solutions 用于 scrollViewDidEndZooming,但即使是那些不适合我的案子。知道我在哪里出错了吗?

【问题讨论】:

【参考方案1】:

这里的问题是 AutoLayout,或者更确切地说是我使用框架而不是约束。该问题通过以下方式解决:a) 创建一个宽度约束属性,然后在需要时编辑其 constant 值,以及 b) 实现我自己的缩放行为而不是默认的 UIScrollView

【讨论】:

以上是关于缩放和重绘 UIScrollView 内容后设置 contentOffset的主要内容,如果未能解决你的问题,请参考以下文章

自定义视图在缩放后重绘时如何防止“反弹”效果?

减少浏览器的回流和重绘

iPhone:如何在捏缩放uiscrollview时重绘子视图

JPanel 图形清除和重绘?

在重绘屏幕之前,如何阻止 iPhone 显示变换更改

如何使用 swift 清除和重绘 UIView 的内容(存在于视图控制器中)?