我有一个UIViewController
VC ,它嵌入UINavigationController
NAV 。 NavigationController
嵌入在UITabBarController
TAB 中。现在,我需要在我的应用程序中的每个视图控制器,但 VC 具有.default
状态栏样式。 VC 必须具有lightContent
状态栏样式。
我为实现预期效果所做的工作:
View controller-based status bar appearance
中的Info.plist
设置为是。preferredStatusBarStyle
属性,包括 VC 。setNeedsStatusBarUpdate()
放入每个视图控制器的viewDidLoad()
,可以通过 NAV 显示,包括 VC 。这种方法没有任何结果。
由于我的initial view controller
中的 TAB 是Main.storyboard
,并且所有内容都是通过它显示的,我想也许我可以通过它更改状态栏。所以我在 TAB 描述中写了以下内容:
// MARK: Status bar
///
private var requiredStatusBarStyle: UIStatusBarStyle = .default
//
override var preferredStatusBarStyle: UIStatusBarStyle { get { return self.requiredStatusBarStyle } }
///
func setStatusBarStyle(_ style: UIStatusBarStyle)
{
requiredStatusBarStyle = style
DispatchQueue.main.async
{
self.setNeedsStatusBarAppearanceUpdate()
}
}
然后在每个视图控制器中调用 TAB 的setStatusBarStyle
方法, NAV 包括 VC 在{{ 1}}方法。这也没有结果。有趣的是在 TAB中调用viewWillAppear
setStatusBarStyle
也没有做任何事情。
好吧,如果它不是 TAB 阻止我改变风格,那么 NAV 可能是?所以我做了以下扩展:
viewDidLoad
然后在struct UINavigationControllerExtensionKeys
{
static var UIStatusBarStyleKey: UInt8 = 0
}
extension UINavigationController
{
private var requiredStatusBarStyle: UIStatusBarStyle
{
get
{
guard let style = objc_getAssociatedObject(self, &UINavigationControllerExtensionKeys.UIStatusBarStyleKey) as? UIStatusBarStyle else
{
return .default
}
return style
}
set (style)
{
objc_setAssociatedObject(self, &UINavigationControllerExtensionKeys.UIStatusBarStyleKey, style, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
open override var preferredStatusBarStyle: UIStatusBarStyle { get { return self.requiredStatusBarStyle } }
func setStatusBarStyle(_ style: UIStatusBarStyle)
{
requiredStatusBarStyle = style
DispatchQueue.main.async
{
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
方法中由其每个子视图控制器调用 NAV 的setStatusBarStyle
方法。也没有运气。
答案 0 :(得分:2)
现在,我需要应用程序中的每个视图控制器,但VC需要.default 状态栏样式。 VC必须具有lightContent状态栏样式。
对我来说,你只是让自己头疼你的方法。这是我的看法,它会更容易。
为想要拥有灯光状态栏的所有viewControllers创建一个LightBaseViewController: UIViewController
或任何基类名称,并将其放在LightBaseViewController
的{{1}}中:
viewWillAppear
然后当然会创建UIApplication.shared.statusBarStyle = .lightContent
并通过将DarkBaseViewController
属性恢复为默认值来使状态栏变暗。
statusBarStyle
子类或暗基视图控制器。
最后,在info.plist中将此属性设置为NO:
UIApplication.shared.statusBarStyle = .default
希望这有帮助。