【问题标题】:Can you set the scroll view insets for container controllers?你可以为容器控制器设置滚动视图插图吗?
【发布时间】:2014-08-10 02:23:11
【问题描述】:

我有一个容器控制器,它在 lop 布局指南的正下方显示一个数据栏。

我希望此容器控制器的子控制器能够在此栏以及任何导航栏和状态栏后面滚动。然而,当 UIKit 自动调整控制器的滚动视图插图时,它似乎只考虑顶部布局指南的长度。

有什么办法可以说滚动视图插图应该是顶部布局指南+我的栏的高度?我知道人们会建议我设置automaticallyAdjustsScrollViewInsets = NO,但我已经尝试过了。问题是当 UIKit 设置内容插入时我似乎无法准确复制,所以我得到了各种奇怪的边缘情况,这些情况会破坏插入。最突出的例子是 UITableViewController ,因为我手动设置了内容插图,所以刷新控件有时不在正确的位置,当我结束刷新滚动视图的插图时,设置为 { 0, 0 } 所以内容隐藏在后面我的栏和导航栏。

更新:所有的魔法似乎都在 UIViewController 上的 _setNavigationControllerContentInsetAdjustment 和 UINavigationController 上的 _computeAndApplyScrollContentInsetDeltaForViewController 方法中。

似乎只有导航控制器会尝试调整滚动视图的插图,它会根据顶部和底部的布局指南计算插图。它将这些插图传递给视图控制器,然后从滚动视图中添加/减去插图,并考虑之前设置的导航内容插图。这确保了如果其他人从现在到导航控制器上次修改插图时修改了内容插图,他们不会覆盖中间更改。

【问题讨论】:

    标签: ios uiscrollview uikit


    【解决方案1】:

    我的解决方案是设置 automaticallyAdjustsScrollViewInsets = NO 并自己处理内容插图的设置。

    我在 UIViewController 上创建了一个 category 来跟踪已设置的任何现有插图,因此每当我调整插图以使滚动视图出现在我的自定义 UIView 下方时,我都不会丢失任何信息,例如UITableViewController 里面有一个活跃的刷新控件。

    在那之后的最后一个挑战是确定在哪里设置自定义插图,经过大量试验后,我发现- (void)viewDidLayoutSubviews 是最好的选择。

    FDScrollingTabBarController 是我在其中实现此解决方案的容器控制器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多