使其透明后如何将导航栏变回半透明

时间:2019-05-09 04:31:09

标签: swift xcode uiviewcontroller uinavigationcontroller storyboard

我的导航堆栈中有一个视图控制器,它需要有一个透明的导航栏,同时仍显示后退按钮。

我可以在viewWillAppear中使用一行代码来实现这一点:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)

但是,当我尝试返回到上一个视图时,我将背景图像设置回了nil.none,但是我失去了以前在那时的半透明效果我做到了。

我尝试在viewWillDisappear中设置以下所有选项,但似乎没有一个能让透明度恢复。无论我做什么,它看起来都是白色的。底部的阴影也消失了:

self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.navigationBar.barStyle = .default
self.navigationController?.navigationBar.backgroundColor = .none
self.navigationController?.navigationBar.setBackgroundImage(.none, for: .default)

初始导航栏:

Initial Navigation Bar

透明导航栏:

Transparent Navigation Bar

向后过渡后:

After Transitioning Back

3 个答案:

答案 0 :(得分:1)

viewWillAppear中使导航栏透明

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

然后在viewWillDisappear中将背景色设为半透明

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
    self.navigationController?.navigationBar.shadowImage = nil
    self.navigationController?.navigationBar.isTranslucent = false
}

答案 1 :(得分:0)

花了一些时间在UINavigationBar的内部进行探索之后,我确实发现了一个似乎可行的简单方法,不需要对我们之前为实现透明性而费解的标准UINavigationBar属性进行任何配置。在iOS 12.2.x上可以测试以下内容:

std::vector<std::shared_ptr<const Object>>

很明显,只要摆弄(甚至略微)未公开的内部资料,使用后果自负!

答案 2 :(得分:0)

这适用于我的应用,它需要在从透明导航栏弹出后恢复为不透明导航栏。

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