iPhone не может повернуть фильм в альбомный режим с помощью MPMoviePlayerViewController - PullRequest
8 голосов
/ 24 января 2012

[обновление]

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

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

Спасибо

[/ update]

У меня есть портретное приложение для 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;

} ​​

1 Ответ

10 голосов
/ 26 января 2012

[EDIT] Приведенное ниже решение отлично работает на iOS5, но больше не работает на iOS6.Надеюсь, у меня будет время на изучение этой проблемы в будущем :( [/ EDIT]

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

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

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

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

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

...