我将while
backgroundColor NavigationBar
和dark
textColor用于statusBar
,但是当用户将主题iOS更改为深色时,我的textColor statusBar
更改为while
,而while
我的backgroundColor上NavigationBar
则看不到任何东西。如何为我的应用禁用此更改?
UINavigationController
是UIViewController
(谁知道的)的子类!
因此,在呈现嵌入在导航控制器中的视图控制器时,您并不是真正在呈现嵌入式视图控制器。您正在展示导航控制器!UINavigationController
,作为的子类UIViewController
继承preferredStatusBarStyle
和childForStatusBarStyle
,您可以根据需要设置。
以下任何一种方法都可以工作:
完全退出黑暗模式
在中info.plist
,添加以下属性:
键- UIUserInterfaceStyle
(又名“用户界面样式”)
价值-轻
preferredStatusBarStyle
在内部覆盖UINavigationController
preferredStatusBarStyle
(doc)-视图控制器的首选状态栏样式
子类或扩展 UINavigationController
class MyNavigationController: UINavigationController { override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } }
要么
extension UINavigationController { open override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } }
childForStatusBarStyle
在内部覆盖UINavigationController
childForStatusBarStyle
(doc)-在系统需要视图控制器来确定状态栏样式时调用
根据Apple的文件,
“如果您的容器视图控制器从其子视图控制器之一派生其状态栏样式,请[覆盖此属性]并返回该子视图控制器。如果您返回nil或不重写此方法,则使用self的状态栏样式如果此方法的返回值发生更改,请调用setNeedsStatusBarAppearanceUpdate()方法。”
换句话说,如果您未在此处实现解决方案3,则系统将退回到上述解决方案2。
子类或扩展 UINavigationController
class MyNavigationController: UINavigationController { override var childForStatusBarStyle: UIViewController? { topViewController } }
要么
extension UINavigationController { open override var childForStatusBarStyle: UIViewController? { topViewController } }
您可以返回上面想要的任何视图控制器。我建议以下之一:
topViewController
(of UINavigationController
)(doc)-导航堆栈顶部的视图控制器
visibleViewController
(of UINavigationController
)(doc)-与导航界面中当前可见视图相关联的视图控制器(提示:这可以包括“以模态形式显示在导航控制器本身顶部的视图控制器”)
注意:如果决定子类化UINavigationController
,请记住通过IB中的身份检查器将该类应用于导航控制器。
PS我的代码使用Swift 5.1语法
如果您将UIViewControllerBasedStatusBarAppearance
应用程序的密钥设置info.plist
为YES
,则可以在当前显示的视图控制器中覆盖状态栏样式:
override var preferredStatusBarStyle: UIStatusBarStyle { if #available(iOS 13, *) { return .darkContent } else { return .default } }