我需要根据背景颜色更新每个视图控制器上的状态栏样式(就像UINavigationController
自动处理的那样)。
已经尝试了在stackoverflow上描述的所有选项(在info.plist
中将View controller-based status bar appearance
设置为 YES ),但对我都不起作用。
我正在使用Xcode 10 beta 6和Swift 4.2,针对iOS 12。
我需要根据背景颜色更新每个视图控制器上的状态栏样式(就像UINavigationController
自动处理的那样)。
已经尝试了在stackoverflow上描述的所有选项(在info.plist
中将View controller-based status bar appearance
设置为 YES ),但对我都不起作用。
我正在使用Xcode 10 beta 6和Swift 4.2,针对iOS 12。
Swift 4+, iOS 12+
View controller-based status bar appearance
现在需要在info.plist
中设置为YES
,因为UIKit不再希望我们通过UIApplication.shared
编辑状态栏样式。现在状态栏样式是基于视图控制器的。
然后,如果您想要在应用程序级别应用更改,请在适当的容器视图控制器中(最好是根控制器)重写preferredStatusBarStyle
...
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
...并且这将传播到其下面的所有视图控制器。如果您想要在每个视图控制器中编辑状态栏样式,则对每个视图控制器应用此覆盖。
如果状态栏样式在运行时发生更改,则需要从容器/根视图控制器或该特定视图控制器的任何位置调用setNeedsStatusBarAppearanceUpdate()
,否则不需要。
childViewControllerForStatusBarStyle
方法并返回您想要接管控制的控制器。例如,tabbar返回selectedViewController
(navigationvc),而navigationvc返回其topViewController
。 - Jiangshi Fresh在 info.plist
中把 View controller-based status bar appearance
设置为 NO
,然后在每个视图控制器中重写 preferredStatusBarStyle
:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
在您的视图控制器中调用setNeedsStatusBarAppearanceUpdate()
(例如在viewDidLoad()
中)。
self.setNeedsStatusBarAppearanceUpdate()
? - ielyamani-[UIViewController prefferedStatusBarStyle]
”。你知道怎么做吗?请注意,出现了另一个错误:“属性不覆盖其超类的任何属性”,而我正在使用override var prefferedStatusBarStyle ...
。 - Tomáš PánikmyViewController.modalPresentationCapturesStatusBarAppearance = true
。除非我这样做了,否则我无法使此答案起作用。info.plist
键已设置为yes
。 - Chris如果你在info.plist
中设置了View controller-based status bar appearance
为YES,并且你的视图控制器嵌入到UINavigationController
中,则导航控制器将负责更新栏样式(通过navigationController.navigationBar.barStyle
),preferredStatusBarStyle
属性将被忽略。
final class LightNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
override func viewDidLoad(){
super.viewDidLoad()
navigationController?.navigationBar.barStyle = .default
}
override var prefersStatusBarHidden: Bool {
return true
}
我在同一屏幕上应用了滚动视图,通过这段代码能够解决状态栏问题。