【问题标题】:SFSafariViewController status bar styleSFSafariViewController 状态栏样式
【发布时间】:2016-01-15 08:28:24
【问题描述】:

我的应用程序的状态栏样式是UIStatusBarStyleLightContent,它在我的rootViewController 中设置为preferredStatusBarStyle

现在我有一个问题,当从我的应用程序中打开 SFSafariViewController 时,它继承了在 SFSafariViewController 的白色背景上轻且不可见的状态栏样式。

有没有办法为 SFSafariViewController 设置状态栏样式?

附:我尝试继承 SFSafariViewController 并覆盖此方法,但没有帮助。

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleDefault;
}

更新:

[[UIApplication sharedApplication] setStatusBarStyle:] 可以解决问题,但此方法在 iOS 9 中已弃用。

【问题讨论】:

  • 看来问题出现是因为我在info.plist中没有将基于uiviewcontroller的状态栏外观键设置为YES。我重写了状态栏样式代码以使用基于视图控制器的方式,并且一切正常
  • @ClayEllis 抱歉,当时错过了。感谢您的回答

标签: objective-c iphone cocoa-touch ios9


【解决方案1】:

您根本不必继承 SFSafariViewController

只需在您的 SFSafariViewController 实例上设置 modalPresentationCapturesStatusBarAppearance = true,它就会自行处理其余部分。

这是有效的,因为它自己的默认 preferredStatusBarStyle 是,你猜对了,.default。视图层次结构仍然依赖于呈现视图控制器的状态栏外观,因此通过将modalPresentationCapturesStatusBarAppearance 设置为true,它将是接收者要求的状态栏外观。

TL;DR

safariViewController.modalPresentationCapturesStatusBarAppearance = true

(当 UIViewControllerBasedStatusBarAppearance 在 Info.plist 中设置为 NO 时,此行为将被覆盖,不起作用)

【讨论】:

  • 感谢最优雅的解决方案
  • @Alex 关于为什么没有的任何说明?我只是为我工作,它应该基于 Clay 的信息,即 SafariVC 是设置状态栏文本颜色的一个。
  • 请注意,如果您将信息列表中的属性键“UIViewControllerBasedStatusBarAppearance”设置为 NO,这将不起作用
【解决方案2】:

您可以使用扩展。

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
    }

}

【讨论】:

  • 如何在 ObjectiveC 中做到这一点?
【解决方案3】:

这不是最好的解决方案,但它确实有效。

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。

【讨论】:

  • 不错的解决方案,是一种将应用程序的较低 iOS 版本保持在 8.0 并且仍然(如果使用的是 9.0)使用继承自 SFSafariViewController 的类的方法?
  • 我的答案@available(iOS 9.0, *) class MySafariViewContoller: SFSafariViewController
  • UIModalPresentationStyle 属性设置为fullScreen 时,此解决方案有效,否则请使用上述@clay-ellis 接受的答案。
【解决方案4】:

怎么样?

class MyCustomSafariViewController: SFSafariViewController {

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }
}

或者私有 API - 如果你可以使用的话。

【讨论】:

  • 感谢您的建议,但我想要深色状态栏样式。更新了答案,尝试子类化,但它不起作用。无法使用私有 API
  • 返回 .Default 不起作用,实际上从未调用过 preferredStatusBarStyle
  • 从不建议使用私有 API。
猜你喜欢
  • 2019-10-03
  • 1970-01-01
  • 2017-12-13
  • 2020-01-09
  • 1970-01-01
  • 2018-09-05
  • 2016-01-11
  • 1970-01-01
相关资源
最近更新 更多