【发布时间】:2010-12-31 07:21:09
【问题描述】:
有人可以向我解释UIScrollView 实例中的contentInset 属性的用途吗?或许可以举个例子?
【问题讨论】:
标签: ios objective-c uiscrollview
有人可以向我解释UIScrollView 实例中的contentInset 属性的用途吗?或许可以举个例子?
【问题讨论】:
标签: ios objective-c uiscrollview
它设置内容视图和封闭滚动视图之间的插入距离。
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 Reference Library article on scroll views,它有一个信息丰富的屏幕截图(图 1-3) - 我将在此处通过文本复制它:
_|←_cW_→_|_↓_
| |
---------------
|content| ↑
↑ |content| contentInset.top
cH |content|
↓ |content| contentInset.bottom
|content| ↓
---------------
_|_______|___
↑
(cH = contentSize.height; cW = contentSize.width)
滚动视图包含内容视图以及指定内容插图提供的任何填充。
【讨论】:
padding 属性。
虽然 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 内容下方的文本,我们将底部插图设置为 BOTTOM TAB BAR 的高度。
如果没有插入,滚动条不会让您向上滚动内容以输入内容。有了插图,就好像内容有额外的“空白内容”内容插图的大小。空白文本已被“插入”到真正的“内容”中——这就是我记得这个概念的方式。
【讨论】:
用于在UIScrollView中添加内边距
没有contentInset,表格视图是这样的:
然后设置contentInset:
tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)
效果如下:
似乎更好,对吧?
我写了blog学习contentInset,欢迎批评。
【讨论】:
好问题。
考虑以下示例(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)];
}
插图是强制滚动条在所需内容上显示“窗口”的唯一方法。我仍然在搞乱这个示例代码,但想法就在那里:使用插图在您的 UIScrollView 上获得一个“窗口”。
【讨论】: