UIScrollView contentInset属性有什么用?


158

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

Answers:


239

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

对象

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

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

滚动视图将内容视图加上指定的内容插图所提供的任何填充。


然后用来向UIScrollView添加填充吗?如果不能,您可以给我一个实际的例子。我的问题不是如何实现它,而是何时实现。
ForeignerBR

28
是的,它将内容填充在滚动视图的内部。这类似于CSS padding属性。
Marc W

抱歉,我可以提出自己的问题,但是基于此,如果将每个contentInset值设置为除contentHeight之外的其他值,则实际会发生什么?这是否会迫使整个滚动视图成为您设置的高度?
jakev

@jakev不,.frame属性控制滚动视图在其父级中的尺寸(请参阅此答案:stackoverflow.com/questions/5361369/…)。所有方面将contentInsets设置为0只是意味着根本不会在滚动视图内填充内容。因此,当您滚动到顶部时,内容正对着滚动视图的顶部。如果滚动到底部,则内容将到达滚动视图的底部。
杰里米·维伯

是否有可能即使在滚动时始终保持contentInset始终将marin保持在scrollView的顶部(contenInset)
Chlebta

86

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


这里的好处是,您可以使用插图创建“带有模糊的状态栏下滚动”效果。
TheEye

关于照片应用程序的示例很容易理解。
abhimuralidharan

8

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

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

TOP BUTTONS

TEXT

BOTTOM TAB BAR

并且我们希望TEXT永远不会透明显示在TOP BUTTONS下方,但是我们希望Text出现在BOTTOM TAB BAR下方但仍然允许滚动,因此我们可以透明地更新坐在BOTTOM TAB BAR下方的文本。

然后,我们将顶部原点设置为TOP BUTTONS之下,将高度设置为包括BOTTOM TAB BAR的底部。要访问位于“底部标签栏”内容下方的“文本”,我们将底部插图设置为“底部标签栏”的高度。

如果没有插图,滚动条将不允许您向上滚动内容以键入内容。对于插图,内容似乎具有内容插图大小的额外“空白内容”。空白文本已“插入”到真正的“内容”中,这就是我记住该概念的方式。


4

它用于添加填充 UIScrollView

没有contentInset,表视图如下所示:

在此处输入图片说明

然后设置contentInset

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

效果如下:

在此处输入图片说明

似乎更好了吧?

我写了一个博客来研究contentInset,欢迎提出批评。


2

好问题。

考虑以下示例(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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.