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