2010-10-18 4 views
20

Предположим, iOS 3.2 или новее. Какова правильная последовательность команд для воспроизведения движения с первоначально скрытыми элементами управления. Когда фильм воспроизводится, пользователь имеет возможность отмечать на экране и отображать элементы управления.Как скрыть контроль до воспроизведения MPMoviePlayerController?

Спасибо!

Мой (контроль не скрытый) код:

- (void)playMovie 
{ 
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Test" ofType:@"m4v"]]; 
    MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 

    // Register to receive a notification when the movie has finished playing. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieDone:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:moviePlayer]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieState:) 
               name:MPMoviePlayerNowPlayingMovieDidChangeNotification 
               object:moviePlayer]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieReady:) 
               name:MPMoviePlayerLoadStateDidChangeNotification 
               object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullScreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:moviePlayer]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullScreen:) name:MPMoviePlayerWillExitFullscreenNotification object:moviePlayer]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishPlayback:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 


    if ([moviePlayer respondsToSelector:@selector(setFullscreen:animated:)]) { 
     moviePlayer.controlStyle = MPMovieControlStyleDefault; // MPMovieControlStyleNone MPMovieControlStyleEmbedded MPMovieControlStyleFullscreen MPMovieControlStyleDefault 
     moviePlayer.scalingMode = MPMovieScalingModeAspectFill; // MPMovieScalingModeAspectFit MPMovieScalingModeAspectFill 
    } 
} 

- (void) movieReady:(NSNotification*)notification 
{ 
    MPMoviePlayerController *moviePlayer = [notification object]; 

    if ([moviePlayer loadState] != MPMovieLoadStateUnknown) { 
     // Remove observer 
     [[NSNotificationCenter defaultCenter] removeObserver:self 
                 name:MPMoviePlayerLoadStateDidChangeNotification 
                 object:nil]; 

     // When tapping movie, status bar will appear, it shows up 
     // in portrait mode by default. Set orientation to landscape 
     [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO]; 
     [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; 

     // Add movie player as subview 
     [[self view] addSubview:[moviePlayer view]]; 

     // Play the movie 
     [moviePlayer play]; 
     [moviePlayer setFullscreen:YES animated:YES];  
    } 
} 

ответ

35

[Update] По предложению @ReinYem, гораздо лучшее решение, чтобы полагаться на MPMoviePlayerLoadStateDidChangeNotification вместо таймера.

На самом деле, следующее решение не следует рассматривать больше:

Установить controlStyle свойство MPMovieControlStyleNone первоначально, а затем установить его на MPMovieControlStyleFullscreen один второй позже с помощью [performSelector:withObject:afterDelay:1]. Он хорошо работает, элементы управления не отображаются, пока пользователь не нажимает на видео.

+1

Хороший отзыв. Я также обнаружил, что если я установил стиль управления 'MPMovieControlStyleFullscreen' сразу после вызова игры, он достигнет того же результата. Так, может быть, нет причин указывать произвольную 1-секундную задержку? – curthipster

+0

Одна секунда задержки работала и для меня. Я пробовал половину секунды, но это было слишком быстро. –

+0

Да, мне тоже нужно задерживаться, все еще удивляясь, почему мне нужно ввести такую ​​задержку. –

34

Использование обратного вызова вместо таймера:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hidecontrol) 
               name:MPMoviePlayerLoadStateDidChangeNotification 
               object:playerView.moviePlayer]; 

С обратного вызова функции:

- (void) hidecontrol { 
[[NSNotificationCenter defaultCenter] removeObserver:self  name:MPMoviePlayerNowPlayingMovieDidChangeNotification object:playerView.moviePlayer]; 
[playerView.moviePlayer setControlStyle:MPMovieControlStyleFullscreen]; 

} 
+0

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

+0

Это не только «лучшее» решение, но и правильное решение. Другой просто терпит неудачу перед лицом непредсказуемых условий гонки. – kevlar

+3

Не уверен, что это все еще работает на iOS 6. Кажется, случайно, что loadState меняется слишком рано. Наблюдение MPMoviePlayerPlaybackStateDidChangeNotification для изменения состояния воспроизведения в MPMoviePlaybackStatePlaying кажется более надежным. –

10
player.moviePlayer.controlStyle = MPMovieControlStyleNone; 

новейший способ сделать это. :)

+0

работает как очарование – Hammer

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