iphone - заставляет MPMoviePlayerController воспроизводить видео в альбомном режиме - PullRequest
3 голосов
/ 20 января 2011

У меня есть приложение, которое работает только в портретном режиме, но когда пользователь воспроизводит видео, я хочу, чтобы оно воспроизводилось в полноэкранном ландшафтном режиме (видеоплеер не очень хорошо выглядит в портретном режиме). Я играю так:

[self.view addSubview:myMoviePlayer.view];
[self.myMoviePlayer setFullscreen:YES animated:YES];
[self.myMoviePlayer play];

Какой лучший способ сделать это?

Ответы [ 5 ]

7 голосов
/ 19 марта 2011

Прочитайте эту статью:

http://iosdevelopertips.com/video/getting-mpmovieplayercontroller-to-cooperate-with-ios4-3-2-ipad-and-earlier-versions-of-iphone-sdk.html

Основная идея:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];

[[self view] setBounds:CGRectMake(0, 0, 480, 320)];
[[self view] setCenter:CGPointMake(160, 240)];
[[self view] setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
1 голос
/ 07 декабря 2012

Мое приложение довольно простое, с UINavigationController в качестве корневого контроллера, который отображает основной экран навигации и несколько экранов с подробностями.Главный экран не поддерживает вращение из-за ограничений макета, и для согласованности подробные экраны (которые просто помещаются в стек navcontroller) также не поддерживают.Однако некоторые подробные экраны содержат ссылки на видео, и видео необходимо отображать в портретном режиме.Приложение отображает проигрыватель модально, используя MPMoviePlayerController.

У меня только что была похожая проблема, и я попробовал решение выше, которое применяет аффинное преобразование к представлению MPMoviePlayerController, но проблема заключалась в том, что строка состояния продолжала отображаться как впортретный режим и перекрытие модального видеоплеера (слева, если смотреть в соответствии с вращением выше).Я попытался пару вещей безрезультатно:

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

  • Явно установить ориентацию строки состояния.Я не совсем уверен, почему это не сработало, но я подозреваю, что это потому, что я указал в своем info.plist, что поддерживается только портрет и, следовательно, он был отрезан от внесения изменений.

Net-net, вышеупомянутое не работает для меня.Точно так же, б / к Apple предостерегает разработчиков, чтобы они считали MPMoviePlayerController непрозрачным, и (особенно с помощью метода transform) я нарушал это.

В конце концов, я нашел более простое решение, которое сработало для меня:

  1. В info.plist я указал, что все ориентации (кроме перевернутой, поэтому стандартная идиома iPhone) поддерживаются.

  2. Подкласс UINavigationController и переопределите соответствующие методы shouldAutorotate, так что поддерживается только Portrait (см. это решение , среди прочего, как сделать это в iOS <6 и iOS6 одновременно). </p>

Это сработало, потому что:

  1. Хотя я и указал, что приложение поддерживает автоповорот, я отключил его в подклассе UINavigationController, который содержит все представления, которые я 'm рендеринг ... так что все остается портретным, за исключением:

  2. MPMoviePlayerController представлен модально, поверх NavigationController и живет в своем собственном мире.Поэтому можно свободно обращать внимание на то, что находится в info.plist, и вращать все по отдельности.

Существует множество примеров того, как представить игрока модально, но для быстрого ознакомления.вот мой код:

- (void)presentModalMediaPlayerForURL:(NSURL *)inURL
{
    NSLog(@"Will play URL [%@]", [inURL description]);
    MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc] initWithContentURL:inURL];
    [player.view setBounds:self.view.bounds];

    [player.moviePlayer prepareToPlay];
    [player.moviePlayer setFullscreen:YES animated:YES];
    [player.moviePlayer setShouldAutoplay:YES];
    [player.moviePlayer setMovieSourceType:MPMovieSourceTypeFile];
    [self presentModalViewController:player animated:YES];

    [player release];
}
0 голосов
/ 10 августа 2015

Я использую следующий код для работы в режиме ТОЛЬКО ЛАНДШАФТ для Movieplayer.

NSURL *movieURL = [NSURL URLWithString:@"http://techslides.com/demos/sample-videos/small.mp4"];  // sample url
MPMoviePlayerViewController *movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];

// Logic for play movie in landscape
CGAffineTransform landscapeTransform;
landscapeTransform = CGAffineTransformMakeRotation(90*M_PI/180.0f);
landscapeTransform = CGAffineTransformTranslate(landscapeTransform, 80, 80);
[movieController.moviePlayer.view setTransform: landscapeTransform];

[self presentMoviePlayerViewControllerAnimated:movieController];
[movieController.moviePlayer prepareToPlay];
[movieController.moviePlayer play];
0 голосов
/ 28 октября 2012

У меня была такая же ситуация, но я использую iOS 6 и проект на основе NavController. Что делает это интересным, так это ViewController, на котором размещен MPMoviePlayerController, который я не хочу поворачивать, но я хотел, чтобы видео внутри него вращалось.

ViewController with rotated MPMoviePlayerController
Я просто вручную поворачиваю MPMoviePlayerController по мере необходимости в зависимости от ориентации устройства. _videoView - это свойство MPMoviePlayerController для ViewController. Например, я просто жестко закодировал желаемую ширину и высоту в соотношении сторон 16x9, поскольку я намерен загрузить это видео на YouTube.

- (void)updateVideoRotationForCurrentRotationWithAnimation:(bool)animation
{
    CGSize containerSize  = _videoView.frame.size;   // Container NOT rotated!
    float  videoWidth     = 384;                     // Keep 16x9 aspect ratio
    float  videoHeight    = 216;

    if( animation )
    {
        [UIView beginAnimations:@"swing" context:nil];
        [UIView setAnimationDuration:0.25];
    }

    switch( self.interfaceOrientation )
    {
        case UIInterfaceOrientationPortrait:
        case UIInterfaceOrientationPortraitUpsideDown:
            m_videoPlayer.view.transform = CGAffineTransformMakeRotation(radians(90));

            // This video player is rotated so flip width and height, but the container view
            // isn't rotated!
            [m_videoPlayer.view setFrame:CGRectMake((containerSize.width-videoHeight)/2,
                                                    (containerSize.height-videoWidth)/2,
                                                    videoHeight,
                                                    videoWidth)];
            break;

        case UIInterfaceOrientationLandscapeLeft:
        case UIInterfaceOrientationLandscapeRight:
            m_videoPlayer.view.transform = CGAffineTransformMakeRotation(radians(0));

            // This video player isn't rotated
            [m_videoPlayer.view setFrame:CGRectMake((containerSize.width-videoWidth)/2,
                                                    (containerSize.height-videoHeight)/2,
                                                    videoWidth,
                                                    videoHeight)];
            break;
    }

    if( animation )
        [UIView commitAnimations];

}


- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [self updateVideoRotationForCurrentRotationWithAnimation:YES];
}

Я также вызываю updateVideoRotationForCurrentRotationWithAnimation после того, как представление действительно появилось, поэтому оно имеет правильную начальную ориентацию.

0 голосов
/ 27 декабря 2011

Для полноэкранного воспроизведения используйте MPMoviePlayerViewController, а затем для его запуска и воспроизведения в альбомной ориентации используйте метод shouldAutorotateToInterfaceOrientation в классе MPMoviePlayerViewController.

Это выглядит так:

[yourInstanceOfMPMoviePlayerViewController shouldAutorotateToInterfaceOrientation: UIInterfaceOrientationLandscapeRight];
...