无法使 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 appearance
在Info.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
,你是对的。它不会改变navigationBar
的backgroundColor
,它只是改变barButtonItem
s 的色调。
@DhavalH.Nena 我尝试了几件事,甚至将 safari
嵌入到 navigationController
中并进行了自定义,但这也有它自己的警告。最后,在我看来,在 iOS 9 中没有优雅的方法来处理这个问题,所以在这一点上,我将在 iOS 10+ 的 preferredBarTintColor
上应用颜色并将其保留为 iOS9-的默认值。
导航栏颜色没问题,我关心的是在出现时更改 SFSafariViewController 的状态栏颜色。对于黑色,红色变为白色,对于其他颜色则不是。如果您有任何其他解决方案,请分享。谢谢:)以上是关于无法使 SFSafariViewController 状态栏样式 lightContent的主要内容,如果未能解决你的问题,请参考以下文章