由于奇怪的 UINavigationBar 视图层次结构,自定义 UINavigationBar 不起作用
Posted
技术标签:
【中文标题】由于奇怪的 UINavigationBar 视图层次结构,自定义 UINavigationBar 不起作用【英文标题】:Customizing UINavigationBar not working because of weird UINavigationBar view hierarchy 【发布时间】:2020-05-02 18:14:29 【问题描述】:我的应用有许多被推送到导航堆栈的 ViewController。
我已在 AppDelegate 中全局配置 UINavigationBar 外观,如下所示。
let appearance = UINavigationBar.appearance()
appearance.barTintColor = myColor
appearance.tintColor = .white
appearance.isTranslucent = false
let textAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white,
NSAttributedString.Key.font: myFont, size: mySize)]
appearance.titleTextAttributes = textAttributes as [NSAttributedString.Key : Any]
除了只有一个 ViewController 之外,所有 ViewController 都按预期工作。
以下是按预期工作的 VC 之一。它显示了我想要的颜色和字体。
下面是显示不同外观的 ViewController。
我不明白为什么这个VC上只有一个navigationBar显示不同的外观。
所以我已经完成了视图层次结构的调试。
下面是按预期工作的 VC 的视图层次结构。
下面是 VC 的视图层次结构,看起来很奇怪。
如图所示,有问题的 NavigationBar 多了两层,UIVisualEffectView 和 UIVisualEffectBackdropView。
我是一位经验丰富的 ios 开发人员,不知道为什么会发生这种情况。
我仔细检查了IB上与NavigationBar相关的所有设置,发现与其他设置没有区别。
我什至移除了 ViewController,完全嵌入 NavigationController 并从头开始重建它们,但运气不佳。
请有人解释一下为什么只有这个 NavigationBar 有不同的结构。
我正在开发 iOS 13.3 和 Xcode 11.3.1
【问题讨论】:
有同样的问题 【参考方案1】:在iOS15上工作,我尝试了很多东西来自定义导航栏外观以实现简单的不透明颜色,除了这个没有任何效果:
在 viewDidLoad 中
if (@available(iOS 13.0, *))
UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
appearance.backgroundColor = [UIColor orangeColor];
self.navigationController.navigationBar.standardAppearance = appearance;
self.navigationController.navigationBar.scrollEdgeAppearance = appearance;
Swift 版本:
let appearance = UINavigationBarAppearance()
appearance.backgroundColor = .orange
navigationBar.standardAppearance = appearance;
navigationBar.scrollEdgeAppearance = navigationBar.standardAppearance
最后,如果您只想在当前控制器上应用它,并恢复默认导航栏,只需在 viewWillDisappear 上使用新的 UINavigationBarAppearance() 即可。
【讨论】:
以上是关于由于奇怪的 UINavigationBar 视图层次结构,自定义 UINavigationBar 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 8 中将 ViewController 的 View 作为子视图添加到 UIPageViewController 会在显示/隐藏时产生奇怪的 UINavigationBar
Xamarin iOS UINavigationBar 奇怪的覆盖
视图隐藏在 UINavigationBar iOS 7 下面