由于奇怪的 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 下面

UINavigationBar 和 UINavigationController 的内容之间的差距

拆分视图控制器导航栏的奇怪行为

如何在不影响先前视图的情况下更改 UINavigationBar 标题的名称?