Здесь возникает множество вопросов, касающихся блокировки воспроизведения фильмов в альбомном режиме или поддержки альбомного воспроизведения фильмов с использованием MPMoviePlayerViewController или MPMoviePlayerController.У меня уже есть функция альбомной / книжной ориентации, и я не хочу блокировать воспроизведение в любом из режимов.
То, что у меня есть, это код, который использует MPMoviePlayerViewController в соответствии с документацией:
MPMoviePlayerViewController* movieViewController =
[[MPMoviePlayerViewController alloc] initWithContentURL:url];
[parentViewController presentMoviePlayerViewControllerAnimated:movieViewController];
Мое приложение в основном заблокировано в портретном режиме, но этот код представляет контроллер фильма модально в своем собственном представлении и поддерживает как книжную, так и альбомную ориентации.Все это очень мило.
Вот моя проблема.99% видео, которые я буду представлять, представляют собой альбомные видео, и приведенный выше код запускает воспроизведение фильма в портретном режиме, поскольку пользователь (вероятно) удерживает устройство в портретном режиме.
То, что я хочу, этоповедение родного приложения YouTube;что, когда вы представляете контроллер видео, он сначала представлен в альбомном режиме, который побудит пользователя изменить ориентацию своего устройства.Если они позже захотят повернуть его обратно в портрет, им разрешено.Когда фильм завершен (или закрыт), контроллер просмотра фильма будет отключен, а устройство должно находиться в портретном режиме.
Кажется невозможным правильно скрыть строку состояния (она привязана к полноэкранным элементам управления).независимо от состояния «hideStatusBar» перед запуском фильма), поэтому кажется, что получение строки состояния в нужном месте также должно быть частью этого.
Отредактировано для добавления отладкипримечания относительно ориентации строки состояния : если я позвоню setStatusBarOrientation:UIInterfaceOrientationLandscapeRight
перед запуском фильма, строка состояния будет в нужном месте, но система больше не вызывает shouldAutorotateToInterfaceOrientation
таким же образом.
ЕслиЯ не звоню setStatusBarOrientation
, до появления фильма я получаю следующую последовательность звонков:
shouldAutorotateToInterfaceOrientation(Portrait)
shouldAutorotateToInterfaceOrientation(Portrait)
shouldAutorotateToInterfaceOrientation(Portrait)
shouldAutorotateToInterfaceOrientation(Right)
shouldAutorotateToInterfaceOrientation(Portrait)
Я отвечаю ДА только направо, и фильм запускается в LandscapeRight, но со статусомбар в неправильном месте.Последующие изменения ориентации устройства генерируют именно те вызовы shouldAutorotateToInterfaceOrientation
, которые вы ожидаете (например, если я поверну на Портрет, он спросит меня, можно ли повернуть на Портрет).
Если я позвоню setStatusBarOrientation:UIInterfaceOrientationLandscapeRight
,Я получаю следующую последовательность:
shouldAutorotateToInterfaceOrientation(Right)
shouldAutorotateToInterfaceOrientation(Right)
На оба ответа я отвечаю ДА.Строка состояния находится в нужном месте, но я больше не получаю звонки на shouldAutorotateToInterfaceOrientation
с вопросом о портретном режиме.Поэтому, если я поверну устройство вправо, затем обратно в «Портрет», затем обратно вправо, я вижу, что оно дважды вызывает shouldAutorotateToInterfaceOrientation(Right)
.Даже странно, если я поверну его влево, я получу shouldAutorotateToInterfaceOrientation(Left)
, и с этого момента все работает нормально .Что больше всего раздражает.
Я думаю, что это должно быть ошибка на стороне iOS, и именно поэтому приложение YouTube не использует анимированные эффекты поворота пользовательского интерфейса.Вместо этого он скрывает полноэкранные элементы управления, включая строку состояния, невидимо вращается в фоновом режиме, а затем повторно отображает элементы управления.