SFSafariViewController状态栏样式

时间:2015-10-16 14:29:25

标签: objective-c iphone cocoa-touch ios9

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

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

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

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

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleDefault;
}

更新

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

4 个答案:

答案 0 :(得分:18)

您根本不必继承SFSafariViewController

只需在modalPresentationCapturesStatusBarAppearance = true的实例上设置SFSafariViewController,它就可以自行处理其余内容。

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

TL; DR

safariViewController.modalPresentationCapturesStatusBarAppearance = true

(当您在Info.plist中将UIViewControllerBasedStatusBarAppearance设置为NO时,此行为被覆盖,无效。

答案 1 :(得分:8)

这不是最佳解决方案,但可行。

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。

答案 2 :(得分: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
    }

}

答案 3 :(得分:1)

那怎么样?

class MyCustomSafariViewController: SFSafariViewController {

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

或私有API - 如果您可以使用它。