Можно ли отображать UIActivityIndicator поверх MPMoviePlayerController в полноэкранном режиме? - PullRequest
6 голосов
/ 26 сентября 2010

В приложении для iphone я создаю MPMoviePlayerController и инструктирую его начать воспроизведение видео в полноэкранном режиме (я не думаю, что есть какой-либо вариант, кроме режима F / S на iPhone, как вы можете на ipad).

Как только появляется полноэкранный проигрыватель, весь экран становится черным, и иногда в течение нескольких секунд не видно никаких элементов управления (установлено в MPMovieControlStyleDefault).

Через секунду или три появляются элементы управления и первый кадр видео, затем видео начинает буферизироваться и автоматически воспроизводится.

  1. Как отобразить UIActivityIndicator сверхуполноэкранного плеера?Я показываю индикатор сетевой активности sharedApplication, но хочу показать полноразмерный индикатор с меткой «Загрузка ...».

Я попытался добавить его в качестве подпредставления просмотра видеоплеера, фона просмотра видеоплеера, в качестве подпредставления суперпредставления просмотра видеоплеера (конечно, я не ожидал, что это сработает),Я думаю, что ключевым моментом здесь является то, что вид плеера F / S не совпадает с видом плеера, когда он не находится в режиме F / S.Да?Есть ли способ получить доступ к полноэкранному режиму?

2. Должны ли элементы управления быть видимыми (с помощью кнопки «ГОТОВО») раньше для игрока, запущенного в полноэкранном режиме?При запуске полноэкранного проигрывателя фильмов происходит довольно длительная задержка, когда на экране появляется только черный экран, поэтому пользователь не может нажать кнопку «Готово», если ему не терпится (поэтому единственным другим вариантом будет выход из приложения - он предпочел бы предоставить опциюотмените воспроизведение, если хотите.

Заранее спасибо!

Ответы [ 2 ]

7 голосов
/ 27 сентября 2010

Если вы этого еще не сделали, зарегистрируйтесь для уведомления MPMoviePlayerLoadStateDidChangeNotification (http://developer.apple.com/library/ios/documentation/mediaplayer/reference/MPMoviePlayerController_Class/MPMoviePlayerController/MPMoviePlayerController.html#//apple_ref/c/data/MPMoviePlayerLoadStateDidChangeNotification) и подождите, пока переменная loadMtate MPMoviePlayerController изменится на MPMovieLoadStatePlayable, прежде чем представлять проигрыватель фильмов.

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

Теоретически, вы должны иметь возможность добавить индикатор активности в представление MPMovewPlayerController, но я никогда не пробовал такой подход, и, похоже, он вам не подходит.

Другой вариант - добавить представление MPMoviePlayer под существующим индикатором активности. Я успешно только что попробовал это.

[moviePlayer setContentURL:trailer.downloadLink];
moviePlayer.fullscreen = YES;
moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
[moviePlayer prepareToPlay];

[self.navigationController.view addSubview:self.activityIndicator];
self.activityIndicator.center = self.navigationController.view.center;
[self.activityIndicator startAnimating];

moviePlayer.view.frame = self.navigationController.view.bounds;
[self.navigationController.view insertSubview:moviePlayer.view belowSubview:self.activityIndicator];

Вот мои обработчики уведомлений.

#pragma mark MPMoviePlayerController notifications

- (void)moviePlayerLoadStateChanged:(NSNotification *)notif
{
    NSLog(@"loadState: %d", moviePlayer.loadState);
    if (moviePlayer.loadState & MPMovieLoadStateStalled) {
        [self.activityIndicator startAnimating];
        [moviePlayer pause];
    } else if (moviePlayer.loadState & MPMovieLoadStatePlaythroughOK) {
        [self.activityIndicator stopAnimating];
        [moviePlayer play];

    }
}

- (void)moviePlayerPlaybackFinished:(NSNotification *)notif
{
    [moviePlayer.view removeFromSuperview];
    [self.activityIndicator stopAnimating];
}
0 голосов
/ 25 февраля 2012

Мне не понравился тот факт, что ActivityIndicator отображается в центре экрана, потому что у видеоплеера он уже есть.Я предпочитаю отображать его на верхней панели инструментов:

-(void)activityIndicatorAnimate :(int)action
{
    if (action == 0) {
        /* STOP ANIMATING ACTIVITY INDICATOR */        
        if (activityIndicator != nil) {
        [[self navigationItem] setRightBarButtonItem:nil];
        [activityIndicator stopAnimating];
        [activityIndicator release];
        activityIndicator = nil;
    }
    NSLog(@"Stop activityIndicator");
    } else if (action == 1) {
        /* START ANIMATING ACTIVITY INDICATOR */
        if (activityIndicator == nil) {
            activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
            UIBarButtonItem * barButton = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
            [[self navigationItem] setRightBarButtonItem:barButton];            
            [barButton release];
            NSLog(@"Start activityIndicator");
        }

        [activityIndicator startAnimating];
    }

}
...