Как настроить цвет status bar?

В своем приложении я использую изображение как фон для моего контроллера. Для status bar в настройках проекта поставил: Status Bar Style - Default. Больше ничего для status bar нигде не использую.

Проблема в том, что когда включается темная тема, мой status bar становится белым. А мне нужно чтобы он оставался черным.

При этом я не хочу убирать поддержку темного/светлого режима во всем приложении. Поэтому Appearance Light в Info.plist мне не совсем подойдет.

Обновление:

Если я использую следущий код во ViewController все работает как мне надо:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    if #available(iOS 13.0, *) {
        return .darkContent
    } else {
        return .default
    }
}

Но если я в сториборде добавлю NavigationController и соединю его с ViewController, то этот код перестанет работать и status bar снова станет белым. Как это исправить?

Если я создам класс UINavigationController и использую свой код в нем то status bar станет черным как мне и надо, но если в сториборде у меня NavigationController -> ViewController -> SecondViewController и в SecondViewController я хочу изменить бар на белый, то ничего не получится...


Ответы (1 шт):

Автор решения: VAndrJ

UINavigationController - точно такой же контроллер, как и остальные. Сделайте точно так же, как для контроллера с которым все как надо: унаследуйте, переопределите preferredStatusBarStyle и в сториборде задайте этот класс для UINavigationController.

К примеру:

class MyCustomNavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        if #available(iOS 13.0, *) {
            return .darkContent
        } else {
            return .default
        }
    }
}

Если хотите чтобы все же зависело от текущего контроллера:

class MyCustomNavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? .darkContent
    }
}
→ Ссылка