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

Как повернуть встроенное видео UIWebView

Итак, у меня есть эта проблема с приложением, которое я создаю, я не могу понять. Мое приложение имеет следующую структуру:

UITabBarController → UIViewController → UIViewController

Последний контроллер представления содержит UIWebView, который загружает всю страницу. На этой странице есть фильм (mp4), который пользователи могут играть, когда они нажимают кнопку большого раунда.

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

То, что я хочу достичь, это позволить пользователям поворачивать свои телефоны после начала воспроизведения фильма и соответственно поворота фильма. Мне удалось "обнаружить", когда фильм воспроизводится, прослушивая разные NSNotifications, которые отправляет NSNotificationsCenter.

Я использовал это для обнаружения начала:

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieIsPlaying:)
name:@"UIMoviePlayerControllerDidEnterFullscreenNotification"
object:nil];

и это для обнаружения конца:

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieStopedPlaying:)
name:@"UIMoviePlayerControllerDidExitFullscreenNotification"
object:nil];

С двумя селекторами теперь я устанавливаю одну глобальную переменную в YES или NO, которую я могу использовать позже в

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

Если я всегда возвращаю YES из приведенного выше метода, мой прикладной интерфейс вращается навсегда, за исключением случаев, когда фильм работает и работает. Самое странное:

  • Я открываю приложение в портрете.
  • Перейдите на нужную страницу (см. мою структуру выше)
  • Поворот телефона в альбомный (интерфейс вращается - это только для отладки)
  • Я запускаю фильм (он запускается в ландшафте! Horray!)
  • Я поворачиваю телефон назад к портрету (фильм вращается! Horray снова!)
  • Я поворачиваю телефон обратно в альбом (больше не происходит поворот...)

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

Итак, пожалуйста, ребята, дайте мне знать, если вы можете мне как-то помочь. Я действительно в отчаянии. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Спасибо!

Обновление

В конце концов я придумал это решение для двух упомянутых выше методов:

- (void)movieIsPlaying:(NSNotification *)notification
{
    if (![Globals canRotateInterface]) {
        [Globals setCanRotateInterface:YES];

        [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];

        [[[[notification object] view] window] setBounds:CGRectMake(0, 0, 480, 320)];
        [[[[notification object] view] window] setCenter:CGPointMake(160, 240)];
        [[[[notification object] view] window] setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
    }
}

- (void)movieStopedPlaying:(NSNotification *)notification
{   
    if ([Globals canRotateInterface]) {
        [Globals setCanRotateInterface:NO];

        [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];

        [[[[notification object] view] window] setBounds:CGRectMake(0, 0, 320, 480)];
        [[[[notification object] view] window] setTransform:CGAffineTransformIdentity];

        // Little hack to force an orientation rotation so that all elements get their original size and place (eg. Navigation bar)
        UINavigationController *dummyNavigationViewController = [[UINavigationController alloc] init];
        [self presentModalViewController:dummyNavigationViewController animated:NO];
        [self dismissModalViewControllerAnimated:NO];
        [dummyNavigationViewController release];
    }
}
4b9b3361

Ответ 1

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

Ответ 2

Вам следует попробовать реализовать shouldAutorotateToInterfaceOrientation, просто вернув свойство fullScreen MoviePlayerController, а не ловив уведомления для входа/выхода из полноэкранного режима. Я подозреваю, что поворот может привести к небольшому беспорядку в этих уведомлениях.