我有一个奇怪的情况,我不能为我的生活得到一个应用程序开始UINavigationBar
设置为透明黑色。该应用包含UINavigationController
,其中UIPageViewController
为根。这些是在应用程序启动时从故事板加载的。
应用程序运行,UINavigationBar显示为不透明。一旦我开始拖动UIPageViewController
,它就会触发某种重绘,UINavigationBar
会根据需要变得透明。
我尝试了几种不同的方法将UINavigationBar
设置为透明黑色,但没有一种方法产生与描述不同的行为:
Info.plist
:<key>UIStatusBarTintParameters</key>
<dict>
<key>UINavigationBar</key>
<dict>
<key>Style</key>
<string>UIBarStyleBlack</string>
<key>Translucent</key>
<true/>
</dict>
</dict>
我在UINavigationBar
的AppDelegate中设置didFinishLaunchingWithOptions
外观:
UINavigationBar.appearance().tintColor = UIColor.black
UINavigationBar.appearance().isTranslucent = true
我已将[{1}}子类化,并在UINavigationController
中设置了NavigationBar属性:
viewDidLoad()
我在navigationBar.barStyle = .black
navigationBar.isTranslucent = true
navigationBar.setNeedsDisplay()
(导航控制器的根视图控制器)的viewDidLoad()
中设置了NavigationBar属性:
UIPageViewController
我还尝试打开/关闭导航栏以触发刷新
navigationController!.navigationBar.barStyle = .black
navigationController!.navigationBar.isTranslucent = true
navigationController!.navigationBar.setNeedsDisplay()
navigationController!.isNavigationBarHidden = true
navigationController!.isNavigationBarHidden = false
的子视图控制器的viewDidLoad()
中设置了导航栏属性。在每一种情况下,我都会得到相同的行为:不透明条直到我触摸屏幕并开始拖动,此时它会切换到透明。
奇怪的是,设置导航栏的其他属性(例如UIPageViewController
,titleTextAttributes
和leftButtonItem
的工作正常,并且会立即反映更改。
答案 0 :(得分:0)
我对 Swift3
提出了类似要求,并以此方式实现了这一目标:
在包含PageViewController
的视图控制器中,在viewDidLoad()
func makeNavigationTranslucent() -> Void {
self.navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.view.backgroundColor = UIColor.clear
self.navigationController?.navigationBar.backgroundColor = UIColor.init(colorLiteralRed: 0.5, green: 0.5, blue: 0.5, alpha: 0.9)
}
注意:将navigationBar.backgroundColor
更改为您想要的那个。
在storyboard
选择您的控制器并在属性检查器下,将模拟指标标题设置为导航半透明栏。请参阅下图:
答案 1 :(得分:0)
这是一种hacky解决方案,但我设法通过隐藏默认导航栏并在其上添加新的导航栏来实现它。在页面视图中,控制器viewDidLoad()
功能:
navigationController!.isNavigationBarHidden = true
let newNavBar = UINavigationBar()
newNavBar.barStyle = .black
newNavBar.isTranslucent = true
newNavBar.titleTextAttributes = [NSFontAttributeName: UIFont.mainFontThin(24),
NSForegroundColorAttributeName: UIColor.white]
// etc...
navigationController!.view.addSubview(newNavBar)
newNavBar.frame = CGRect(
x:0, y:0,
width:navigationController!.view.bounds.width,
height:navigationController!.navigationBar.frame.height + UIApplication.shared.statusBarFrame.height
)
newNavBar.pushItem(navigationItem, animated: false)
这显示了我们想要的半透明导航栏,但在半透明导航栏下应用状态栏为黑色仍然是一个小问题。和以前一样,拖动手指后状态栏会更新为透明。我不确定如何解决此问题,添加对setNeedsStatusBarUpdate()
的调用没有帮助。所以这是部分修复。