【问题标题】:Why is the UINavigationBar turning black?为什么 UINavigationBar 变黑了?
【发布时间】:2015-08-26 03:45:01
【问题描述】:

问题:

我在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 进行)之外,一切都运行良好,第一个视图控制器上的导航栏消失在黑色中,说实话看起来很难看。有什么方法可以防止/解决这个问题?

截图:

【问题讨论】:

  • 你找到答案了吗?
  • 产生的解决方案会导致许多其他问题,因为它们解决了问题,但不是 edgeForExtendedLayout 的用途。也许将应用程序窗口的背景颜色更改为适合应用程序的颜色会更好:'''self.window?.backgroundColor = .white''' in app delegate。

标签: ios swift uinavigationcontroller uinavigationbar


【解决方案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
    }
}

【讨论】:

  • 我已经尝试过了,但是导航栏消失得足够快和黑色部分出现之间没有平衡。我正在想一个解决方法
  • 余额是什么意思?因为当我在模拟器中运行上面的代码sn-p时,看起来还不错。你能用半透明动画制作一个简短的 QuickTime 记录吗?
  • 你使用什么速度?不幸的是,我不能,因为这个项目是为客户准备的。无论如何,我想说的是,速度太慢会导致导航栏在第二个视图控制器中暂时可见,两个快速导致出现黑色部分。如果您想知道我想要实现的目标,请在查看包含歌曲的专辑时查看 iOS 8.4 或 iOS 9 中的音乐应用。
【解决方案2】:

我最近遇到了一个非常相似的问题。尝试在视图控制器和self.edgesForExtendedLayout = UIRectEdgeNone 中设置self.navigationController?.navigationBar.translucent = true
故事板版本:Extended Edges - Under Top Bars

【讨论】:

  • 设置 self.edgesForExtendedLayout = UIRectEdge.None 对我有用!谢谢!
【解决方案3】:

我最近又遇到了这个问题,并在情节提要中找到了一种解决方法。如果您使用的是不透明导航栏,请确保设置了“不透明栏下”的“延伸边缘”设置。其实我只是把这三个都设置成如下图:-

【讨论】:

  • 这个解决方案适用于我刚刚出现的 iOS 15 问题。谢谢!
【解决方案4】:

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

self.window?.backgroundColor = .white

其他解决方案会导致多个内屏出现其他问题。

【讨论】:

  • 不幸的是,这会导致 iOS 13 的新模态演示样式出现一些视觉问题。如果你不使用它们,这很好用
【解决方案5】:

只需更改您的 navigationController 视图的 backgroundColor

navigationController?.view.backgroundColor = // whatever

【讨论】:

    【解决方案6】:

    在 viewDidLoad 添加:

    extendedLayoutIncludesOpaqueBars = true
    

    【讨论】:

      【解决方案7】:

      对我有其他帮助(Swift 5):

      self.navigationController?.navigationBar.isTranslucent = false
      self.navigationController?.navigationBar.barTintColor = UIColor.green //change to needed color
      

      【讨论】:

        【解决方案8】:

        下面的代码帮助我摆脱了 iOS 15+

        中的 black navigationBar
        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
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多