Авторизация видео, воспроизводимого из HTML5 <video>в UIWebView - PullRequest
5 голосов
/ 16 марта 2011

Мое приложение по некоторым причинам поддерживает только книжную ориентацию.
Однако в некоторых случаях мне нужно отображать видео из UIWebView (с тегом video), и было бы неплохо, если бы пользователь мог его просматривать.в портретной или альбомной ориентации.

Контроллер настроен следующим образом:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return UIInterfaceOrientationIsPortrait(toInterfaceOrientation);
}

Результат : видео воспроизводится только в портретном режиме (хорошо, вполне ожидаемо).

Я пытался:
- установить эту настройку для поддержки всех ориентаций, когда пользователь запускает видео
- когда видео останавливается, вернуться к «только портрет»

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    // autorotationEnabled is toggled when a video is played / stopped
    return autorotationEnabled ? YES : UIInterfaceOrientationIsPortrait(toInterfaceOrientation);
}

Результат : ландшафтный режим доступен (отлично!), Но если пользователь нажимает «Готово» во время игры в альбомной ориентации, предыдущий вид появится в ландшафтном режиме после того, как игрок уволен (не так уж и здорово).

Кто-нибудь имеет представление о том, как предотвратить отображение контроллера в ландшафтном режиме при увольнении игрока?
(использование закрытого метода setInterfaceOrientation UIDevice не вариант)

1 Ответ

2 голосов
/ 21 апреля 2011

Я сделал что-то очень похожее.Вы должны изменить стек UIView, чтобы заставить приложение вызывать shouldAutorotateToInterfaceOrientation при извлечении контроллера.

В вашем WebViewController, установленном для разрешения автоматического поворота:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return YES;
}

В родительском контроллере запретить автоматическое:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

Создайте и назначьте UINavigationControllerDelegate.
В делегате временно измените стек UIView, когда контроллер выдвигается или выдвигается:

- (void)navigationController:(UINavigationController *)navigationController 
  willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

// Force portrait by changing the view stack to force autorotation!
if ([UIDevice currentDevice].orientation != UIInterfaceOrientationPortrait) {
    if (![viewController isKindOfClass:[MovieWebViewController class]]) {
        UIWindow *window = [[UIApplication sharedApplication] keyWindow];
        UIView *view = [window.subviews objectAtIndex:0];
        [view removeFromSuperview];
        [window insertSubview:view atIndex:0];
    }
}

Это грязный хак, но это работает.

...