在 iOS 13 下,如果您在导航控制器中设置可滚动的根视图控制器(例如 UITableViewController),然后将该导航控制器放在 UISplitViewController 的详细信息窗格中,则当可滚动内容为在顶部。
您可以通过基于 Master/Detail 模板创建一个新的 iOS 项目来看到这一点。然后修改情节提要以在详细信息窗格的导航控制器中使用 UITableViewController。将设备/模拟器置于 Light Appearance 模式(它比 Dark 模式更能显示问题)。运行应用程序并注意导航栏区域与表格视图背景颜色相同。现在向上滚动表格视图,导航栏颜色变为标准浅灰色。让表格视图返回顶部,导航栏颜色再次消失。
我只在拆分视图控制器的详细信息窗格中看到了这一点。
您如何关闭此“功能”以使导航栏看起来正常,就像在拆分视图控制器的详细信息窗格之外的其他任何地方使用的所有其他导航栏一样?
UISplitViewController
或没有相关的 API 更改UISplitViewControllerDelegate
。两者都没有UINavigationController
。
经过一番挖掘,我找到了一种解决方法,但我很想找到一种方法来避免这样做。
该类UINavigationBar
现在具有一些用于设置其外观的新属性。奇怪的是,这些都没有在UINavigationBar
.
iOS 13 中有三个新属性:
standardAppearance
compactAppearance
scrollEdgeAppearance
这三个都是 type UINavigationBarAppearance
。
默认情况下只设置第一个。
即使scrollEdgeAppearance
是nil
,拆分控制器的详细信息窗格的行为就好像已将其backgroundColor
设置为clear
颜色一样。
所以解决方法是viewDidLoad
在导航控制器的根视图控制器的方法中添加以下行:
navigationController?.navigationBar.scrollEdgeAppearance = navigationController?.navigationBar.standardAppearance
为什么仅在这种情况下才需要这样做?除了添加此代码之外,还有更正确的解决方案吗?
我注意到 Apple 的所有应用程序(至少是邮件、便笺和文件)似乎都没有使用此“功能”。