如何在一个视图控制器中使UINavigationController透明?

12

我想让一个ViewController中的NavigationBar变成透明。但是,在单个ViewController中更改NavigationBar后,整个navigationController都变成透明,几秒钟后会崩溃。以下是我的代码块:

override func viewWillAppear(animated: Bool) {
        self.navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.navigationController?.navigationBar.translucent = true
        self.navigationController!.view.backgroundColor = UIColor.clearColor()
    }



override func viewDidDisappear(animated: Bool) {
        self.navigationController!.navigationBar.setBackgroundImage(nil, forBarMetrics: UIBarMetrics.Default)
        self.navigationController?.navigationBar.shadowImage = nil
        self.navigationController?.navigationBar.translucent = true

    }

它在该行崩溃

self.navigationController!.navigationBar.setBackgroundImage(nil, forBarMetrics: UIBarMetrics.Default)

1
你可以为特定的视图控制器创建自定义导航控制器。 - Jagveer Singh
请再澄清一下。谢谢。 - Isha Balla
在那一行崩溃意味着你的导航控制器为空,你确定没有其他将其设置为空的代码吗? - paulvs
因为将nil设置在imageView的位置而导致崩溃。 - Jigar Tarsariya
相同的代码适用于UITableViewController。唯一的区别是我必须在viewDidDisppear方法中将TableView的委托设置为nil。我找不到UIViewController的解决方法。 - Isha Balla
4个回答

7
我们可以通过以下方式实现这个要求:
在我们想要清除NavigationBar颜色的UIViewController中,我们需要在viewDidLoad、viewWillAppear和viewWillDisappear方法中编写以下代码。
在viewDidLoad方法中,为了获得更好的外观效果,如果我们没有写入代码片段,则navigationBar颜色将在视图显示后更改。
override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.isTranslucent = true
}


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.isTranslucent = true
    self.navigationController?.navigationBar.barTintColor = UIColor.clear
    self.navigationController?.navigationBar.backgroundColor = UIColor.clear
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
    self.navigationController?.navigationBar.shadowImage = nil
    self.navigationController?.navigationBar.isTranslucent = true
}

当我们在同一个UINavigationController上移动到其他屏幕(推送另一个UIViewController)时,需要设置barTintColor,否则它会显示为黑色。


3

Swift 4

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.view.backgroundColor = UIColor.clear
self.navigationController?.navigationBar.backgroundColor = UIColor.clear

你的解决方案中有一些强制解包,但对我来说你的解决方案是有效的。 - Rool Paap
适用于Swift 5.x。将其包装在UINavigationController扩展中,以便更轻松地调用。 - Mark

3

尝试以下代码使Swift中的导航栏透明:

    self.navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.translucent = true
    self.navigationController!.view.backgroundColor = UIColor.clearColor()
    self.navigationController?.navigationBar.backgroundColor = UIColor.clearColor()

希望这段代码能帮到你。谢谢。

2
viewWillAppear 中,
  self.navigationController!.navigationBar.backgroundColor = UIColor.clearColor()

viewWillDisappear方法中

  self.navigationController!.navigationBar.backgroundColor = UIColor(red: (247.0 / 255.0), green: (247.0 / 255.0), blue: (247.0 / 255.0), alpha: 1)  // this is default bar color you can set your desired color if you are using custom color for navigation bar

希望这能帮到你:)

1
建议将其放在 viewWillDisappear 中,以避免轻微的延迟。虽然同意这种方法。 - Sami
完成!将didaopear更改为willappear。 - Ketan Parmar
1
一个小问题是,将backgroundColor设置为clear会使导航栏变黑。 - Anjan Biswas

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