Как скрыть управление перед воспроизведением фильма MPMoviePlayerController?

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

Спасибо!

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

- (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];       
    }
}

person ohho    schedule 18.10.2010    source источник


Ответы (3)


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

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

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

person Phil    schedule 27.01.2011
comment
Хороший совет. Я также обнаружил, что если я устанавливаю стиль управления на MPMovieControlStyleFullscreen сразу после вызова воспроизведения, он достигает того же результата. Так может быть, нет причин указывать произвольную задержку в 1 секунду? - person curthipster; 08.06.2011
comment
У меня тоже сработала задержка в одну секунду. Я попробовал полсекунды, но это было слишком быстро. - person Tod Cunningham; 02.10.2011
comment
Да, мне тоже нужна задержка, но я все еще думаю, зачем мне нужно вводить такую ​​задержку. - person VARUN ISAC; 25.02.2014

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

    [[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];

}
person ReinYem    schedule 25.10.2011
comment
Мне очень нравится это решение, так как оно охватывает желаемое поведение гораздо точнее, чем таймер, полностью удаляя условие гонки «воспроизведение, но затем пауза или скрытие» (при условии, что вы очищаете этот наблюдатель и в этих случаях). - person Rob Rix; 19.04.2012
comment
Это не только лучшее решение, это правильное решение. Другой просто терпит неудачу перед лицом непредсказуемых условий гонки. - person kevlar; 30.06.2012
comment
Не уверен, что это все еще работает на iOS 6. Похоже, что loadState изменяется слишком рано. Наблюдение за MPMoviePlayerPlaybackStateDidChangeNotification для изменения состояния воспроизведения в MPMoviePlaybackStatePlaying кажется более надежным. - person David Snabel-Caunt; 12.02.2013
comment
@DavidCaunt: Ваше решение больше не работает. В iOS 7 настройка элементов управления фильмом показывает их немедленно. - person Ricardo Sanchez-Saez; 05.08.2014
comment
Не могли бы вы объяснить, почему вы удаляете наблюдателя для MPMoviePlayerNowPlayingMovieDidChangeNotification? - person eyuelt; 29.08.2014

player.moviePlayer.controlStyle = MPMovieControlStyleNone;

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

person LAMBORGHINI    schedule 20.06.2013