Как программно скрыть и показать строку состояния в iOS 13?

Я сделал следующий общий метод для скрытия и повторного отображения строки состояния. Он отлично работает до iOS 13, но я получаю следующий сбой, когда запускаю его на устройстве с iOS 13 или выше.

+(void)showStatusBar:(BOOL)show
{
    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];

    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
        [[UIApplication sharedApplication] setStatusBarHidden:!show withAnimation:UIStatusBarAnimationNone];
    }
}

Получение следующей ошибки для iOS 13

Завершение работы приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Приложение называется -statusBar или -statusBarWindow в UIApplication: этот код необходимо изменить, поскольку больше нет строки состояния или окна строки состояния. Вместо этого используйте объект statusBarManager в сцене окна. '

Что я могу сделать, чтобы скрыть и показать строку состояния только для некоторых контроллеров представления?


person NSPratik    schedule 27.09.2019    source источник
comment
developer.apple.com/documentation/uikit/uiviewcontroller/   -  person matt    schedule 27.09.2019


Ответы (1)


Если вы хотите показать / скрыть строку состояния на разных контроллерах представления, вам необходимо:

  1. Добавьте параметр Просмотр внешнего вида строки состояния на базе контроллера в свой Info.plist и установите для него значение ДА.
  2. Переопределить var prefersStatusBarHidden: Bool в каждом контроллере представления, где вы хотите, чтобы строка состояния отображалась / скрывалась
override var prefersStatusBarHidden: Bool { 
  return true 
} 

Если вы хотите показать / скрыть его динамически (например, после нажатия на кнопку), вы можете сделать что-то вроде этого:

var statusBarHidden = true {
  didSet {
    setNeedsStatusBarAppearanceUpdate()
  }
}

override var prefersStatusBarHidden: Bool { 
  return statusBarHidden 
}
  • Вы можете найти более подробное объяснение здесь Здесь

  • Также в документации Apple для UIStatusBarManager вы можете найти следующую цитату:

Этот объект не используется для изменения конфигурации строки состояния. Вместо этого вы устанавливаете конфигурацию строки состояния индивидуально для каждого из ваших объектов UIViewController. Например, чтобы изменить видимость строки состояния по умолчанию, переопределите свойство prefersStatusBarHidden вашего контроллера представления.

person vhristoskov    schedule 10.12.2019
comment
@ coolcool1994 Это странно. Не могли бы вы дважды проверить, выполнили ли вы шаг 1: Добавьте параметр отображения строки состояния на базе контроллера View в свой Info.plist и установите для него значение YES. Без него не будет разницы - person vhristoskov; 12.03.2020