iPhone не может повернуть фильм в альбомный режим с помощью MPMoviePlayerViewController

[Обновить]

Как было рекомендовано, я изменил все родительские контроллеры представления для поддержки всех ориентаций. Моя структура приложения выглядит следующим образом: AppDelegate> RootViewController> Videos> VideoDetails> MPMoviePlayerViewController.

Видео будет воспроизводиться в альбомной ориентации, если я изменю все это для поддержки всех ориентаций. Но поддержка всех ориентаций - это не то, что я хочу, и вызывает другие проблемы. Есть ли какая-нибудь другая работа или что-нибудь еще, что я могу сделать?

Спасибо

[/Обновить]

У меня есть приложение для iPhone с портретной ориентацией, которое отображает видео с использованием настраиваемого подкласса MPMoviePlayerViewController. Когда пользователь нажимает кнопку воспроизведения, я создаю экземпляр этого класса и представляю его модально следующим образом:

- (IBAction) playPressed:(id)sender {

NSString *filepath = [[NSBundle mainBundle] pathForResource:self.currentVideoModel.videoFileName ofType:@"m4v"];
NSURL *fileURL = [NSURL fileURLWithPath:filepath];

// MovieViewController is just a simple subclass of MPMoviePlayerViewController
self.moviePlayerController = [[MovieViewController alloc] initWithContentURL:fileURL]; 

// full screen code.
[self.moviePlayerController.moviePlayer setScalingMode:MPMovieScalingModeFill];
[self.moviePlayerController.moviePlayer setFullscreen:TRUE];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackComplete:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayerController];

[self presentMoviePlayerViewControllerAnimated:self.moviePlayerController];
}

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

Мой подкласс MPMoviePlayerViewController только переопределяет следующий метод, чтобы разрешить изменение ориентации, но это не влияет:

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return (toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}

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

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {

if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
    return true;
}
else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI * 2)];
    return true;
}
else if (toInterfaceOrientation == UIInterfaceOrientationPortrait) {
    [self.view setTransform:CGAffineTransformIdentity];
    return true;
}
else return false;

}


person bennythemink    schedule 24.01.2012    source источник
comment
Поддержка ротации своего рода иерархическая. Итак, если вы представляете контроллер проигрывателя фильмов, и он не позволяет вам вращаться, моим первым шагом отладки будет проверка КАЖДОГО контроллера представления, который ведет к вашему проигрывателю фильмов, на метод shouldAutorotate.. и сделать его просто return YES; (вы можете делать это постепенно, если вы хотите сэкономить лишние хлопоты позже). Затем переключайте их по одному обратно в портретное, пока оно не зафиксируется в портретном, и вы узнаете, какие из них UIKit проверяются при попытке повернуть ваш. Иди оттуда.   -  person    schedule 24.01.2012
comment
@ darvids0n спасибо. Я действительно не хочу, чтобы какой-либо другой вид поддерживал что-либо, кроме портрета, но я думаю, что попробую и посмотрю, что произойдет.   -  person bennythemink    schedule 24.01.2012
comment
@ darvids0n Я обновил свой вопрос. Вы можете что-нибудь предложить? большое спасибо за любой совет.   -  person bennythemink    schedule 24.01.2012
comment
Я столкнулся с той же проблемой при разработке приложения, но я выбрал измененный пользовательский интерфейс для поддержки всех маршрутов ориентации, а не пытался заставить его правильно разделить поддержку вращения. Так что больше я ничем не смогу вам помочь (следовательно, я не буду публиковать свой комментарий в качестве ответа). Но удачи!   -  person    schedule 24.01.2012
comment
спасибо за помощь @ darvids0n   -  person bennythemink    schedule 24.01.2012
comment
разобрал @ darvids0n спасибо за вашу помощь!   -  person bennythemink    schedule 26.01.2012


Ответы (1)


[РЕДАКТИРОВАТЬ] Приведенное ниже решение отлично работало на iOS5, но больше не работает на iOS6. Надеюсь, у меня будет время изучить эту проблему в будущем :( [/ EDIT]

ОК, я исправил. Все это было связано с моим неправильным пониманием того, как iOS уведомляет приложение об изменении ориентации. Я думал, что он транслирует любое изменение ориентации, но это не так, он следует вашей иерархии представлений, и вы должны сообщить любым контроллерам дочерних представлений об изменении ориентации. Это было моей гибелью.

Мое приложение состояло из следующих настроек:

окно> RootViewController> контроллер панели вкладок> контроллер навигации> контроллер представления> MPMoviePlayerViewController

Я сделал подкласс контроллера панели вкладок, чтобы он возвращал true только для портретного режима. Я вернул это из метода shouldAutoRotateToOrientation корневых контроллеров представления. Это гарантировало, что все виды будут только портретными.

Затем я представил фильм модально, используя метод presentMoviePlayerViewControllerAnimated, вызываемый из RootViewController. Это автоматически вызвало пользовательский метод shouldAutoRotateToOrientation MPMoviePlayerViewController, которому было присвоено значение YES как для альбомной, так и для портретной ориентации :)

person bennythemink    schedule 26.01.2012