ChatGPT解决这个技术问题 Extra ChatGPT

UIScrollView contentInset 属性有什么用?

有人可以向我解释 UIScrollView 实例中的 contentInset 属性的用途吗?也许提供一个例子?


N
Nikita

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

对象-C

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

斯威夫特 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)

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


那么它是否用于向 UIScrollView 添加填充?如果没有,你能给我一个实际的例子。我的问题不是如何实施,而是何时实施。
是的,它将内容填充在滚动视图的内部。它类似于 CSS padding 属性。
很抱歉,我可以将它移到它自己的问题上,但是基于此,如果您将每个 contentInset 值设置为 0 而不是 contentHeight ,实际会发生什么?这是否会强制整个滚动视图成为您设置的高度?
@jakev 不, .frame 属性控制滚动视图在其父级内的尺寸(请参阅此答案:stackoverflow.com/questions/5361369/…)。将所有边的 contentInsets 设置为 0 仅仅意味着内容不会在滚动视图中被填充。因此,当您滚动到顶部时,内容就位于滚动视图的顶部。如果滚动到底部,则内容会到达滚动视图的底部。
即使滚动总是保持marin到scrollView的顶部(contenInset),是否可以始终保持contentInset
F
Fabian

虽然 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 上的内置照片应用程序。导航栏和状态栏是透明的,滚动视图的内容在下方可见。那是因为滚动视图的框架延伸了那么远。但是如果不是因为内容插图,当您一直走到顶部时,您将永远无法让内容的顶部清晰透明的导航栏。


这里的好处是您可以使用插图创建“在状态栏下滚动模糊”效果。
关于照片应用程序的示例很容易理解。
F
Faisal Memon

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

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

TOP BUTTONS

TEXT

BOTTOM TAB BAR

我们希望文本永远不会透明地出现在 TOP BUTTONS 下方,但我们希望 Text 出现在 BOTTOM TAB BAR 下方,但仍允许滚动,因此我们可以更新透明地位于 BOTTOM TAB BAR 下方的文本。

然后我们将顶部原点设置在顶部按钮下方,高度包括底部标签栏的底部。为了访问位于底部标签栏内容下方的文本,我们将底部插图设置为底部标签栏的高度。

如果没有插入,滚动条不会让您向上滚动内容以输入内容。有了插图,就好像内容有额外的“空白内容”内容插图的大小。空白文本已“插入”到真正的“内容”中——这就是我记住这个概念的方式。


s
shim

它用于在 UIScrollView 中添加填充

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

https://i.stack.imgur.com/AgouYl.png

然后设置 contentInset

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

效果如下:

https://i.stack.imgur.com/lyv67l.png

似乎更好,对吧?

并且我写了一个blog来研究contentInset,欢迎批评。


D
Dan Rosenstark

好问题。

考虑以下示例(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 上获得一个“窗口”。