Swift - 如何在 2 个视图控制器之间导航时删除黑色导航栏

Posted

技术标签:

【中文标题】Swift - 如何在 2 个视图控制器之间导航时删除黑色导航栏【英文标题】:Swift - how to remove black navigation bar when navigate between 2 view controller 【发布时间】:2017-01-05 03:35:09 【问题描述】:

我的应用程序目前包含 2 个 UIViewController VC1 到 VC2。

在 VC1 中是主屏幕,UINavigationBar 上有一个橙色渐变图像

在VC2中有一个半透明的UINavigationBar并在UINavigationBar上设置UIImage

但是当在这两个视图控制器之间导航时,它会出现一个黑色的导航栏,直到转换完成。我已经尝试设置setNavigationBarHidden,但我不想隐藏导航栏,那么如何删除黑色导航栏?

像这样-

在 VC1 中

override func viewWillAppear(animated: Bool)         
    if let navController = self.navigationController 

        UIGraphicsBeginImageContext(gradientLayer.frame.size)
        gradientLayer.renderInContext(UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        UIView.animateWithDuration(0.3, animations: 
            navController.navigationBar.setBackgroundImage(image, forBarMetrics: .Default)
            navController.navigationBar.translucent = false
        )
    

在 VC2 中

override func viewWillAppear(animated: Bool)  
    UIView.animateWithDuration(0.3, animations: 
            self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
            self.navigationController?.navigationBar.shadowImage = UIImage()
            self.navigationController?.navigationBar.translucent = true
        )



override func viewWillDisappear(animated: Bool)         
    if let navController = self.navigationController 

        UIGraphicsBeginImageContext(gradientLayer.frame.size)
        gradientLayer.renderInContext(UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        UIView.animateWithDuration(0.3, animations: 
            navController.navigationBar.setBackgroundImage(image, forBarMetrics: .Default)
            navController.navigationBar.translucent = false
        )
    

【问题讨论】:

查看此帖***.com/questions/39835420/… 【参考方案1】:

如果你想隐藏导航栏而不是黑色的过渡。 (在第二屏)

Swift4:

override func viewWillAppear(_ animated: Bool) 
  self.navigationController?.setNavigationBarHidden(true, animated: true)  
  

【讨论】:

请提供更具体的回答 谢谢你!有效。我使用了导航栏的 isHidden 属性,但不起作用。【参考方案2】:

Swift 5 简单方法

//MARK:- Only use this code where you want to hide the navigation bar 
self.navigationController?.setNavigationBarHidden(true, animated: true)

【讨论】:

【参考方案3】:

这取决于您如何设置Navigation Bar 的颜色。如果你在下一个视图的viewDidLoad 中设置它,那么当你按下一个按钮进行转换时,它会在视图推动下一个控制器之前发生变化。

您希望它在什么时间更改?

对于之前: viewDidLoadviewWillAppear

之后: viewDidAppear

并确保您没有在viewWillDisappear 上设置它或 imageView,因此它不会是黑色的。

【讨论】:

我是这样写的:在VC1中,viewWillAppear设置橙色渐变导航栏。如果移动到 VC2,viewWillAppear(VC2) 将图像设置为导航栏,当按下返回按钮时,viewWillDisappear 将导航栏设置为橙色渐变。【参考方案4】:

您需要直接设置NavigationBar 颜色,例如:navigationController.navigationBar.barTintColor = .orange

【讨论】:

我已经在 viewWillDisappear 中设置了导航栏的颜色,但仍然无法正常工作... 或许可以发布您的代码,以便我们更好地了解发生了什么?【参考方案5】:

对象 C:

self.extendedLayoutIncludesOpaqueBars = true;

斯威夫特:

extendedLayoutIncludesOpaqueBars = true

【讨论】:

以上是关于Swift - 如何在 2 个视图控制器之间导航时删除黑色导航栏的主要内容,如果未能解决你的问题,请参考以下文章

Swift:嵌入在导航控制器中的视图之间的自定义segue

如何在使用当前模式打开另一个视图控制器后设置导航项的标题 - Swift

Swift 仅在使用导航控制器首次启动时显示视图

如何在 Swift 中的视图之间传递数据

使用Swift 3单击collectionView单元格内的项目时如何导航另一个视图控制器

在 Xcode 6 和 Swift 中的视图之间进行类似 Snapchat 的滑动导航)