最近在设置某些页面状态栏颜色的时候出现了属性不响应的问题swift
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
复制代码
依稀记得是直接重写preferredStatusBarStyle: UIStatusBarStyle这个属性,而后将info.plist
中的View controller-based status bar appearance
设置为NO
bash
而后我就开始各类搜索和尝试,发现若是是自定义的UINavigationController,如今须要重写另一个属性app
/// 重写此方法让 preferredStatusBarStyle 响应
override var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
复制代码
为何要重写这个东西呢? 由于这两个方法默认返回值是
nil
也就是当咱们调用setNeedsStatusBarAppearanceUpdate
的时候,系统会调用Container
(容器控制器)的preferredStatusBarStyle
这个方法(window?.rootViewControlle
r的preferred
的方法,通常咱们用UINavigationController
或者UITabBarController
来作Container
),也就是根本不会调用子控制器(咱们所看到的UIViewcontroller
)的preferredStatusBarStyle
方法。 这个时候childForStatusBarHidden和childForStatusBarStyle
两个方法就派上用场了。ide
而且将info.plist
中的View controller-based status bar appearance
设置为YES
测试
基本看到的文章都是把另一个属性也重写,关于隐藏的ui
override var childForStatusBarHidden: UIViewController? {
return self.topViewController
}
复制代码
可是我测试了一下返现不用写,隐藏属性能够直接生效spa
override var prefersStatusBarHidden: Bool {
return true
}
复制代码
看到说若是是有自定义UITabBarController的,须要重写这个属性。可是我没有尝试,放出来给个提醒好了code
override var childViewControllerForStatusBarStyle: UIViewController? {
return self.selectedViewController
}
复制代码
最后我尝试将info.plist
中的View controller-based status bar appearance
直接删掉,发现也是能够的,可能这个属性默认为YES。cdn
override var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
复制代码
/// 重写此方法让 preferredStatusBarStyle 响应
override var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
复制代码