在iOS 13下,如果您在导航控制器中设置了可滚动的根视图控制器(例如UITableViewController),然后将该导航控制器放在UISplitViewController的详细信息窗格中,则导航栏的背景在可滚动的内容位于顶部。
您可以通过基于“主/详细信息”模板创建一个新的iOS项目来看到此信息。然后修改情节提要以在详细信息窗格的导航控制器中使用UITableViewController。将设备/模拟器置于“亮外观”模式(它比“暗”模式更好地显示了问题)。运行应用程序,并注意导航栏区域的颜色与表格视图背景的颜色相同。现在向上滚动表格视图,导航栏颜色将变为标准的浅灰色。让表格视图返回顶部,导航栏颜色再次消失。
我仅在拆分视图控制器的详细信息窗格中看到了这一点。
如何关闭此“功能”,以使导航栏看起来正常,就像在拆分视图控制器的详细信息窗格以外的其他任何地方使用的其他导航栏一样?
UISplitViewController
或UISplitViewControllerDelegate
没有相关的API更改。 UINavigationController
中也没有任何内容。
经过一番挖掘,我找到了一种解决方法,但我很想找到一种避免这样做的方法。
UINavigationBar
类现在具有一些用于设置其外观的新属性。奇怪的是,UINavigationBar
的文档中的“自定义导航栏的外观”中没有提及这些。
iOS 13中有三个新属性:
standardAppearance
compactAppearance
scrollEdgeAppearance
这三个类型均为UINavigationBarAppearance
。
默认情况下仅设置第一个。
即使scrollEdgeAppearance
是nil
,拆分控制器的详细信息窗格的作用也好像是将backgroundColor
设置为clear
颜色一样。
因此,解决方法是将以下行添加到导航控制器的根视图控制器的viewDidLoad
方法中:
navigationController?.navigationBar.scrollEdgeAppearance = navigationController?.navigationBar.standardAppearance
为什么仅在这种情况下才需要?除了添加此代码,还有其他更正确的解决方案吗?
我注意到,苹果的任何应用程序(至少包括邮件,便笺和文件)似乎都没有使用此“功能”。
答案 0 :(得分:3)
您发现的解决方法是禁用此行为的“官方”方式,如Apple iOS系统体验团队的David Duncan的thread on Twitter所述。
控制UINavigationBar完全放置时发生的情况 展开后,您要设置scrollEdgeAppearance。通过设置 将standardAppearance和scrollEdgeAppearance设置为相同的值 会得到一个不变的条。
不会禁用此行为的Apple应用是“设置”应用。