Алло,
У меня есть простое приложение, которое содержит UITabBarController с двумя UIViewController. Оба UIViewControllers являются только портретными (вращение не допускается). UIView одного UIViewController содержит представление MPMoviePlayerController, позволяющее воспроизводить видео внутри этого представления с возможностью сделать его полноэкранным с помощью элементов управления (MPMovieControlStyleEmbedded). Код прост и выглядит как ...
__moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:@"MOVIE_URL"]];
__moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
__moviePlayer.view.frame = CGRectMake( 10, 10, 300, 200 );
__moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
__moviePlayer.shouldAutoplay = NO;
[__moviePlayer prepareToPlay];
[self.view addSubview:__moviePlayer.view];
... это работает отлично, если пользователь не переключится в полноэкранное воспроизведение, где я хочу разрешить вращение, чтобы разрешить воспроизведение в альбомной ориентации. Вращение не работает, потому что UITabBarController запрещает его (и оба UIViewControllers тоже).
Итак, я попробовал два подхода, но ни один из них не работает так, как ожидалось.
1) Подклассированный UITabBarController
Я добавил свойство BOOL __allowRotation и, если оно установлено в YES, я возвращаю YES в методе shouldAutorotateToInterfaceOrientation UITabBarController.
Я слушаю уведомления MPMoviePlayerDidEnterFullscreenNotification и MPMoviePlayerWillExitFullscreenNotification, чтобы установить для этого свойства значение YES и NO.
Это работает, но проблема в том, что, когда пользователь заканчивает воспроизведение видео в альбомной ориентации, базовый вид не поворачивается обратно в портретную. Единственный способ вернуться к портретному изображению - использовать закрытый API, которого нет.
2) Вид / преобразование слоя
Я также пытался прослушивать уведомления MPMoviePlayerDidEnterFullscreenNotification и уведомления MPMoviePlayerWillExitFullscreenNotification.
Когда я получаю MPMoviePlayerDidEnterFullscreenNotification, я запускаю уведомления об ориентации UIDevice, чтобы получить ориентацию устройства. Я пытаюсь преобразовать слой представления MPMoviePlayerController, основываясь на текущей ориентации устройства, но это своего рода иммунитет, потому что он ничего не делает. Я могу присвоить что угодно для преобразования свойства, но оно ничего не делает.
Это ничего не делает, не совсем правильно. Когда я применяю преобразование во время поворота, я вижу эффект этого преобразования, когда я переключаюсь из полноэкранного в режим воспроизведения встроенного видео.
3) Отдельное UIWindow
Я еще не тестировал это, но где-то обнаружил, что MPMoviePlayerController создает отдельное UIWindow для полноэкранного воспроизведения, которое должно быть доступно через [[UIApplication sharedApplication] windows]. Это объясняет, почему преобразование не применяется во время полноэкранного воспроизведения.
Но мне очень не нравится это решение, потому что UIWindow не может быть идентифицировано, и я не хочу использовать магические константы, такие как objectAtIndex: 1 или применять преобразование ко всем UIWindows, кроме основного и т. Д.
Кроме того, что базовая реализация может быть изменена, и она перестанет работать.
Вопрос
Итак, вопрос в том, как разрешить поворот полноэкранного воспроизведения MPMoviePlayerController только тогда, когда нижележащий UIView (т. Е. UIViewController UIView) запрещает поворот и разрешает только портрет?