为什么UIPageViewController中UITableView的内容插件在交互后会变得混乱?

dev*_*ush 9 objective-c uitableview ios uipageviewcontroller uicontainerview

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

故事板的控制器

每个控制器都通过故事板配置来自动调整滚动视图的内容插入,如果我使用此配置启动项目,一切看起来都很好,并且DataViewController的tableview正确地在导航栏下按预期正确调整内容插件; 但是,当用户与tableview进行交互时,内容insets会中断,tableview会在导航栏下面显示:

uipageviewcontroller和tableview的内容插入问题

我已经能够通过在DataViewController的viewDidLayoutSubview方法中手动设置内容insets,并通过在任何控制器上禁用Adjusts Scroll View Insets来解决这个问题,所以我不需要这个来解决我的问题.我的问题是为什么在第一次控制器第一次从故事板加载后正确设置内容插入,以及为什么它们在任何类型的用户交互后中断.

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

Mik*_*lah 16

我不是100%肯定这是你遇到的,但这里有一些关于你的设置的解释:

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

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

"但是,啊!" 我听说你说"容器视图控制器没有滚动视图".那么这是一个棘手的问题:

似乎UIViewController's"我的滚动视图"的定义相当简单,"我在搜索视图层次结构时查看的第一个滚动视图".

UIPageViewController碰巧使用滚动视图实现.因此容器VC找到滚动视图,并调整其顶部插入.这不是你想要的; 它会混淆页面控制器,并且往往会在某些时候扰乱布局.

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

然后,您需要解决表视图的下一个问题,需要使用某种顶级插图来考虑导航栏.到目前为止,在我看来,最好的方法是在故事板或代码中手动操作.

  • `automaticallyAdjustsScrollViewInsets` 在 iOS 11 中已被弃用。Apple 声明“改用 UIScrollView 的 contentInsetAdjustmentBehavior”。 (2认同)

jav*_*sas 9

找到优雅的解决方案:

  1. 从故事板中选择您的 UIPageViewController
  2. 在"属性"检查器中,取消选中选项ViewController=> Extend Edges=>Under Top Bars
  3. 这就是全部,没有奇怪的UI黑客攻击