2010-07-13 4 views
22

У меня возникли проблемы с отображением полноэкранного фильма в приложении для iPad, а затем разрешено пользователю отклонять его с помощью кнопки «Готово» или «без полноэкранного режима», на панели управления проигрывателя.Правильное отображение и отключение полноэкранного MPMoviePlayerController в iOS 3.2 (iPad)

Первоначально я использовал MPMoviePlayerViewController для презентации фильма, но я не получал полноэкранные уведомления ввода/выхода из своего объекта MPMoviePlayerController, поэтому я переключился на это самостоятельно.

Я могу заставить фильм появляться в полноэкранном режиме (хотя переход является janky), но когда нажаты кнопки «Готово» или «Не полноэкранный режим», никакое действие не предпринимается игроком. Я отправил мой код ниже:

- (void)startPlayingMovieWithURLString:(NSString *)movieURLString { 
    // I get all of these callbacks **EXCEPT** the "willExitFullScreen:" callback. 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullScreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullScreen:) name:MPMoviePlayerWillExitFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishPlayback:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 

    [self.moviePlayerController setContentURL:someExistingURL]; 

     // "self" is a UIViewController subclass, and is presented as a "fullscreen" modal view controller from its parent 
     // I'm setting the movie player's view's frame to take up the full rectangle of my view controller, but really I want the movie to be completely removed when the user presses "done" (that is, removed from the view hierarchy). Not sure when/where to do this. 
    self.moviePlayerController.view.frame = self.view.frame; 
    [self.view addSubview:self.moviePlayerController.view]; 
    [self.moviePlayerController setFullscreen:YES animated:YES]; 

} 

А вот код для моего didFinish обратного вызова

- (void)didFinishPlayback:(NSNotification *)notification { 
     // This ends up recursively telling the player that playback ended, thus calling this method, thus…well you get the picture. 
     // What I'm trying to do here is just make the player go away and show my old UI again. 
    [self.moviePlayerController setFullscreen:NO animated:YES]; 
} 

Так, очевидно, что я делаю что-то неправильно, но я был вверх и вниз по документации и I не могу понять, как заставить фильм просто уйти. Я понял, что это будет более интуитивно, чем это. Что я делаю не так?

ответ

66

Вот как события -> уведомления о работе: Прессы

  • пользователя 'Готово' кнопку

    • MPMoviePlayerWillExitFullscreenNotification
    • MPMoviePlayerDidExitFullscreenNotification
  • прессы пользователя 'Оставьте в полноэкранном режиме' кнопку на транспорте

    • MPMoviePlayerWillExitFullscreenNotification
    • MPMoviePlayerDidExitFullscreenNotification
    • Обратите внимание, что воспроизведение не останавливается
  • фильм достигает КОНЕЦ

    • MPMoviePlayerPlaybackDidFinishNotification с MPMoviePlayerPlaybackDidFinishReasonUserInfoKey набором для MPMovieFinishReasonPlaybackEnded
    • Если вы звоните setFullscreen:NO animated:YES на вашем MoviePlayerController, например, из этого уведомления, вы затем получите уведомление WillExit и DidExit.
    • Обратите внимание, что вы не получаете уведомление PlaybackDidFinish, когда пользователь нажимает кнопки «Готово» или «Оставить полноэкранный режим».

Таким образом, как правило, если вы хотите избавиться от зрения MoviePlayer, вы должны поставить [self.moviePlayerController.view removeFromSuperview] в обработчик DidExitFullscreen уведомления. WillExitFullscreen слишком рано.

Вот мой код:

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

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

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

- (void)exitedFullscreen:(NSNotification*)notification { 
    NSLog(@"exitedFullscreen"); 
    [self.movieController.view removeFromSuperview]; 
    self.movieController = nil; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void)playbackFinished:(NSNotification*)notification { 
    NSNumber* reason = [[notification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey]; 
    switch ([reason intValue]) { 
     case MPMovieFinishReasonPlaybackEnded: 
      NSLog(@"playbackFinished. Reason: Playback Ended");   
       break; 
     case MPMovieFinishReasonPlaybackError: 
      NSLog(@"playbackFinished. Reason: Playback Error"); 
       break; 
     case MPMovieFinishReasonUserExited: 
      NSLog(@"playbackFinished. Reason: User Exited"); 
       break; 
     default: 
      break; 
    } 
    [self.movieController setFullscreen:NO animated:YES]; 
} 

- (void)showMovie { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullscreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullscreen:) name:MPMoviePlayerWillExitFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enteredFullscreen:) name:MPMoviePlayerDidEnterFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 

    NSURL* movieURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"tron" ofType:@"mov"]]; 
    self.movieController = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; 
    self.movieController.view.frame = self.view.frame; 
    [self.view addSubview:movieController.view]; 
    [self.movieController setFullscreen:YES animated:YES]; 
    [self.movieController play]; 
} 
+1

Это полезно, и теперь я могу выйти из полноэкранного режима, когда пользователь нажимает кнопку, однако обратный вызов -playbackFinished: callback никогда не выполняется для меня, и я не могу на всю жизнь понять, почему нет. Вы знаете какие-либо причины, почему это может произойти? – jbrennan

+0

Даже когда фильм воспроизводится до конца? Странно, я никогда не сталкивался с этим. –

+3

, если MPMoviePlayerDidExitFullscreenNotification вызывается как при касании «Готово», так и при выходе из полноэкранного режима, откуда вы знаете, что называется? Возможно, пользователь выходит из полноэкранного режима, и в этом случае вы не хотите удалять представление, которое я предполагаю. –

0

Да. Замечательно. Есть действительно уведомления, упомянутые выше ...

Однако, нет MPMoviePlayerPlaybackWillFinishNotification somehy !!! Это действительно проблема.

При вызове видеопроигрыватель как модальный (независимо от того, какой из следующих методов, используемых presentViewController/presentModalViewController/presentVideoController), если вы определили .fullScreen = YES, он не ожидал назвать MPMoviePlayerWillExitFullscreenNotification уведомление на всех (очевидно, потому что это не значит, что мы входим/выходим из полноэкранного режима, но только присутствуем/выключаем контроллер).

Но на самом деле нет никаких уведомлений о завершении и закрытии видео. Это необходимо (помимо любых возможных ситуаций), чтобы уловить момент начала перехода на увольнение. (Переход, конечно, начинается до имени MPMoviePlayerPlaybackDidFinishNotification). И в то же время приложение: supportedInterfaceOrientationsForWindow: для ранее отображаемого контроллера вызывается перед уведомлением, и нет никакого способа сказать AppDelegate, что наш текущий контроллер должен быть показан уже в другой ориентации.

Итак, поскольку мое видео полноэкранное и также без каких-либо элементов управления (это своего рода ввод, поэтому я только до тех пор, пока оно не закончится) Мое решение состояло в том, чтобы иметь таймер, который проверяет каждый короткий тик (0,1 секунды) какова текущая позиция видео ... и это близко к концу, то это момент для моего собственного уведомления.

Смежные вопросы