SFSafariViewController状态栏样式

问题描述 投票:14回答:4

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

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

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

附:我试图子类SFSafariViewController并覆盖此方法,但它没有帮助。

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleDefault;
}

更新:

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

objective-c iphone cocoa-touch ios9
4个回答
19
投票

你根本没有子类SFSafariViewController

只需在你的modalPresentationCapturesStatusBarAppearance = true实例上设置SFSafariViewController,它就可以自己处理其余部分。

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

TL; DR

safariViewController.modalPresentationCapturesStatusBarAppearance = true

(当您在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
    }
}

根据需要更改.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
    }

}

1
投票

那个怎么样?

class MyCustomSafariViewController: SFSafariViewController {

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

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

© www.soinside.com 2019 - 2024. All rights reserved.