我的导航栏有一个white
backgroundColor
,而我的状态栏使用了dark
textColor
。当用户将iOS主题更改为暗模式时,状态栏将在white
背景上更改为white
文本。结果,我什么也看不到。如何为我的应用禁用此更改?
UINavigationController
是UIViewController
的子类(谁知道🙃)!UINavigationController
作为UIViewController
的子类,继承了preferredStatusBarStyle
和childForStatusBarStyle
,您可以根据需要设置它们。以下任何一种方法都可以使用:
info.plist
中,添加以下属性:UIUserInterfaceStyle
(又名“用户界面样式”)preferredStatusBarStyle
中覆盖UINavigationController
[preferredStatusBarStyle
(doc)-视图控制器的首选状态栏样式]
UINavigationController
class MyNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
OR
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
childForStatusBarStyle
中覆盖UINavigationController
[childForStatusBarStyle
(doc)-当系统需要视图控制器用于确定状态栏样式时调用
换句话说,如果您不在此处实现解决方案3,则系统将退回到上述解决方案2。- 子类或扩展
UINavigationController
class MyNavigationController: UINavigationController { override var childForStatusBarStyle: UIViewController? { topViewController } }
OR
extension UINavigationController { open override var childForStatusBarStyle: UIViewController? { topViewController } }
您可以返回上面想要的任何视图控制器。我建议以下之一:[
topViewController
(UINavigationController
的)(doc)-导航堆栈顶部的视图控制器[
visibleViewController
(ofUINavigationController
)(doc)-与导航界面中当前可见的视图关联的视图控制器(提示:这可以包括“以视图方式显示在导航控制器顶部的视图控制器本身“)
UINavigationController
,请记住通过IB中的身份检查器将该类应用于您的导航控制器。P.S。我的代码使用Swift 5.1语法😎
override var preferredStatusBarStyle: UIStatusBarStyle {
if #available(iOS 13, *) {
return .darkContent
} else {
return .default
}
}
并调用setNeedsStatusBarAppearanceUpdate()方法
extension UIStatusBarStyle {
static var black: UIStatusBarStyle {
if #available(iOS 13.0, *) {
return .darkContent
}
return .default
}
}
然后您可以轻松地在ViewControllers中使用:
override var preferredStatusBarStyle: UIStatusBarStyle {
.black
}
if #available(iOS 13.0, *) {
navigationController?.navigationBar.overrideUserInterfaceStyle = .light
}
UINavigationController
,请像这样在扩展名(或您自己的子类)中覆盖preferredStatusBarStyle
(仅在视图控制器中覆盖preferredStatusBarStyle
无效):extension UINavigationController {
override open var preferredStatusBarStyle: UIStatusBarStyle {
guard #available(iOS 13, *) else {
return .default
}
return .darkContent
}
}
并且正如弗兰克所说,必须在UIViewControllerBasedStatusBarAppearance
中将YES
设置为info.plist
@interface MyNavigationController : UINavigationController
...
@end
@implementation MyNavigationController
...
- (UIViewController *)childViewControllerForStatusBarStyle
{
return self.topViewController;
}
...
@end
之后,您需要为每个控制器添加功能preferredStatusBarStyle。
第二个选项是为所有控制器定义preferredStatusBarStyle函数。但是此函数不应位于根控制器中,而应位于UINavigationController的后代类中。
@interface MyNavigationController : UINavigationController ... @end @implementation MyNavigationController ... - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } ... @end
但是,即使在这种情况下,也必须为所有隐藏导航栏的控制器(如果有的话)定义函数preferredStatusBarStyle。
func toggleLight() {
self.navigationBar.barTintColor = AppColors.White
isDarkStyle = false
setNeedsStatusBarAppearanceUpdate()
}
这里是最重要的部分
override var preferredStatusBarStyle: UIStatusBarStyle {
if #available(iOS 13.0, *) {
return isDarkStyle ? .lightContent : .darkContent
}
return isDarkStyle ? .lightContent : .default
}
Where isDarkStyle表示导航栏背景颜色为深色或浅色。如果颜色较暗,则文本(内容)应为浅色;如果颜色较浅,则文本(内容)应为默认色,或从iOS 13开始为黑暗。
总结:
.lightContent, .darkContent
显示独立于暗模式,如预期的那样。虽然.default
容易受到黑暗模式更改的影响!