我有一个容器控制器,在lop布局指南的正下方显示数据条。
我希望此容器控制器的子控制器能够滚动此栏以及任何导航栏和状态栏。但是,当UIKit自动调整控制器的滚动视图插图时,它只会考虑顶部布局指南的长度。
有没有办法说滚动视图插图应该是顶部布局指南+我的栏的高度?我知道人们会建议我设置automaticallyAdjustsScrollViewInsets = NO
,但我已经尝试过了。问题是,当UIKit设置内容插入时,我似乎无法完全复制,因此我得到了各种奇怪的边缘情况,打破了插入。最突出的例子是UITableViewController,因为我手动设置内容插入,刷新控件有时不在正确的位置,当我结束刷新滚动视图的插图时设置为{0,0}所以内容隐藏在后面我的栏和导航栏。
UPDATE:所有魔法似乎都在UIViewController上的方法_setNavigationControllerContentInsetAdjustment
和UINavigationController上的_computeAndApplyScrollContentInsetDeltaForViewController
内。
似乎只有导航控制器尝试调整滚动视图插图,并根据顶部和底部布局指南计算插入。它将这些插入传递给视图控制器,然后视图控制器从滚动视图添加/减去插入,并考虑先前已设置的导航内容插入。这可以确保如果其他人在现在和导航控制器上次修改插入内容之后修改了内容插入,则它们不会覆盖中间更改。
答案 0 :(得分:2)
我的解决方案是设置automaticallyAdjustsScrollViewInsets = NO
并自行处理内容插入的设置。
我在UIViewController上创建了一个category,它跟踪了所有已设置的插图,因此每当我调整插图以使滚动视图出现在我的自定义UIView下面时,我不会丢失任何信息,例如内容插入对于UITableViewController,其中包含一个活动的刷新控件。
在此之后,最后一个挑战是找出设置自定义插图的位置,经过大量实验后,我发现- (void)viewDidLayoutSubviews
是最佳选择。
FDScrollingTabBarController是我实现此解决方案的容器控制器。