【问题标题】:What's the UIScrollView contentInset property for?UIScrollView contentInset 属性有什么用?
【发布时间】:2010-12-31 07:21:09
【问题描述】:

有人可以向我解释UIScrollView 实例中的contentInset 属性的用途吗?或许可以举个例子?

【问题讨论】:

    标签: ios objective-c uiscrollview


    【解决方案1】:

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

    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)
    

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

    【讨论】:

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

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

    【讨论】:

    • 这里的好处是您可以使用插图创建“在状态栏下滚动模糊”效果。
    • 照片应用的例子很容易理解。
    【解决方案3】:

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

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

    TOP BUTTONS
    
    TEXT
    
    BOTTOM TAB BAR
    

    我们希望文本永远不会透明地出现在顶部按钮下方,但我们希望文本出现在底部标签栏下方但仍允许滚动,因此我们可以更新透明地位于底部标签栏下方的文本。

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

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

    【讨论】:

      【解决方案4】:

      用于在UIScrollView中添加内边距

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

      然后设置contentInset:

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

      效果如下:

      似乎更好,对吧?

      我写了blog学习contentInset,欢迎批评。

      【讨论】:

        【解决方案5】:

        好问题。

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

        【讨论】:

          猜你喜欢
          • 2017-01-20
          • 2014-02-04
          • 2013-10-04
          • 1970-01-01
          • 2010-11-29
          • 1970-01-01
          • 1970-01-01
          • 2019-05-25
          • 2018-12-01
          相关资源
          最近更新 更多