SFSafariViewController状态栏样式

Ale*_*nko 16 iphone cocoa-touch objective-c ios9

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

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

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

PS我尝试子类SFSafariViewController并覆盖此方法,但它没有帮助.

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleDefault;
}
Run Code Online (Sandbox Code Playgroud)

更新:

[[UIApplication sharedApplication] setStatusBarStyle:]可以解决问题,但在iOS 9中不推荐使用此方法.

Cla*_*lis 22

您根本不必进行子类化SFSafariViewController.

只需设置modalPresentationCapturesStatusBarAppearance = true您的实例,SFSafariViewController它将自行处理其余部分.

这是有效的,因为它自己的默认值preferredStatusBarStyle是,你猜对了.default.视图层次仍然依赖于呈现视图控制器的状态栏外观,因此通过设置modalPresentationCapturesStatusBarAppearancetrue,接收器将询问状态栏的外观.

TL; DR

safariViewController.modalPresentationCapturesStatusBarAppearance = true
Run Code Online (Sandbox Code Playgroud)

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


小智 9

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

根据需要更改.Default和.LightContent.


小智 7

您可以使用扩展程序.

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
    }

}
Run Code Online (Sandbox Code Playgroud)