preferredStatusBarStyle不执行的原因

在iOS 9及其之前改变statusbar的颜色比较简单,直接使用
UIApplication.shared.setStatusBarStyle(.default, animated: true)
或者UIApplication.shared.statusBarStyle = .default 即可.

在iOS 10开始 以上的方法被废弃。系统推荐preferredStatusBarStyle进行替换。然而在项目实践中发现preferredStatusBarStyle的get有时并不会执行。

1、被UINavigationController拦截

当存在UINavigationController时,statusBar的状态由UINavigationControllerpreferredStatusBarStyle控制,所有不会执行rootVC的重写的preferredStatusBarStyle
这种情况下需要继承UINavigationController并重写方法。

    override var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }

这个方法的目的就是让系统到其topViewController中去获取preferredStatusBarStyle的值。

2、Info.plist中View controller-based status bar appearance被设置为NO

View controller-based status bar appearance设置为NO表示statusBar的样式是全局控制的,在任意一个地方改变都会影响所有页面的显示效果一般在iOS 9以前配合UIApplication.shared.statusBarStyle = .default使用时会这样设置。然后preferredStatusBarStyleViewController的一个只读属性,这当然不可能全局控制statusBar的样式,所以View controller-based status bar appearance必须设置YES,preferredStatusBarStyle才会执行。

setNeedsStatusBarAppearanceUpdate更新statusBar样式

setNeedsStatusBarAppearanceUpdate,调用该方法preferredStatusBarStyle会再次执行。
通常在同一个ViewcontrollerstatusBar的样式时不会变的,所以preferredStatusBarStyle只会执行一次。如果需要在viewController显示出来后再次修改statusBar的样式。需要在preferredStatusBarStyle变化后调用setNeedsStatusBarAppearanceUpdate方法。

    var darkMode = false
    override var preferredStatusBarStyle : UIStatusBarStyle {
    return darkMode ? .default : .lightContent
}

你可能感兴趣的:(preferredStatusBarStyle不执行的原因)