我需要根据背景颜色(UINavigationController
自动执行的操作)在每个视图控制器上更新状态栏样式。
尝试了stackoverflow中描述的所有选项(View controller-based status bar appearance
中的info.plist
设置为 YES ),但没有一个对我有用。
我正在使用针对iOS 12的Xcode 10 beta 6和Swift 4.2。
答案 0 :(得分:23)
Swift 4.2,iOS 12
现在需要在pernmo
中将 View controller-based status bar appearance
设置为YES
,因为UIKit不再希望我们通过info.plist
编辑状态栏样式-现在可以查看状态栏样式-基于控制器。
然后,如果要在应用程序级别应用更改,只需在适当的容器视图控制器(最好是根目录)中覆盖UIApplication.shared
...
preferredStatusBarStyle
...这将传播到所有视图控制器。而且,如果您要针对每个View Controller编辑状态栏样式,请针对每个View Controller应用此替代。
如果状态栏样式在运行时发生变化,则需要调用override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
(从容器/根视图控制器或特定视图控制器中的任何位置),否则不需要。
答案 1 :(得分:18)
在{{1}中将View controller-based status bar appearance
设置为NO
,并在每个视图控制器中覆盖info.plist
,如下所示:
preferredStatusBarStyle
然后在视图控制器中调用override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
(例如,在setNeedsStatusBarAppearanceUpdate()
中)。
答案 2 :(得分:6)
如果您将View controller-based status bar appearance
中的info.plist
设置为 YES ,并且您的视图控制器已嵌入UINavigationController
中,则导航控制器将负责更新栏样式(通过navigationController.navigationBar.barStyle
)和preferredStatusBarStyle
属性将被忽略
答案 3 :(得分:3)
我有Xcode 10.2,并且发现与您所做的一样,将info.plist中基于View控制器的状态栏外观设置为“ YES”根本不会更改状态栏样式。
但是,我确实发现,更改info.plist文件中的两个键将完成将状态栏更改为亮或暗的所有工作,而无需任何其他编码。
这是我为自己修复的工作
将鼠标悬停在info.plist文件的第一行“信息属性列表”上时,将出现一个小的圆形“ +”按钮。单击此按钮并滚动浏览各项,直到找到以下键。
基于控制器的状态栏外观 [将此值设置为否
状态栏样式 [将此值设置为 UIStatusBarStyleLightContent
注意: 在值列表中找不到UIStatusBarStyleLightContent作为可选项,必须在值框中键入该值。
希望这对您或其他寻求此问题答案的人有帮助。
答案 4 :(得分:1)
最后,什么对我有用:
添加到Info.plist:
View controller-based status bar appearance : YES
对于每个ViewController,分别添加到viewDidLoad()和viewDidAppear():
self.setNeedsStatusBarAppearanceUpdate()
a)对于深色状态栏,添加到ViewController:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .default
}
b)对于白色状态栏,添加到ViewController:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
答案 5 :(得分:1)
如果您被包装在导航控制器中,则将需要以下内容:
final class LightNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
答案 6 :(得分:-1)
override func viewDidLoad(){
super.viewDidLoad()
navigationController?.navigationBar.barStyle = .default
}
override var prefersStatusBarHidden: Bool {
return true
}
我也在同一屏幕上应用了滚动视图,通过此代码,它可以解决状态栏问题。