【问题标题】:Why content insets of a UITableView inside a UIPageViewController get messy right after an interaction?为什么 UIPageViewController 中的 UITableView 的内容插入在交互后会变得混乱?
【发布时间】:2014-11-01 21:50:51
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios objective-c uitableview uipageviewcontroller uicontainerview


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 哇,我偶然发现了完全相同的问题,我拼命地用谷歌搜索它(我想我永远找不到答案,因为我一定犯了一个愚蠢的错误)但是你来了,救世主!谢谢
    • 谢谢你,迈克,这正是我所需要的!!
    【解决方案2】:

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

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

    【讨论】:

    • 是的,这对我来说是正确的解决方案。使用 automaticAdjustsScrollViewInsets 不起作用。就我而言,我在导航控制器中有一个 UIPageViewController。 UIPageViewController 为每个页面创建了 UICollectionViewController。设置 automaticallyAdjustsScrollViewInsets = false 导致页面已经被向上推。 automaticAdjustsScrollViewInsets = true 导致页面开始滚动时页面跳起来。
    【解决方案3】:

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

    【讨论】:

    • 问题是我不能因为设计决策而失去这种效果。
    • 无论如何,我找到了解决方法,我的问题是为什么会发生这种情况?
    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多