问题
我有一个应用程序,有不同的颜色导航条,为不同的流量。一些导航条有一个明亮的背景,需要黑色状态栏文本。另一些则有一个较暗的导航栏,需要白色状态栏文本。
作为迁移到iOS15的一部分,我更新了我正在开发的一个应用程序,使用UINavigationBarAppearance
方法进行导航栏的样式设计。除了状态栏的颜色之外,我还能像以前一样把所有的东西都样式化。
以前,我一直在使用导航栏上的barStyle
属性来设置状态栏文本颜色。
navigationBar.barStyle = .black
在使用UINavigationBarAppearance
时,这似乎不起作用。
样本代码
旧造型方法
override func viewDidLoad() {
super.viewDidLoad()
let navigationBar = navigationController?.navigationBar
// Style using old approach
navigationBar?.barTintColor = UIColor.purple
navigationBar?.titleTextAttributes = [.foregroundColor: UIColor.white]
// Use barStyle to set status bar text color to white
// This only work when using the old styling approach
navigationBar?.barStyle = .black
}
新造型方法
override func viewDidLoad() {
super.viewDidLoad()
let navigationBar = navigationController?.navigationBar
// Style nav bar using new Appearance API
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.backgroundColor = UIColor.purple
navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
navigationBar?.standardAppearance = navBarAppearance
navigationBar?.scrollEdgeAppearance = navBarAppearance
// Use barStyle to set status bar text color to white
// This only work when using the old styling approach
navigationBar?.barStyle = .black
}
备选方案
在导航栏上强制暗/光模式
可以使用属性overrideUserInterfaceStyle
使状态栏文本变为白色。若要使状态栏文本变为白色,请设置
navigationBar.overrideUserInterfaceStyle = dark
然而,这导致菜单从按钮在导航栏在黑暗模式下,这不是我想要的。
子类UINavigationController
我想我也可以子类UINavigationController,并显式地重写preferredStatusBarStyle
以强制使用黑白文本。
必须在任何地方使用子类,我们就可以制作新的导航控制器来指定状态栏文本颜色,这似乎有点极端。
还有别的吗?
我不确定是否有更好的方法?
发布于 2021-12-17 04:17:34
我能够使用以下方法将状态栏文本设置为白色:
navController.navigationBar.overrideUserInterfaceStyle = .dark
请注意,bencallis,这个问题的创建者,警告说,这个解决方案“导致菜单从按钮在导航栏在黑暗模式,这不是我想要的”。我不使用这样的菜单,所以这对我来说不是问题。也许这也不适合你。
发布于 2021-11-17 04:48:24
我在barStyle和overrideUserInterfaceStyle中同时使用UINavigationBarAppearance
// statusBarStyle is .black or .default
if case .black = statusBarStyle {
navigationController?.navigationBar.overrideUserInterfaceStyle = .dark
} else {
navigationController?.navigationBar.overrideUserInterfaceStyle = .light
}
navigationController?.navigationBar.barStyle = statusBarStyle
看看它是如何工作的:
https://stackoverflow.com/questions/69404806
复制相似问题