Control_Status_Bar

有时候我们会单独控制一个 VC 中状态栏的显示与隐藏,这里记录一下,如何正确的显示与隐藏状态栏

由于是单独控制,所以我们需要在 info.plist 中开启 View controller-based status bar appearanceYES。然后我们在自动控制的 VC 中,重写两个方法

1
2
3
4
5
6
7
8
9
- (BOOL)prefersStatusBarHidden {
// your logic for hide or show
return self.hiddenStatusBar;
}

- (UIStatusBarStyle)preferredStatusBarStyle {
// your logic for statusBar style
return UIStatusBarStyleDefault;
}

然后在我们需要的地方调用 [self setNeedsStatusBarAppearanceUpdate]; 即可,通常这可以满足大多数的场景。但是有一天我发现,有时候调用了 [self setNeedsStatusBarAppearanceUpdate]; 之后,prefersStatusBarHidden 并不会被回调。经过一番探索后发现,如果你有一个 未被隐藏的 UIWindow 的时候,调用 setNeedsStatusBarAppearanceUpdate 并不会触发 prefersStatusBarHidden,所以,只需要把对应的 UIWindow 隐藏就可以了。

现在项目中用的是 WKWebView,当显示或隐藏状态栏的时候,会导致 WKWebView 错位,而错位的原因就是因为,在 iOS 11 上,scrollView 新出了一个 API contentInsetAdjustmentBehavior 导致的,所以我们只需要对 WKWebView 的 scrollView 指定成如下即可。

1
2
3
if (@available(iOS 11.0, *)) {
_wkWebView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}

而对于 iOS 11 以下的版本,我们需要在 对应的 VC 中指定 self.automaticallyAdjustsScrollViewInsets = NO;,这样 WKWebView 就不会受到 StatusBar 的显示和隐藏的影响了。