Скрыть StatusBar от MPMoviePlayerController

Я изо дня в день борется с очень раздражающей проблемой, и я надеюсь, что смогу найти помощь на этой доске.

Я использую MPMoviePlayerController для воспроизведения полноэкранного фильма на iPad, и я не могу понять, как удалить строку состояния, которая всегда отображается, несмотря на все мои усилия, направленные на то, чтобы попасть в ад.

Вот код метода, который я использую для показа фильма:

-(void)launchVideoFromButton:(id)sender{

         NSString *videoPath = [[NSBundle mainBundle] pathForResource:@"movie01" ofType:@"m4v"];
         NSURL *videoPathURL = [NSURL fileURLWithPath:videoPath];
         moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoPathURL];

         [self.view addSubview:moviePlayer.view];

         moviePlayer.shouldAutoplay = YES;
         moviePlayer.movieSourceType = MPMovieSourceTypeFile;


         [moviePlayer setFullscreen:YES animated:YES];
         moviePlayer.controlStyle = MPMovieControlStyleFullscreen;

         NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
         [notificationCenter addObserver:self selector:@selector(moviePlayerEvent:) name:MPMoviePlayerLoadStateDidChangeNotification object:moviePlayer];

    }



    -(void)moviePlayerEvent:(NSNotification*)aNotification{

         [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];
         NSLog(@"%i", [UIApplication sharedApplication].statusBarHidden);

    }

В консоли я вижу, что moviePlayerEvent запускается, когда появляется фильм, но строка состояния все еще существует: [[UIApplication sharedApplication] setStatusBarHidden: YES withAnimation: NO] кажется, не работает. Я пытался использовать другие уведомления MPMoviePlayerController без везения.

Может ли кто-нибудь помочь мне в этом?

Спасибо заранее.

Ответы

Ответ 1

К сожалению, после того, как я столкнулся с этой проблемой, проведя исследования и много экспериментов, я решил, что сохранить статус строки состояния iOS в полноэкранном режиме практически невозможно. Независимо от того, что вы делаете, когда отображаются элементы управления полноэкранным проигрывателем, так же будет строка состояния (она не будет уважать setStatusBarHidden:YES). Это не относится к встроенным элементам управления плеером, но пользователь может легко переключаться между встроенными и полноэкранными режимами, поэтому вы не можете использовать это для поддержания состояния, когда отображаются элементы управления.

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

Ответ 2

Не добавляйте просмотр фильма на главный экран; вместо этого, представить фильм-плеер следующим образом (некоторые шаги опущены для краткости/ясности):

moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:url];

// Register for the playback finished notification.
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(myMovieFinishedCallback:)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:moviePlayerViewController.moviePlayer];


//Present
    [self presentMoviePlayerViewControllerAnimated:moviePlayerViewController];

    // Play the movie!
    self.moviePlayerViewController.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
    [self.moviePlayerViewController.moviePlayer play];



// When the movie is done, release the controller.
-(void)myMovieFinishedCallback:(NSNotification*)aNotification
{

    //NSLog(@"playback terminated");

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:moviePlayerViewController.moviePlayer];


    [moviePlayerViewController release], moviePlayerViewController = nil;


}

Ответ 3

Это помогло мне использовать MPMoviePlayerViewController, установив следующие

[moviePlayerController.moviePlayer setFullscreen:YES animated:NO];
moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;

до этого:

[self presentViewController:moviePlayerController animated:NO completion:^{ }];

и сразу после:

moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleNone;

на всякий случай, я также сделал это:

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

...


- (void)moviePlayerLoadStateDidChange:(NSNotification *)notification {


    if ([[moviePlayerController moviePlayer] loadState] == MPMovieLoadStateStalled) {

    } else if([[moviePlayerController moviePlayer] loadState] != MPMovieLoadStateUnknown) {

        [moviePlayerController moviePlayer].controlStyle = MPMovieControlStyleNone;

        ...
    }
}

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

(Протестировано на устройстве iOS 5.1 и симуляторе 6.0).

Ответ 4

Строка состояния скрывалась, но снова показывалась с помощью управления воспроизведением.

  -(void)viewDidLoad:{
        [super viewDidLoad];
        MPMoviePlayerViewController *moviePlayerViewController =
                [[MPMoviePlayerViewController alloc] initWithContentURL:videoURL];

        [[NSNotificationCenter defaultCenter] addObserver:self 
                 selector:@selector(playbackStateChange:)
                 name:MPMoviePlayerLoadStateDidChangeNotification
                 object:moviePlayerViewController.moviePlayer];
    }
    -(void)playbackStateChange:(NSNotification*)notification{
        if([[UIApplication sharedApplication]respondsToSelector:@selector(setStatusBarHidden: withAnimation:)])
        [[UIApplication sharedApplication] setStatusBarHidden:YES 
                       withAnimation:UIStatusBarAnimationNone];
        else 
            [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];
}

Ответ 5

Использование MPMovieControlModeVolumeHidden не работало для меня, единственным, с кем работал MPMovieControlModeVolumeOnly с видео в полноэкранном режиме:

myMoviePlayer.controlStyle = MPMovieControlModeVolumeOnly;
[myMoviePlayer setFullscreen:YES];

Кроме того, я добавляю просмотр фильма в виде представления в родительском представлении:

[parentView addSubview:myMoviePlayer.view];

У моего приложения не должно быть строки состояния и для обратной совместимости. Я использую следующий код для делегата приложения:

if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden: withAnimation:)])
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
else
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];

Ответ 6

Это не ответ, у меня такая же проблема. Однако есть одна часть, которую я могу обновить.

Строка состояния отображается только тогда, когда отображаются элементы управления.

Нажав на фильм, скрывает конроли и строку состояния, снова нажимает, показывает элементы управления, и строка состояния снова возвращается.

Я также скрываю строку состояния программным образом непосредственно перед запуском фильма.

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];

и вот как я добавляю фильм:

[[[UIApplication sharedApplication] keyWindow] addSubview: movieView];

Ответ 7

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

Если ваш MPMoviePlayerController добавляется в качестве подсмотра в UIView, который помещается в стек представления диспетчера навигации, вы можете использовать этот метод просмотра viewLillDisappear для родительского представления, чтобы помочь вам.

В этом методе вы можете изменить стиль управления на none, который очистит все элементы управления проигрывателем до того, как исчезнет вид, и очистит строку состояния, если вы уже установили ее скрытую. Это будет совершенно неподходящим для пользователя, поскольку представление перемещается с экрана, и они больше не взаимодействуют с ним.

Ответ 8

У меня была такая же проблема, но я добавил в свою строку info.plist Status bar is initially hidden - Boolean - YES, и она работает!
BTW Я использую iOS 5.1, Xcode 4.3.2.

Ответ 9

Я не знаю, применимо ли мое решение к вашей проблеме, но оно работает для моей настройки, то есть 4-го поколения ipod с iOS 5.1.

Мои приложения не показывают строку состояния вообще, а в файле info.plist соответствующая запись "Строка состояния изначально скрыта" установлена ​​на YES.

Я также напрямую добавляю представление MPMoviePlayerController к его родительскому представлению. Вот код для настройки проигрывателя видео:

moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:theurl];
[moviePlayer.view setFrame:frame]; // This is set to (0, 0, 320, 480)
[moviePlayer prepareToPlay];
[moviePlayer setShouldAutoplay:YES]; 
moviePlayer.fullscreen = TRUE;
moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
[self.view addSubview:moviePlayer.view];

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

MoviePlayer - это переменная класса.

Когда игрок заканчивает игру или когда зритель нажимает кнопку "Готово" контроллера moviePlayer, метод playbackFinished: вызывается:

- (void)playBackFinished:(NSNotification *)notif{
moviePlayer.controlStyle = MPMovieControlStyleNone;
[moviePlayer stop];
[moviePlayer.view removeFromSuperview];

[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
[moviePlayer release];
moviePlayer = nil;
}

В котором для стиля управления MoviePlayer установлено значение MPMovieControlStyleNone, чтобы предотвратить любые элементы управления, но по существу строка состояния отображается, когда фильм-плеер удаляется из родительского представления.