contentOffset在UIScrollView中做了什么?

Aka*_*ash 56 iphone uiscrollview

contentOffset物业的用途是什么UIScrollView

Meh*_*hdi 83

它可以被认为是scrollView框架相对于其框架原点的原点坐标contentView.见下图:

在此输入图像描述

  • 这是一个更好的答案.选定的答案只是对文档的重复. (14认同)
  • 我想说,答案非常好,解释清楚又简单 (2认同)

Jus*_*tin 53

根据文件,该contentOffset财产代表:

内容视图的原点从滚动视图的原点偏移的点.

简而言之,它是视图在每个方向(垂直和水平)移动了多远.您可以通过访问解压的垂直和水平距离xy的性质CGPoint:

CGFloat xOffset = _myScrollView.contentOffset.x;
CGFloat yOffset = _myScrollView.contentOffset.y;
Run Code Online (Sandbox Code Playgroud)

  • 例如,如果要呈现可以滚动的多个(n)页面,可以使用contentSize(n*pageWidth,pageHeight)和帧大小(pageWidth,pageHeight)创建UIScrollView.然后,您可以使用contentOffset.x来确定(或设置)正在(或应该)显示的页面. (16认同)
  • 由于滚动是通过更改滚动视图的边界原点(或其内容视图?忘记)来完成的,因此contentOffset是否与边界原点直接相关? (2认同)

Jan*_*ano 8

在此处输入图片说明

在这里你会看到两个矩形:

  • 可见区域
  • 总面积

滚动正在改变整个区域内可见区域的原点。

在 iOS 中,所有视图都有一个由view.bounds矩形表示的可见区域。该类UIScrollView是一个具有独特属性的视图:它有第二个矩形,称为“内容视图”,其大小大于其边界。因此,在滚动视图中:

  • 可见区域是 scrollView.bounds
  • 总面积称为内容视图,其大小为scrollView.contentSize

contentOffset是 的另一个名称scrollView.bounds.origin,实现如下:

var contentOffset: CGPoint { 
    get { return bounds.origin }
    set {
        var bounds = self.bounds
        bounds.origin = newValue
        self.bounds = bounds
    }   
}
Run Code Online (Sandbox Code Playgroud)

当我们以编程方式更改 contentOffset 时,我们也在更改 bounds.origin,这会导致呈现内容视图的不同区域。如果我们用 动画化这个变化setContentOffset(pt, animated: true),scrollView 看起来像被用户的手指拖动一样滚动。

官方文档这样定义 contentOffset (斜体是我的):

contentOffset:内容视图的原点(总区域)与滚动视图的原点(可见区域)偏移的点。

我想强调@westsider 对已接受答案的评论:

例如,如果你想展示 n 个可以滚动的页面,你可以创建一个带有 contentSize (n*pageWidth, pageHeight) 和边界大小 (pageWidth, pageHeight) 的 UIScrollView。然后将 contentOffset.x = (n-1) * pageWidth 设置为 n = 1 以显示第一页。