Objective c SFSafariViewController状态栏样式

Objective c SFSafariViewController状态栏样式,objective-c,iphone,cocoa-touch,ios9,Objective C,Iphone,Cocoa Touch,Ios9,我的应用程序的状态栏样式是UIStatusBarStyleLightContent,它在我的rootViewController中设置为preferredStatusBarStyle 现在我有一个问题,当在我的应用程序中打开SFSafariViewController时,它继承了状态栏样式,在SFSafariViewController的白色背景上是浅色和不可见的 有没有办法为SFSafariViewController设置状态栏样式 另外,我试图将SFSafariViewController子

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

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

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

另外,我试图将SFSafariViewController子类化并重写此方法,但没有任何帮助

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleDefault;
}
更新:

[[UIApplication sharedApplication]setStatusBarStyle:]可以做到这一点,但这种方法在iOS 9中已被弃用。

如何

class MyCustomSafariViewController: SFSafariViewController {

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

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

这不是最好的解决方案,但它可以工作

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。

您根本不必子类化
SFSafariViewController

只需在您的
SFSafariViewController
实例上设置
modalPresentationCapturesStatusBarAppearance=true
,其余的将由它自己处理。

这是因为它自己的默认值
preferredStatusBarStyle
.default
。视图层次结构仍然依赖于显示视图控制器的状态栏外观,因此通过将
modalPresentationCapturesStatusBarAppearance
设置为
true
,它将成为要求状态栏外观的接收者

TL;博士


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

您可以使用扩展

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
    }

}

谢谢你的建议,但我想要黑色的状态栏样式。更新了答案,尝试子类化,但不起作用。无法使用私有API返回
。默认值
不起作用,实际上从未调用
preferredStatusBarStyle
。请不要建议使用私有API。似乎出现了问题,因为我没有在info.plist中将基于uiviewcontroller的状态栏外观键设置为“是”。我重写了状态栏样式代码,使用基于视图控制器的方式,一切正常perfect@ClayEllis对不起,当时没看到。感谢answerNice解决方案,这是一种将应用程序的较低iOS版本保持在8.0的方法,并且仍然(如果在9.0上使用)使用继承自
SFSafariViewController
?我已经得到了我的答案
@可用(iOS 9.0,*)class MySafariViewContoller:SFSafariViewController
此解决方案在
UIModalPresentationStyle
属性设置为
fullScreen
时有效,否则使用上面@clay ellis接受的答案。感谢您提供的最优雅的回答solution@Alex有没有澄清为什么没有?我只是为我工作,它应该基于Clay的信息,SafariVC是设置状态栏文本颜色的一个。只是提醒一下,如果您的信息列表中的属性键“UIViewControllerBasedStatusBarAppearance”设置为No,这不起作用。我如何在ObjectiveC中做到这一点?
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
    }

}