我的应用状态栏样式为UIStatusBarStyleLightContent
,并在我的rootViewController中设置为preferredStatusBarStyle
。
现在我遇到一个问题,当我在我的应用中打开SFSafariViewController
时,它继承了SFSafariViewController
的白色背景上明亮且不可见的状态栏样式。
有没有办法为SFSafariViewController设置状态栏样式?
P.S。我尝试子类化SFSafariViewController并覆盖此方法,但它没有帮助。
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleDefault;
}
更新
[[UIApplication sharedApplication] setStatusBarStyle:]可以解决问题,但在iOS 9中不推荐使用此方法。
答案 0 :(得分:18)
您根本不必继承SFSafariViewController
。
只需在modalPresentationCapturesStatusBarAppearance = true
的实例上设置SFSafariViewController
,它就可以自行处理其余内容。
这是有效的,因为您自己默认的preferredStatusBarStyle
是.default
。视图层次结构仍依赖于呈现视图控制器的状态栏外观,因此通过将modalPresentationCapturesStatusBarAppearance
设置为true
,接收器将要求状态栏显示。
TL; DR
safariViewController.modalPresentationCapturesStatusBarAppearance = true
(当您在Info.plist中将UIViewControllerBasedStatusBarAppearance
设置为NO
时,此行为被覆盖,无效。
答案 1 :(得分:8)
这不是最佳解决方案,但可行。
class MySafariViewContoller: SFSafariViewController {
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(true)
UIApplication.sharedApplication().statusBarStyle = .Default
}
override func viewWillDisappear(animated: Bool) {
super.viewWillAppear(false)
UIApplication.sharedApplication().statusBarStyle = .LightContent
}
}
根据需要更改.Default和.LightContent。
答案 2 :(得分:7)
您可以使用扩展程序。
extension SFSafariViewController {
override open func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
UIApplication.shared.statusBarStyle = .default
}
override open func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
UIApplication.shared.statusBarStyle = .lightContent
}
}
答案 3 :(得分:1)
那怎么样?
class MyCustomSafariViewController: SFSafariViewController {
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
}
或私有API - 如果您可以使用它。