Swift 5, iOS 12
这里的绝大多数答案都很有帮助,但是对于我而言并没有立即解决问题。我有一个嵌套结构(根VC > 标签栏VC > 导航VC > 特定页面VC),我希望其中一个推出的页面VC可以改变状态栏颜色。
在页面VC中设置navigationBar.barStyle
对我来说毫无作用,可能是因为导航VC不是顶级VC。在页面VC中设置preferredStatusBarStyle
也不起作用(尽管如果我在根VC中覆盖此属性,它确实起作用)。
@kelin的回答指引了我正确的方向。 childForStatusBarStyle
有助于指定应检查哪个子VC以获得适当的样式。以下是我采取的步骤:
步骤1:为我VC层次结构中的所有VC实现childForStatusBarHidden
。
例如对于根VC:
override var childForStatusBarStyle: UIViewController? {
return currentViewController
}
针对选项卡VC
override var childForStatusBarStyle: UIViewController? {
return selectedViewController
}
为了导航视图控制器
override var childForStatusBarStyle: UIViewController? {
return topViewController
}
步骤2: 确保正确调用childForStatusBarStyle
函数。我的根视图控制器中的currentViewController
变量在iOS检查之前没有被设置,所以我需要在该变量设置完毕后调用setNeedsStatusBarAppearanceUpdate()
来指示再次检查childForStatusBarStyle
函数。
步骤3: 在决定状态栏外观的子视图控制器中,覆盖样式:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
步骤4: 确保在创建子VC时调用setNeedsStatusBarAppearanceUpdate()
方法,并从根控制器中调用该方法。因此,子VC中的setNeedsStatusBarAppearanceUpdate()
方法不起作用,但例如UIApplication.shared.keyWindow?.rootViewController?.setNeedsStatusBarAppearanceUpdate()
可以。
步骤5: 当从层次结构中移除子VC并想要恢复状态栏样式时,请确保再次从根VC中调用setNeedsStatusBarAppearanceUpdate()
方法,可能是在viewWillDisappear
中。
顺便提一下,上述解决方案并不需要我明确设置View controller-based status bar appearance
Info.plist值为YES
,这是许多答案提到的。
barStyle
。 - mattplist
中添加任何内容,也不需要添加导航栏样式。 - M Zubair ShamshadsetNeedsStatusBarAppearanceUpdate
。 - Valerii Lider