MPMoviePlayerController полноэкранная причуда в iPad - PullRequest
13 голосов
/ 18 мая 2010

Я хочу показать MPMoviePlayerController в контроллере представления и позволить пользователю переключаться в полноэкранный режим с помощью элементов управления по умолчанию, таких как приложение YouTube. Я использую следующий код в простом примере:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.player = [[MPMoviePlayerController alloc] init];
    self.player.contentURL = theURL;
    self.player.view.frame = self.viewForMovie.bounds;
    self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.viewForMovie addSubview:player.view];
    [self.player play];
}

Это работает хорошо, пока пользователь не сделает видео во весь экран, не повернет устройство и не нажмет на экран. Строка состояния отображается в неправильном положении, как показано на скриншоте ниже.

screenshot

Я работаю с шаблоном Tab Tab Application для iPad. Я только добавил viewDidLoad выше, переменные представления и UIView в XIB, чтобы показать проигрыватель фильмов.

Что я делаю не так?

Ответы [ 7 ]

3 голосов
/ 23 сентября 2010

Да, я тоже испытываю эту проблему. Это определенно является ошибкой в ​​самом MPMoviePlayerController.

Обходной путь, на котором я остановился в моем приложении, - это просто исправить строку состояния самостоятельно, когда я выхожу из полноэкранного режима:

- (void)playerDidExitFullscreen:(NSNotification *)notification {
    MPMoviePlayerController *moviePlayer = (MPMoviePlayerController *) notification.object;

    if (moviePlayer == self.player) {
        UIApplication *app = [UIApplication sharedApplication];
        if (app.statusBarOrientation != self.interfaceOrientation) {
            [app setStatusBarOrientation:self.interfaceOrientation animated:NO];
        }
    }
}

Это не решает проблему в полноэкранном режиме, но исправляет ее впоследствии.

Обратите внимание, что функцию необходимо добавить к уведомлению:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerDidExitFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:nil];
2 голосов
/ 18 мая 2010

Должен ли долженAutorotateToInterfaceOrientation: interfaceOrientation возвращать YES для всех поддерживаемых ориентаций?

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

Если вы предоставите больше кода, это поможет.

1 голос
/ 12 июня 2010

Была такая же проблема, просто потратил полдня на разборку. Когда iPad находится в портретной ориентации, всякий раз, когда я запускал видео с использованием примера кода (или любого другого, который я мог найти в сети), видео и панель управления форматировались для портрета, и, следовательно, повсюду на экране.

Так или иначе, у меня работает следующее.

  /* Call the code like below:
        int iLandscape;
        if( newOrientation==UIInterfaceOrientationLandscapeLeft || newOrientation==UIInterfaceOrientationLandscapeRight )
             iLandscape=1;

        [self PlayVideo:iLandscape fullscreen:1]
    */
        //////////////////////////////////////////////////////////////////////////
        - (void)PlayVideo:(int)iLandscape fullscreen:(int)iFullScreen 
        {
            NSString *url = [[NSBundle mainBundle] pathForResource:@"myvideofile" ofType:@"m4v"];

        if( iFullScreen==0 )
        {
            MPMoviePlayerController *player2 = 
                [[MPMoviePlayerController alloc] 
                    initWithContentURL:[NSURL fileURLWithPath:url]];

            [[NSNotificationCenter defaultCenter] 
                addObserver:self
                   selector:@selector(movieFinishedCallback:)
                       name:MPMoviePlayerPlaybackDidFinishNotification
                     object:player2];

            //---play partial screen---
            player2.view.frame = CGRectMake(0, 0, m_iScreenWidth, m_iScreenHeight);
            [self addSubview:player2.view];
            //---play movie---
            [player2 play];
        }   
        else
        {
            MPMoviePlayerViewController *playerViewController = [[MPMoviePlayerViewController alloc] 
                initWithContentURL:[NSURL fileURLWithPath:url]];

            [[NSNotificationCenter defaultCenter] 
                addObserver:self
                   selector:@selector(movieFinishedCallback:)
                       name:MPMoviePlayerPlaybackDidFinishNotification
                     object:[playerViewController moviePlayer]];

            if( iLandscape )
            {
                playerViewController.view.frame = CGRectMake(0, 0, m_iScreenWidth, m_iScreenHeight);
            }
            [self addSubview:playerViewController.view];
            //play movie
            MPMoviePlayerController *player = [playerViewController moviePlayer];
            player.scalingMode=MPMovieScalingModeAspectFit;
            [player play];
        }
    }


    //////////////////////////////////////////////////////////////////////////
    - (void) movieFinishedCallback:(NSNotification*) aNotification 
    {
        MPMoviePlayerController *player = [aNotification object];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];    
        [player autorelease];    
        [player.view removeFromSuperview];
    }
1 голос
/ 20 мая 2010

вы используете конструктор интерфейса для вашего интерфейса? если это так, убедитесь, что вы установили ориентацию вида на «пейзаж» в инспекторе атрибутов вида.

0 голосов
/ 17 сентября 2013

Попробуйте это

 - (void)willEnterFullscreen:(NSNotification*)notification {
     NSLog(@"willEnterFullscreen");

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

 - (void)enteredFullscreen:(NSNotification*)notification {
     NSLog(@"enteredFullscreen");
 }

- (void)willExitFullscreen:(NSNotification*)notification {
    NSLog(@"willExitFullscreen");

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


}

- (void)exitedFullscreen:(NSNotification*)notification {
    NSLog(@"exitedFullscreen");

    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
0 голосов
/ 03 января 2011

Нашел это.

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

Первое - я поставил вещи в портретном режиме.

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

Затем я сунул фильм в строку состояния. Примечание. Предполагается, что видео имеет соотношение сторон 4x3

.
theVideo = [[MPMoviePlayerController alloc] initWithContentURL: [NSURL fileURLWithPath : path]];
float aspectRatio = (3.0f/4.0f);
float theMovieHeight = [self view].bounds.size.width * aspectRatio;
[[theVideo view] setFrame:(CGRectMake(0, [self view].bounds.size.height - theMovieHeight, [self view].bounds.size.width, theMovieHeight ))]; 

Затем в том месте, где запускается приложение (в моем проекте оно находится в функции didFinishLaunchingWithOptions) - в любом случае, вам просто необходим доступ к объекту окна.

float aspectRatio = (3.0f/4.0f);
float theMovieHeight = self.window.bounds.size.width * aspectRatio;
float theSpaceAboveTheMovie = self.window.bounds.size.height - theMovieHeight;
float whereTheMovieShouldBeCentered = (self.window.bounds.size.height - theMovieHeight) / 2;

CGAffineTransform theTransform = CGAffineTransformMakeTranslation(0,0);

theTransform = CGAffineTransformScale(theTransform, 1.0f/aspectRatio, 1.0f/aspectRatio);
theTransform = CGAffineTransformTranslate(theTransform, -whereTheMovieShouldBeCentered, 0);
theTransform = CGAffineTransformRotate(theTransform, M_PI / 2);
theTransform = CGAffineTransformTranslate(theTransform, 0, -theSpaceAboveTheMovie);

[self.window setTransform:theTransform];

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

Здесь вы должны увидеть фильм и строку состояния по центру страницы

//  theTransform = CGAffineTransformScale(theTransform, 1.0f/aspectRatio, 1.0f/aspectRatio);
//  theTransform = CGAffineTransformTranslate(theTransform, -whereTheMovieShouldBeCentered, 0);
//  theTransform = CGAffineTransformRotate(theTransform, M_PI / 2);
    theTransform = CGAffineTransformTranslate(theTransform, 0, -theSpaceAboveTheMovie);

Тогда первые два

Здесь вы должны видеть, что фильм и строка состояния повернуты и больше не центрированы

//  theTransform = CGAffineTransformScale(theTransform, 1.0f/aspectRatio, 1.0f/aspectRatio);
//  theTransform = CGAffineTransformTranslate(theTransform, -whereTheMovieShouldBeCentered, 0);
    theTransform = CGAffineTransformRotate(theTransform, M_PI / 2);
    theTransform = CGAffineTransformTranslate(theTransform, 0, -theSpaceAboveTheMovie);

Здесь вы должны увидеть, что он повернут и центрирован

//  theTransform = CGAffineTransformScale(theTransform, 1.0f/aspectRatio, 1.0f/aspectRatio);
    theTransform = CGAffineTransformTranslate(theTransform, -whereTheMovieShouldBeCentered, 0);
    theTransform = CGAffineTransformRotate(theTransform, M_PI / 2);
    theTransform = CGAffineTransformTranslate(theTransform, 0, -theSpaceAboveTheMovie);

И со всеми, он вращается и полноэкранный

Вы можете скачать мой пример кода здесь .

0 голосов
/ 22 июля 2010

Вы решили эту проблему?

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

Этот код может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...