我的应用程序的状态栏样式是UIStatusBarStyleLightContent
,它在我的rootViewController中设置为preferredStatusBarStyle
。
现在我有一个问题,当我从我的应用程序中打开SFSafariViewController
时,它继承了在SFSafariViewController
的白色背景上轻巧且不可见的状态栏样式。
有没有办法为SFSafariViewController设置状态栏样式?
附:我试图子类SFSafariViewController并覆盖此方法,但它没有帮助。
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleDefault;
}
更新:
[[UIApplication sharedApplication] setStatusBarStyle:]可以解决问题,但在iOS 9中不推荐使用此方法。
你根本没有子类SFSafariViewController
。
只需在你的modalPresentationCapturesStatusBarAppearance = true
实例上设置SFSafariViewController
,它就可以自己处理其余部分。
这是有效的,因为它自己的默认preferredStatusBarStyle
,你猜对了,.default
。视图层次结构仍然依赖于呈现视图控制器的状态栏外观,因此通过将modalPresentationCapturesStatusBarAppearance
设置为true
,接收器将被要求状态栏外观。
TL; DR
safariViewController.modalPresentationCapturesStatusBarAppearance = true
(当您在Info.plist中将UIViewControllerBasedStatusBarAppearance
设置为NO
时,此行为被覆盖,不起作用)
它不是最好的解决方案,但它确实有效。
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。
您可以使用扩展程序。
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
}
}
那个怎么样?
class MyCustomSafariViewController: SFSafariViewController {
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
}
或者私有API - 如果你可以使用它。