Панель навигации в строке состояния после воспроизведения видео в ландшафтном режиме
Эта проблема:
Панель навигации находится под строкой состояния после воспроизведения видео в ландшафтном режиме.
Приложение:
- только iOS9.
- поддерживает только портретный режим.
- у контроллера представления есть веб-представление на нем, веб-представление откроет ссылку на YouTube
- контроллер представления встроен в контроллер навигации
Настройки для воспроизведения:
- Воспроизвести видео в веб-представлении,
- Переведите устройство в ландшафтный режим.
- Отключить воспроизведение видео в ландшафтном режиме, приложение возвращается в портретный режим
- Панель навигации находится в неправильном положении
Скриншоты:
- Когда приложение открывается
![when app opens]()
- Воспроизведите видео и поместите устройство в ландшафт
![enter image description here]()
- Эта проблема:
![enter image description here]()
Ответы
Ответ 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.