为什么UINavigationBar会变成黑色?

26

问题:

我有一个嵌套在UINavigationController中的UITableViewController。按下表视图中的单元格会切换到另一个表视图控制器。在该表视图控制器中,我希望导航栏不可见,同时保留选项卡栏项目,因此我将以下内容添加到其viewDidLoad()中:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.navigationBar.tintColor = .black 

对于第一个UITableViewController,我希望导航栏是正常的,因此在其 viewDidAppear() 方法中进行了以下操作:

self.navigationController?.navigationBar.isTranslucent = false

除过渡时导航栏消失成黑色外,一切正常(我是通过performSegueWithIdentifier进行过渡)。 老实说,这看起来很丑陋。 有没有什么方法可以防止/修复这个问题?

截图: 输入图片描述


你有找到这个问题的答案吗? - Matt Hudson
生成的解决方案会导致许多其他问题,因为它们解决了问题,但这不是edgesForExtendedLayout的作用。也许更好的方法是在应用程序委托中将应用程序窗口的背景颜色更改为适合应用程序的颜色:'''self.window?.backgroundColor = .white'''。 - hasan
10个回答

19

最近我又遇到了这个问题,并在Storyboard中找到了解决方法。如果您使用的是不透明的导航栏,请确保“Under Opaque Bars”的“Extend Edges”设置已设置。实际上,我只是将它们全部设置如下所示:

enter image description here


2
这个解决方案对我在刚出现的iOS 15问题上起了作用。谢谢! - instAustralia

13

iOS 15改变了导航栏的呈现方式。它们默认为透明。在大多数情况下,默认情况下,导航栏下方没有内容,导致黑色。下面的代码在AppDelegate(didFinishLaunchingWithOptions)中为我解决了这个问题。

if #available(iOS 15.0, *) {
        let navBarAppearance = UINavigationBarAppearance()
        navBarAppearance.configureWithOpaqueBackground()
        //Configure additional customizations here
        UINavigationBar.appearance().standardAppearance = navBarAppearance
        UINavigationBar.appearance().scrollEdgeAppearance = navBarAppearance
}

13

只需更改navigationController视图的backgroundColor

navigationController?.view.backgroundColor = // whatever

12

我最近也遇到了一个非常类似的问题。尝试在两个视图控制器中设置self.navigationController?.navigationBar.translucent = true以及self.edgesForExtendedLayout = UIRectEdgeNone
Storyboard版本: 扩展边缘 - 在顶部栏下方


2
设置self.edgesForExtendedLayout = UIRectEdge.None对我很有用!谢谢! - pavel_s

3

将应用程序的窗口背景颜色更改为适合您的颜色:

self.window?.backgroundColor = .white

其他解决方案在多个内部屏幕中引起其他问题。


这不幸地导致了一些视觉问题,与iOS 13的新模态呈现样式有关。如果您没有使用它们,那么这将非常有效。 - Allison

1
您可以动画显示导航栏的半透明效果。因此,在第二个UITableViewControllerviewDidLoad中,您可以编写以下内容:
override func viewDidLoad() {
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.tintColor = .blackColor()

    // Play around with the duration until you find
    // a time interval, you find suitable
    UIView.animateWithDuration(2) {
        self.navigationController?.navigationBar.translucent = true
    }
}

我已经尝试过了,但是导航栏消失得足够快和黑色部分出现之间没有平衡。我正在尝试想出一个解决方法。 - cyril
您说的"balance"是什么意思?因为当我在模拟器上运行以上代码片段时,看起来效果不错。您能否录制一个小的QuickTime视频,展示一下半透明动画的效果呢? - Kumuluzz
你使用的速度是多少?很遗憾,我不能告诉你,因为这个项目是为客户服务的。不管怎样,我的意思是速度太慢会导致导航栏在第二个视图控制器中仍然可见,而速度太快会导致黑色部分出现。如果你想知道我想要实现什么,请查看iOS 8.4或iOS 9中的音乐应用程序,在查看带有歌曲的专辑时。 - cyril

1

On viewDidLoad add:

extendedLayoutIncludesOpaqueBars = true

1
对我来说很有帮助(Swift 5):
self.navigationController?.navigationBar.isTranslucent = false
self.navigationController?.navigationBar.barTintColor = UIColor.green //change to needed color

0
以下代码帮助我在 iOS 15+ 中消除了黑色导航栏。
if #available(iOS 15, *) {
            let textAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black]
            let appearance = UINavigationBarAppearance()
            appearance.configureWithOpaqueBackground()
            appearance.titleTextAttributes = textAttributes
            appearance.backgroundColor = UIColor.white // UIColor(red: 0.0/255.0, green: 125/255.0, blue: 0.0/255.0, alpha: 1.0)
            appearance.shadowColor = .clear  //removing navigationbar 1 px bottom border.
            UINavigationBar.appearance().standardAppearance = appearance
            UINavigationBar.appearance().scrollEdgeAppearance = appearance
        }

0

以下代码适用于我,

if (@available(iOS 13.0, *)) {
     UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
     [appearance configureWithOpaqueBackground];
     [appearance setBackgroundColor:UIColor.yellowColor];
     appearance.titleTextAttributes = @{NSForegroundColorAttributeName: UIColor.whiteColor};
     controller.navigationItem.standardAppearance = appearance;
     controller.navigationItem.scrollEdgeAppearance = appearance;
     controller.navigationItem.compactAppearance = appearance;
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接