21

在 iOS 13 下,如果您在导航控制器中设置可滚动的根视图控制器(例如 UITableViewController),然后将该导航控制器放在 UISplitViewController 的详细信息窗格中,则当可滚动内容为在顶部。

您可以通过基于 Master/Detail 模板创建一个新的 iOS 项目来看到这一点。然后修改情节提要以在详细信息窗格的导航控制器中使用 UITableViewController。将设备/模拟器置于 Light Appearance 模式(它比 Dark 模式更能显示问题)。运行应用程序并注意导航栏区域与表格视图背景颜色相同。现在向上滚动表格视图,导航栏颜色变为标准浅灰色。让表格视图返回顶部,导航栏颜色再次消失。

我只在拆分视图控制器的详细信息窗格中看到了这一点。

您如何关闭此“功能”以使导航栏看起来正常,就像在拆分视图控制器的详细信息窗格之外的其他任何地方使用的所有其他导航栏一样?

UISplitViewController或没有相关的 API 更改UISplitViewControllerDelegate。两者都没有UINavigationController

经过一番挖掘,我找到了一种解决方法,但我很想找到一种方法来避免这样做。

该类UINavigationBar现在具有一些用于设置其外观的新属性。奇怪的是,这些都没有在UINavigationBar.

iOS 13 中有三个新属性:

  • standardAppearance
  • compactAppearance
  • scrollEdgeAppearance

这三个都是 type UINavigationBarAppearance

默认情况下只设置第一个。

即使scrollEdgeAppearancenil,拆分控制器的详细信息窗格的行为就好像已将其backgroundColor设置为clear颜色一样。

所以解决方法是viewDidLoad在导航控制器的根视图控制器的方法中添加以下行:

navigationController?.navigationBar.scrollEdgeAppearance = navigationController?.navigationBar.standardAppearance

为什么仅在这种情况下才需要这样做?除了添加此代码之外,还有更正确的解决方案吗?

我注意到 Apple 的所有应用程序(至少是邮件、便笺和文件)似乎都没有使用此“功能”。

4

1 回答 1

10

您找到的解决方法是禁用此行为的“官方”方法,正如Apple iOS 系统体验团队的 David Duncan在 Twitter 上的一个帖子中所解释的那样。

要控制 UINavigationBar 完全展开时发生的情况,您需要设置 scrollEdgeAppearance。通过将standardAppearance 和scrollEdgeAppearance 设置为相同的值,您将获得一个不变的条形图。

不禁用此行为的 Apple 应用是“设置”应用。

于 2019-07-11T17:07:12.577 回答