Подтвердить что ты не робот

Панель навигации в строке состояния после воспроизведения видео в ландшафтном режиме

Эта проблема:

Панель навигации находится под строкой состояния после воспроизведения видео в ландшафтном режиме.

Приложение:

  • только iOS9.
  • поддерживает только портретный режим.
  • у контроллера представления есть веб-представление на нем, веб-представление откроет ссылку на YouTube
  • контроллер представления встроен в контроллер навигации

Настройки для воспроизведения:

  1. Воспроизвести видео в веб-представлении,
  2. Переведите устройство в ландшафтный режим.
  3. Отключить воспроизведение видео в ландшафтном режиме, приложение возвращается в портретный режим
  4. Панель навигации находится в неправильном положении

Скриншоты:

  1. Когда приложение открывается

when app opens

  1. Воспроизведите видео и поместите устройство в ландшафт

enter image description here

  1. Эта проблема:

enter image description here

4b9b3361

Ответ 1

Swift 3

В контроллере представления представления переопределите свойство prefersStatusBarHidden, чтобы только скрывать строку состояния, если она находится в ландшафтном режиме.

override var prefersStatusBarHidden: Bool {
    return UIApplication.shared.statusBarOrientation.isLandscape
}

Затем добавьте наблюдателя, когда устройство повернуто.

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(videoDidRotate), name: .UIDeviceOrientationDidChange, object: nil)
}

В методе наблюдателя вызовите setNeedsStatusBarAppearanceUpdate:

func videoDidRotate() {
    self.setNeedsStatusBarAppearanceUpdate()
}

Это должно сделать это.

Ответ 2

Это очень просто,

swift 3

override func viewWillLayoutSubviews() {
   super.viewWillLayoutSubviews();
   UIApplication.shared.isStatusBarHidden = false
}

Ответ 3

@Ответ на Aaron почти работает, есть только одна проблема: когда вы нажимаете "done" в видео, сохраняя устройство в альбомной ориентации, оно не будет отображать строку состояния, пока вы не вернете устройство обратно в портрет,

В этом случае я добавил наблюдателя уведомлений, когда нажата кнопка "done", а затем я переключаюсь на портрет программно.

Мой код находится в Objective C:

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoDidRotate) name:UIDeviceOrientationDidChangeNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closedFullScreen:) name:UIWindowDidBecomeHiddenNotification object:nil];
}

-(void)closedFullScreen:(NSNotification *)myNotification{
    [[UIDevice currentDevice] setValue:
     [NSNumber numberWithInteger: UIInterfaceOrientationPortrait]
                                    forKey:@"orientation"];
}

- (BOOL)prefersStatusBarHidden {
    return UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation);
}

- (void)videoDidRotate {
    [self setNeedsStatusBarAppearanceUpdate];
}

EDIT:

Просмотр отображения строки состояния на основе контроллера в файле .plist должно быть установлено на YES.

Ответ 4

Я попробовал ответить @Makalele, но не совсем работал (или он может быть заблокирован из-за другого тестового кода). После некоторого теста и попробуйте, я получаю что-то более простое.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center addObserver:self
               selector:@selector(setNeedsStatusBarAppearanceUpdate)
                   name:UIDeviceOrientationDidChangeNotification
                 object:nil];
    [center addObserver:self
               selector:@selector(setNeedsStatusBarAppearanceUpdate)
                   name:UIWindowDidBecomeHiddenNotification
                 object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}


- (BOOL)prefersStatusBarHidden {
    return UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation);
}

Несколько замечаний

  • Вы можете напрямую вызвать setNeedsStatusBarAppearanceUpdate с помощью селектора.
  • Добавлен вызов removeObserver, когда вид исчезает.
  • Возвращаемое значение prefersStatusBarHidden должно меняться время от времени.

Итак, в контроллере представления, который содержит представление YouTube, вы увидите, что строка состояния исчезает перед входом в полноэкранный режим YouTube. Он вернется, когда воспроизведение YouTube будет завершено (через событие UIWindowDidBecomeHiddenNotification).

На всякий случай, если это событие не запускается, другое событие: UIDeviceOrientationDidChangeNotification будет по-прежнему запускаться всякий раз, когда пользователь поворачивает экран (даже ориентация заблокирована).

Итак, решение @Makalele имеет двойной маршрут для запуска строки состояния.

Я обнаружил, что мне не нужен UIDevice:setValue:forKey:, но ваш пробег может отличаться.

Кредит @Makalele и @Aaron.