Алло,
У меня есть простое приложение, которое содержит UITabBarController с двумя UIViewControllers. Оба UIViewControllers являются только портретами (разрешение вращения не разрешено). Один UIViewController UIView имеет представление 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 в UITabBarController shouldAutorotateToInterfaceOrientation.
Я слушаю MPMoviePlayerDidEnterFullscreenNotification и MPMoviePlayerWillExitFullscreenNotification уведомления, чтобы установить это свойство в YES и NO.
Это работает, но проблема в том, что когда пользователь заканчивает воспроизведение видео в ландшафтном режиме, основной вид не поворачивается назад к портрету. Единственный способ повернуть назад к портрету - использовать частный API, который нет.
2) Просмотр/преобразование слоев
Я также попытался прослушать уведомления MPMoviePlayerDidEnterFullscreenNotification и MPMoviePlayerWillExitFullscreenNotification.
Когда я получаю MPMoviePlayerDidEnterFullscreenNotification, я начинаю уведомления о ориентации UIDevice, чтобы получить ориентацию устройства. Я пытаюсь преобразовать слой представления MPMoviePlayerController, основанный на текущей ориентации устройства, но он невосприимчив, потому что он ничего не делает. Я могу назначить все для преобразования свойства, но ничего не делает.
Делает ничего не совсем правильно. Когда я применяю преобразование во время вращения, я могу увидеть эффект этого преобразования, когда я переключаюсь с полноэкранного воспроизведения на встроенное видео.
3) Разделите UIWindow
Я еще не тестировал это, но где-то я нашел, что MPMoviePlayerController создает отдельный UIWindow для полноэкранного воспроизведения, который должен быть доступен через окна [[UIApplication sharedApplication]]. Это объясняет, почему преобразование не применяется во время полноэкранного воспроизведения.
Но я очень не люблю это решение, потому что UIWindow не может быть идентифицирован, и я не хочу использовать магические константы, такие как objectAtIndex: 1 или применить преобразование ко всем UIWindows, кроме основного, и т.д.
Кроме того, что базовая реализация может быть изменена, и она перестанет работать.
Вопрос
Итак, вопрос в том, как разрешить полноэкранному воспроизведению MPMoviePlayerController только вращение, когда базовый UIView (то есть UIView UIViewController) запрещает поворот и позволяет только портрет?