我已经创建了一个基于页面的应用程序,并为某些实验进行了一些攻击;我的简单目标是拥有一个UIPageViewController,其页面将包含一个UIViewController,其中包含一个UITableView(在进一步检查之后,如果我使用UITableViewController,我的实验结果是相同的)。 为此,我只编辑了项目模板,并使用Storyboard的ContainerView对象将UIPageViewController添加为RootViewController的嵌入视图,如此截图所示:
每个控制器都通过故事板配置来自动调整滚动视图的内容插入,如果我使用此配置启动项目,一切看起来都很好,并且DataViewController的tableview在导航栏下正确调整其内容插入符合预期;但是,当用户与tableview进行交互时,内容insets会中断,tableview会对导航栏进行重叠:
我已经能够通过在DataViewController的viewDidLayoutSubview方法中手动设置内容insets,并通过在任何控制器上禁用Adjusts Scroll View Insets来解决这个问题,所以我不需要这个来解决我的问题。 我的问题是为什么在第一次控制器第一次从故事板加载后正确设置了内容插入,以及为什么它们在任何类型的用户交互后都会中断。
如果您需要直接测试,here是项目的链接
答案 0 :(得分:16)
我不是100%确定这是你遇到的问题,但这里有一些关于你的设置的解释:
默认情况下,UIViewController
s往往被配置为将其内容扩展到非不透明栏后面,并调整滚动视图插入。在上面的设置中,这意味着容器VC:
.contentInset
和.scrollIndicatorInsets
设置为与导航栏相同的高度“但是,啊!”我听说你说“容器视图控制器没有滚动视图”。这是一个棘手的问题:
似乎UIViewController's
“我的滚动视图”的定义相当简单,“我在搜索视图层次结构时第一次看到滚动视图”。
UIPageViewController
碰巧使用滚动视图实现。因此容器VC找到滚动视图,并调整其顶部插入。这不是你想要的;它会混淆页面控制器,并且往往会在某些时候扰乱布局。
简单的解决方案就是关闭容器视图控制器的.automaticallyAdjustsScrollViewInsets
。
然后,您需要解决表视图的下一个问题,需要使用某种顶级插图来考虑导航栏。到目前为止,在我看来,最好的方法是在故事板或代码中手动完成。
答案 1 :(得分:9)
找到一个优雅的解决方案:
UIPageViewController
ViewController
=> Extend Edges
=> Under Top Bars
答案 2 :(得分:0)
您是否尝试在故事板中根视图控制器的容器视图中修复自动布局约束(即,顶部空间约束应设置为与顶部布局指南相关,而不是超级视图,常量= 0) ? 您只会失去在导航栏下滚动的表视图的效果