Скрыть строку состояния, но не пользовательское окно UIWindow

У меня есть пользовательское окно UIWindow, которое является моей собственной строкой состояния, поэтому я хочу скрыть строку состояния и показать вместо нее. я имею

override var prefersStatusBarHidden: Bool {
    return true
}

И в rootViewController моего UIWindow, и в основном ViewController. Это скрывает строку состояния, но также скрывает мое окно UIWindow. Мое окно windowLevel является UIWindowLevelStatusBar + 1, но я проверял другие windowLevelи он был спрятан независимо от уровня.

Установка непрозрачного фона для моего пользовательского окна UIWindow не возможна.

Как я могу скрыть строку состояния, но не мое пользовательское окно UIWindow?

1 ответ

Решение

Изменить: лучшее решение

То же самое относится и к предыдущему / ниже, но на самом деле код короче, проще и Swifty.

В вашем AppDelegate, есть

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    myStatusBarWindow.isHidden = false
    return true
}

И, конечно же, скрыть строку состояния системы. Либо сделайте это в настройках сборки или info.plist, либо в вашем контроллере представления, скажем

override var prefersStatusBarHidden: Bool {
    return true
}

Намного лучше:)


Старое решение

К сожалению, я не могу найти то, что, вероятно, лучший ответ, но у меня есть обходной путь:

Сначала покажите свое окно. Только после этого вы должны скрыть строку состояния. Я не уверен, почему это работает, но это работает. Вы можете сделать это так:

// Class var 
var statusBarHidden = false

// For example in viewDidLoad but only the order matters
override func viewDidLoad() {
    myWindow.isHidden = false
    statusBarHidden = true
    setNeedsStatusBarAppearanceUpdate()
}

override var prefersStatusBarHidden: Bool {
    return statusBarHidden
}

Благодаря моим экспериментам я обнаружил, что prefersStatusBarHidden проверяется перед viewDidLoad, Таким образом, мы должны сказать контроллеру представления, чтобы он проверил снова, как только окно показывается Опять же, я не знаю, почему это работает, но это работает. Если кто-то может объяснить это явление (почему этот порядок имеет значение), это было бы отличным дополнением к этому решению.

Другие вопросы по тегам