UIScrollView contentInset 属性用于什么?

有人能解释一下 UIScrollView实例中的 contentInset属性是用来做什么的吗?也许可以举个例子?

117969 次浏览

它设置内容视图和封闭滚动视图之间的插入距离。

Obj-C

aScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 7.0);

Swift 5.0

aScrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 7.0)

这是一个很好的 关于滚动视图的 iOS 参考图书馆文章,它有一个信息丰富的截图(图1-3)——我将通过文本复制它:

  _|←_cW_→_|_↓_
|       |
---------------
|content| ↑
↑ |content| contentInset.top
cH |content|
↓ |content| contentInset.bottom
|content| ↓
---------------
_|_______|___
↑




(cH = contentSize.height; cW = contentSize.width)

滚动视图包含内容视图以及指定内容插入所提供的任何填充。

问得好。

考虑下面的例子(scroller是一个 UIScrollView) :

float offset = 1000;
[super viewDidLoad];
for (int i=0;i<500; i++) {
UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(i * 100, 50, 95, 100)] autorelease];
[label setText:[NSString stringWithFormat:@"label %d",i]];
[self.scroller addSubview:label];
[self.scroller setContentSize:CGSizeMake(self.view.frame.size.width * 2 + offset, 0)];
[self.scroller setContentInset:UIEdgeInsetsMake(0, -offset, 0, 0)];
}

插入是唯一的方法,强制您的滚动器有一个“窗口”的内容,您想要它。我仍然在修改这个示例代码,但是我的想法是: 使用 insets 获得 UIScrollView上的“窗口”。

虽然 jball 的答案是对内容插入的极好描述,但它并没有回答何时使用它的问题。我会借用他的图表:

  _|←_cW_→_|_↓_
|       |
---------------
|content| ↑
↑ |content| contentInset.top
cH |content|
↓ |content| contentInset.bottom
|content| ↓
---------------
|content|
-------------↑-

当你这样做的时候,你会得到什么,但它的实用性只有在你滚动时才显示:

  _|←_cW_→_|_↓_
|content| ← content is still visible
---------------
|content| ↑
↑ |content| contentInset.top
cH |content|
↓ |content| contentInset.bottom
|content| ↓
---------------
_|_______|___
↑

顶行的内容仍然可见,因为它仍然在滚动视图的框架内。考虑顶部偏移量的一种方法是“当我们一直滚动到顶部时,如何将内容向下移动到滚动视图中”

要查看实际使用这个功能的地方,请查看 iPhone 上的内置照片应用程序。导航栏和状态栏是透明的,滚动视图的内容在下面是可见的。那是因为滚动视图的框架延伸到那么远。但是如果没有内容插入,当你一直到顶部的时候,你永远不可能让顶部的内容清楚透明的导航栏。

内容插入解决了内容位于用户界面的其他部分之下,但仍然可以使用滚动条访问的问题。换句话说,Content Inset 的目的是使交互区域小于实际区域。

考虑一下我们在屏幕上有三个逻辑区域的情况:

TOP BUTTONS


TEXT


BOTTOM TAB BAR

我们希望文本永远不要显示在顶部按钮的下面,但是我们希望文本显示在底部标签栏的下面,但是仍然允许滚动,所以我们可以更新文本显示在底部标签栏的下面。

然后,我们将顶部的原点设置为低于顶部的按钮,并高度包括底部的标签栏的底部。为了访问位于 BOTTOM TAB BAR 内容下面的 Text,我们将底部插图设置为 BOTTOM TAB BAR 的高度。

如果没有插入,滚动器将不允许您向上滚动足够的内容以便在其中输入内容。使用 inset 时,就好像内容有额外的“ BLANK CONTENT”,其大小与内容 inset 相同。空白文本已经“插入”到真正的“内容”中——这就是我如何记住这个概念的。

它用于在 UIScrollView中添加填充

如果没有 contentInset,表视图是这样的:

enter image description here

然后设置 contentInset:

tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

效果如下:

enter image description here

看起来好多了,对吧?

并且我写了一个 博客来学习 contentInset,欢迎批评。