我要求黑色背景的状态栏中有浅色内容,但是某些屏幕需要白色背景的黑色状态栏内容,因此我保留了基于控制器的状态栏外观在info.plist中为YES,以根据视图控制器要求采用状态栏样式。
我的问题是,无论何时从任何视图控制器中显示 SFSafariViewController 时,默认情况下它都会获取黑色状态栏内容和白色背景,即每次状态栏样式均为 .default 。 / p>
我尝试覆盖SFSafariViewController子类中的 preferredStatusBarStyle ,到目前为止没有外观。
下面是我的代码
import UIKit
import SafariServices
extension SFSafariViewController {
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .lightContent
}
}
class MyViewController: UIViewController, SFSafariViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.barTintColor = UIColor.lightGray
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
@IBAction func presentSafari(sender: AnyObject) {
let safari = SFSafariViewController(url: URL(string: "https://www.google.com/")!)
safari.delegate = self
present(safari, animated: true) {
}
}
// MARK: - SFSafariViewControllerDelegate
func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
dismiss(animated: true, completion: nil)
}
}
答案 0 :(得分:1)
设置modalPresentationCapturesStatusBarAppearance
可以从当前视图控制器接管状态栏外观的控制。
@IBAction func presentSafari(sender: AnyObject) {
let safari = SFSafariViewController(url: URL(string: "https://www.google.com/")!)
safari.delegate = self
safari.modalPresentationCapturesStatusBarAppearance = true
if #available(iOS 10.0, *) {
safari.preferredBarTintColor = .yellow
} else {
// Fallback on earlier versions
safari.view.tintColor = .yellow
}
present(safari, animated: true) {
}
}
extension SFSafariViewController {
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
当通过调用
present(_:animated:completion:)
方法来呈现视图控制器时,仅当呈现控制器的modalPresentationStyle
值为UIModalPresentationStyle.fullScreen
时,状态栏外观控件才会从呈现状态转移到呈现视图控制器。 。通过将此属性设置为true,即使显示为非全屏显示,您也可以指定显示的视图控制器控件状态栏的外观。
输出:屏幕截图
答案 1 :(得分:0)
iOS 10.0 +
preferredBarTintColor
用于在导航栏和工具栏的背景上着色的颜色。
由于您的View controller-based status bar appearance
在YES
中设置为Info.plist
,因此您将需要在preferredBarTintColor
上应用颜色信息,如下所示:
let safari = SFSafariViewController(url: URL(string: "https://google.com")!)
//This:
safari.preferredBarTintColor = .black
present(safari, animated: true, completion: nil)
而且...不需要以下内容:
extension SFSafariViewController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return .default
}
}