Стиль строки состояния SFSafariViewController

Мой стиль строки состояния приложения UIStatusBarStyleLightContent, и он установлен в моем корневом контроллере как preferredStatusBarStyle.

Теперь у меня есть проблема, что при открытии SFSafariViewController из моего приложения он унаследовал стиль строки состояния, который является легким и невидимым на белом фоне SFSafariViewController.

Есть ли способ установить стиль статусной панели для SFSafariViewController?

P.S. Я попытался подклассифицировать SFSafariViewController и переопределить этот метод, но это не помогает.

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleDefault;
}

Update:

[[UIApplication sharedApplication] setStatusBarStyle:] делает трюк, но этот метод устарел в iOS 9.

Ответы

Ответ 1

Вышеупомянутые ответы идут слишком далеко. У вас нет подкласса SFSafariViewController вообще.

Просто установите modalPresentationCapturesStatusBarAppearance = true в свой экземпляр SFSafariViewController, и он будет обрабатывать остальные самостоятельно.

Это работает, потому что его собственный по умолчанию preferredStatusBarStyle, как вы уже догадались, .default. Иерархия представления по-прежнему полагается на контроллер представления представления для отображения строки состояния, поэтому, установив modalPresentationCapturesStatusBarAppearance в true, ресивер будет запрашивать внешний вид строки состояния.

TL; DR

safariViewController.modalPresentationCapturesStatusBarAppearance = true выполнит трюк.

Ответ 2

Это не лучшее решение, но оно работает.

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, как вы предпочитаете.

Ответ 3

Вы можете использовать расширения.

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
    }

}

Ответ 4

Как насчет этого?

class MyCustomSafariViewController: SFSafariViewController {

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

Или частный API - если вы можете его использовать.