无法使 SFSafariViewController 状态栏样式 lightContent

Posted

技术标签:

【中文标题】无法使 SFSafariViewController 状态栏样式 lightContent【英文标题】:Unable to make SFSafariViewController statusbar style lightContent 【发布时间】:2019-10-03 08:46:12 【问题描述】:

我需要在黑色背景的状态栏中显示浅色内容,但是某些屏幕需要带有白色背景的黑色状态栏内容,因此我保留了 基于视图控制器的状态栏外观在 info.plist 中设置为 YES 以根据视图控制器的要求采用状态栏样式。

我的问题是,每当我从任何视图控制器呈现 SFSafariViewController 时,它都会默认采用黑色状态栏内容和白色背景,即状态栏样式每次都是 .default

我尝试在 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)
    


【问题讨论】:

【参考方案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,您可以指定呈现的视图控制器控件状态栏的外观,即使呈现非全屏。

输出:截图

【讨论】:

尝试设置以上属性,但没有成功。谢谢 @DhavalH.Nena - 用代码和屏幕截图更新答案,这对你有用吗? 您可以像这样设置导航栏颜色而不是黑色:safari.preferredBarTintColor = self.navigationController?.navigationBar.tintColor 或 safari.view.tintColor = safari.preferredBarTintColor = self.navigationController?.navigationBar .tintColor 但这对我有用。 嗨@Rocky,你的答案在黑色上工作得很好,但是我的应用程序主题颜色不同,这是行不通的。在进一步测试时,我发现在使用不同颜色方面有一些奇怪的行为,即有些颜色工作正常,而有些则不行。例如,像黑色、洋红色这样的本机颜色按预期工作,状态栏颜色变为白色,但是对于黄色、绿色等其他颜色,状态栏颜色始终保持黑色。待续.. 即使从我的自定义颜色中,一种也可以正常工作,而另一种则不能。 Swift static let blue = UIColor(red: 61, green: 140, blue: 255). // WORKING static let blueLight = UIColor(red: 0, green: 177, blue: 240) // NOT WORKING 我怀疑 SFSafariViewController 正在根据一些 RGB 值管理状态栏颜色的显示,尽管我不确定。让我知道你的想法。并感谢您的帮助!【参考方案2】:

iOS 10.0+

preferredBarTintColor

为导航栏和工具栏的背景着色的颜色。

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


由于您的View controller-based status bar appearanceInfo.plist 中设置为YES,因此您需要在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
    

【讨论】:

不,我的最低 iOS 部署目标是 iOS 9.0 及更高版本的解决方案不适用于它。谢谢 谢谢您的回答,但是您可以尝试使用黄色或绿色。它们不起作用,有关详细答案,请在下面的答案中查看我的 cmets。感谢您的帮助! @DhavalH.Nena 没错,我在 iOS 9 模拟器中检查了safari.view.tintColor,你是对的。它不会改变navigationBarbackgroundColor,它只是改变barButtonItems 的色调。 @DhavalH.Nena 我尝试了几件事,甚至将 safari 嵌入到 navigationController 中并进行了自定义,但这也有它自己的警告。最后,在我看来,在 iOS 9 中没有优雅的方法来处理这个问题,所以在这一点上,我将在 iOS 10+ 的 preferredBarTintColor 上应用颜色并将其保留为 iOS9-的默认值。 导航栏颜色没问题,我关心的是在出现时更改 SFSafariViewController 的状态栏颜色。对于黑色,红色变为白色,对于其他颜色则不是。如果您有任何其他解决方案,请分享。谢谢:)

以上是关于无法使 SFSafariViewController 状态栏样式 lightContent的主要内容,如果未能解决你的问题,请参考以下文章

无法使 Qmenu 背景弯曲

无法使vertx对象无法接受

无法使 @ngrx/store 正常工作

无法使 UICollectionView 标头工作

如何使chromedriver无法检测

无法使引导表更小