无法更改状态栏样式
Unable to change status bar style
我有一个 UIViewController
VC,它嵌入在 UINavigationController
NAV 中。 NavigationController
嵌入在 UITabBarController
TAB 中。现在,我需要我的应用程序中的每个视图控制器,但 VC 具有 .default
状态栏样式。 VC 必须具有 lightContent
状态栏样式。
为了达到预期效果我做了什么:
- 将
Info.plist
中的 View controller-based status bar appearance
设置为 YES.
- 覆盖
preferredStatusBarStyle
属性 可以由 NAV 显示的每个视图控制器,包括 VC.
- 将
setNeedsStatusBarUpdate()
放入NAV可以显示的每个视图控制器的viewDidLoad()
,包括VC.
这样的做法一无所获。
由于 TAB 在我的 Main.storyboard
中 initial view controller
并且所有内容基本上都通过它显示,我想也许我可以通过它更改状态栏。所以我在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()
}
}
然后通过NAV可以显示的每个视图控制器调用TAB的setStatusBarStyle
方法,包括VC 在 viewWillAppear
方法中。这也没有结果。有趣的是在 TAB 的 viewDidLoad
中调用 setStatusBarStyle
也什么都不做。
嗯,如果不是 TAB 阻止我改变风格,也许 NAV 是?所以我做了以下扩展:
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()
}
}
}
然后在 viewWillAppear
方法中由它的每个子视图控制器调用 NAV 的 setStatusBarStyle
方法。也不走运。
很明显我把这里的事情复杂化了。但出于某种原因,答案 poroposed and here 对我不起作用。我在这里迷路了。请帮忙。
Now, I need every view controller in my app but VC to have .default
status bar style. VC has to have lightContent status bar style.
对我来说,你只是让自己对你的方法感到头疼。这是我的看法,它会容易得多。
为所有想要拥有灯光状态栏的视图控制器创建一个 LightBaseViewController: UIViewController
或任何你想要的基础 class 名称,并将其放入 LightBaseViewController
的 viewWillAppear
:
UIApplication.shared.statusBarStyle = .lightContent
然后当然做一个DarkBaseViewController
并通过使statusBarStyle
属性回到默认状态使状态栏变暗。
UIApplication.shared.statusBarStyle = .default
Subclass 深色或浅色基础视图控制器。
最后,在您的 info.plist 中将此 属性 设置为 NO:
View controller-based status bar appearance
希望这对您有所帮助。
我有一个 UIViewController
VC,它嵌入在 UINavigationController
NAV 中。 NavigationController
嵌入在 UITabBarController
TAB 中。现在,我需要我的应用程序中的每个视图控制器,但 VC 具有 .default
状态栏样式。 VC 必须具有 lightContent
状态栏样式。
为了达到预期效果我做了什么:
- 将
Info.plist
中的View controller-based status bar appearance
设置为 YES. - 覆盖
preferredStatusBarStyle
属性 可以由 NAV 显示的每个视图控制器,包括 VC. - 将
setNeedsStatusBarUpdate()
放入NAV可以显示的每个视图控制器的viewDidLoad()
,包括VC.
这样的做法一无所获。
由于 TAB 在我的 Main.storyboard
中 initial view controller
并且所有内容基本上都通过它显示,我想也许我可以通过它更改状态栏。所以我在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()
}
}
然后通过NAV可以显示的每个视图控制器调用TAB的setStatusBarStyle
方法,包括VC 在 viewWillAppear
方法中。这也没有结果。有趣的是在 TAB 的 viewDidLoad
中调用 setStatusBarStyle
也什么都不做。
嗯,如果不是 TAB 阻止我改变风格,也许 NAV 是?所以我做了以下扩展:
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()
}
}
}
然后在 viewWillAppear
方法中由它的每个子视图控制器调用 NAV 的 setStatusBarStyle
方法。也不走运。
很明显我把这里的事情复杂化了。但出于某种原因,答案 poroposed
Now, I need every view controller in my app but VC to have .default status bar style. VC has to have lightContent status bar style.
对我来说,你只是让自己对你的方法感到头疼。这是我的看法,它会容易得多。
为所有想要拥有灯光状态栏的视图控制器创建一个
LightBaseViewController: UIViewController
或任何你想要的基础 class 名称,并将其放入LightBaseViewController
的viewWillAppear
:UIApplication.shared.statusBarStyle = .lightContent
然后当然做一个
DarkBaseViewController
并通过使statusBarStyle
属性回到默认状态使状态栏变暗。UIApplication.shared.statusBarStyle = .default
Subclass 深色或浅色基础视图控制器。
最后,在您的 info.plist 中将此 属性 设置为 NO:
View controller-based status bar appearance
希望这对您有所帮助。