Xcode 9.3中重写代码后状态栏颜色仍无法修改
嘿,我太懂这种头疼的情况了!你写的override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }代码本身没问题,但为啥只有初始视图控制器生效?大概率是因为你的其他VC被**导航控制器(UINavigationController)或者标签栏控制器(UITabBarController)**这类容器控制器包裹了——系统默认会优先采用容器控制器的状态栏样式,直接忽略子VC的设置。
下面给你几个靠谱的解决办法,按需选就行:
方法1:直接设置导航栏样式(简单快捷)
如果你的场景里所有VC都需要.lightContent的状态栏,那不用改子类,直接在导航控制器初始化时或者子VC里设置导航栏的barStyle:
// 在子VC的viewDidLoad里或者导航控制器初始化代码中 navigationController?.navigationBar.barStyle = .black
当导航栏barStyle设为.black时,系统会自动把状态栏文字改成白色(也就是.lightContent),一步到位。
方法2:自定义容器控制器子类(灵活适配不同VC)
如果你的APP里不同VC需要不同的状态栏样式,那得给容器控制器写个自定义子类,让它“转发”子VC的状态栏设置:
针对UINavigationController的情况
创建一个自定义导航控制器类:
class CustomNavController: UINavigationController { override var preferredStatusBarStyle: UIStatusBarStyle { // 优先返回当前顶层VC的状态栏样式,默认用系统样式兜底 return topViewController?.preferredStatusBarStyle ?? .default } }
然后在Storyboard或者代码里,把原来的UINavigationController替换成这个CustomNavController,之后每个子VC里的preferredStatusBarStyle设置就会生效了。
针对UITabBarController的情况
同理,自定义标签栏控制器类:
class CustomTabBarController: UITabBarController { override var preferredStatusBarStyle: UIStatusBarStyle { // 返回当前选中VC的状态栏样式,默认用系统样式兜底 return selectedViewController?.preferredStatusBarStyle ?? .default } }
替换原有的UITabBarController即可。
关键前提检查
别忘了确认你的Info.plist里的View controller-based status bar appearance选项设置为YES(布尔值)。如果这个选项是NO,系统会忽略所有VC的preferredStatusBarStyle设置,直接用Info.plist里的Status bar style配置,这也是很多人踩坑的点!
按照上面的步骤操作,你的状态栏样式应该就能在所有VC里正常生效啦~
内容的提问来源于stack exchange,提问作者dmo

