【问题标题】:New UINavigationBar appearance in detail pane of UISplitViewController in iOS 13iOS 13 中 UISplitViewController 详细信息窗格中的新 UINavigationBar 外观
【发布时间】:2019-10-30 02:45:24
【问题描述】:

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

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

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

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

UISplitViewControllerUISplitViewControllerDelegate 没有相关的 API 更改。 UINavigationController 中也没有任何内容。

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

UINavigationBar 类现在具有一些用于设置其外观的新属性。奇怪的是,UINavigationBar 的文档中的“自定义导航栏的外观”下没有提到这些。

iOS 13 新增三个属性:

  • standardAppearance
  • compactAppearance
  • scrollEdgeAppearance

这三个都是UINavigationBarAppearance类型。

默认只设置第一个。

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

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

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

为什么只在这种情况下才需要这个?除了添加这段代码,还有没有更正确的解决方案?

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

【问题讨论】:

  • 不知道这是否与我在这里的独立讨论有关 stackoverflow.com/a/56941896/341994 如果是,我应该删除那个答案并参考这个,也许......看看你的想法。跨度>
  • @matt 这个问题专门针对导航栏在拆分视图的详细信息窗格中的显示方式。这个问题与大标题或状态栏无关。设置scrollEdgeAppearance 可以解决这两个问题,但问题太不同了。
  • 好的,谢谢,这就是我不清楚的地方。

标签: ios uinavigationbar uisplitviewcontroller ios13


【解决方案1】:

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

控制 UINavigationBar 完全打开时发生的情况 展开,您要设置 scrollEdgeAppearance。通过设置 standardAppearance 和 scrollEdgeAppearance 到相同的值,你 会得到一个不会改变的条形图。

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

【讨论】:

  • 好消息。我不知道我怎么没有在“设置”应用中注意到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多