9

我创建了一个基于页面的应用程序并对其进行了一些实验。我的简单目标是拥有一个 UIPageViewController ,其页面将包含一个 UIViewController 持有一个 UITableView (经过进一步检查,如果我使用 UITableViewController 代替,我的实验结果是相同的)。为此,我简单地编辑了项目模板,并使用 Storyboard 的 ContainerView 对象将 UIPageViewController 添加为 RootViewController 的嵌入式视图,如您在此屏幕截图中所见:

故事板的控制器

每个控制器都通过故事板进行配置,以自动调整滚动视图的内容插图,如果我使用此配置启动项目,一切看起来都很好,并且 DataViewController 的表格视图按预期在导航栏下方正确调整了其内容插图;然而,当用户与 tableview 进行交互时,内容插入中断并且 tableview 覆盖导航栏:

uipageviewcontroller 和 tableview 的内容插入问题

我已经能够通过在 DataViewController 的 viewDidLayoutSubview 方法中手动设置内容插入以及在任何控制器上禁用调整滚动视图插入来解决此问题,因此我不需要这个作为解决问题的答案。我的问题是为什么在第一次从情节提要加载第一个控制器后正确设置内容插图,以及为什么它们在任何类型的用户交互后中断。

如果需要直接测试,这里是项目的链接

4

3 回答 3

16

我不是 100% 确定这是您遇到的问题,但这里有一些关于您的设置的解释:

默认情况下,UIViewControllers 倾向于配置为在非透明条后面扩展其内容,并调整滚动视图插图。在您上面的设置中,这意味着容器 VC:

  • 扩展其内容以显示在导航栏后面
  • 将其滚动视图的.contentInset和设置.scrollIndicatorInsets为与导航栏相同的高度

“可是,啊!” 我听到你说,“那个容器视图控制器没有滚动视图”。嗯,这是棘手的一点:

似乎UIViewController's“我的滚动视图”的定义相当简单,“我在向下搜索视图层次结构时遇到的第一个滚动视图”。

UIPageViewController恰好是使用滚动视图实现的。所以容器 VC 找到那个滚动视图,并调整它的顶部插图。这不是您真正想要的。它混淆了页面控制器,并且在某些时候往往会扰乱布局。

简单的解决方案就是关闭.automaticallyAdjustsScrollViewInsets容器视图控制器。

然后,您需要解决表格视图的下一个问题,需要某种顶部插图来说明导航栏。到目前为止,在我看来,最好的方法是在情节提要或代码中手动执行此操作。

于 2014-10-28T20:39:41.517 回答
9

找到了一个优雅的解决方案:

  1. 从您的故事板中,选择您的UIPageViewController
  2. 在属性检查器中,取消选中选项ViewController=> Extend Edges=>Under Top Bars
  3. 就是这样,没有奇怪的 UI hack
于 2015-12-15T22:30:39.343 回答
0

您是否尝试过在 Storyboard 中的 Root 视图控制器的容器视图中修复 Auto Layout 约束(即顶部空间约束应该设置与 Top Layout Guide 而不是 Superview 相关,常数 = 0)?你只会失去导航栏下表格视图滚动的效果

于 2014-09-10T17:53:36.200 回答