Как сделать так, чтобы MPMoviePlayerViewController запускался в ландшафтном режиме, но все же позволял изменять ориентацию - PullRequest
3 голосов
/ 20 июля 2011

Здесь возникает множество вопросов, касающихся блокировки воспроизведения фильмов в альбомном режиме или поддержки альбомного воспроизведения фильмов с использованием 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 не использует анимированные эффекты поворота пользовательского интерфейса.Вместо этого он скрывает полноэкранные элементы управления, включая строку состояния, невидимо вращается в фоновом режиме, а затем повторно отображает элементы управления.

Ответы [ 2 ]

4 голосов
/ 26 июля 2011

Я бы предложил отключить таймер; сначала разрешите только пейзаж в shouldAutorotateToInterfaceOrientation: (что приведет к повороту в ландшафт), а затем, скажем, через 5 секунд, разрешите все ориентации.

Во-первых, вам нужно либо создать подкласс MPMoviePlayerViewController, либо создать MPMoviePlayerController в его собственном представлении. Дополнительный код будет выглядеть примерно так:

// On load, init or similar method
BOOL showLandscapeOnly = YES;
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@(allowAllOrientations) userInfo:nil repeats:NO];

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  if (showLandscapeOnly == YES)
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
            interfaceOrientation == UIInterfaceOrientationLandscapeRight);
  else
    return YES;
}

- (void)allowAllOrientations {
  showLandscapeOnly = NO;
}

Полагаю, это даст именно то, что вам нужно; при отображении модального видеоконтроллера, он будет менять ориентацию на альбомную, поскольку это единственная поддерживаемая ориентация. Но если пользователь вернет его обратно в портретное состояние, он ответит нормально.

Вы также можете попробовать поэкспериментировать с другими временными интервалами; возможно, 2 секунды будут лучше? Предложите вам посмотреть, что делают тестовые пользователи. Они, вероятно, вращают устройство довольно быстро.

Надеюсь, это поможет!

0 голосов
/ 20 июля 2011

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return NO;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...