无法使SFSafariViewController状态栏样式为lightContent

时间:2019-05-16 06:45:03

标签: ios swift statusbar ios12 sfsafariviewcontroller

我要求黑色背景的状态栏中有浅色内容,但是某些屏幕需要白色背景的黑色状态栏内容,因此我保留了基于控制器的状态栏外观在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)
    }
}

2 个答案:

答案 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,即使显示为非全屏显示,您也可以指定显示的视图控制器控件状态栏的外观。

输出:屏幕截图

enter image description here

答案 1 :(得分:0)

iOS 10.0 +

  

preferredBarTintColor

     

用于在导航栏和工具栏的背景上着色的颜色。

     

参考:https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller/2274394-preferredbartintcolor


由于您的View controller-based status bar appearanceYES中设置为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
    }
}