MPMoviePlayerViewController Скрыть строку состояния

У меня есть приложение для iPad, которое создает и показывает видео с расширением MPMoviePlayerViewController. Вот мой код:

MPMoviePlayerViewController *mpvc = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:URLEncode(uri)]];
[mpvc setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[mpvc setWantsFullScreenLayout:YES];
[<MainViewController> presentModalViewController:mpvc animated:YES];

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

Я пытался сделать:

[mpvc setWantsFullScreenLayout:YES];
[[UIApplication sharedApplication] setStatusBarHidden:YES];

И ничего не работает, ОДНАКО, если я также поставлю:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent];

Строка состояния исчезает! Но размер Movie Controller по-прежнему изменяется, как если бы строка состояния была там (даже когда я уже использовал -setWantsFullScreenLayout:).

Может ли кто-нибудь указать мне простой (проверенный) способ показать видео без строки состояния?

Спасибо.


person almosnow    schedule 15.09.2010    source источник


Ответы (3)


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

Мне пришлось сделать это пару дней назад, я думаю, что ваша проблема просто не вызывает скрытие в строке состояния после начала воспроизведения видео. В любом случае у меня есть проверенный код, который работает от 3.0 до 4.2:

- (IBAction) playIntroVideo
{
    NSString *videoString = [[NSBundle mainBundle] pathForResource:@"intro" ofType:@"mp4"];
    NSURL *videoURL = [NSURL fileURLWithPath:videoString];
    _player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];

    if
    (
        [_player respondsToSelector:@selector(view)] &&
        [_player respondsToSelector:@selector(setFullscreen:animated:)] &&
        [_player respondsToSelector:@selector(setControlStyle:)]
    )
    {
        [[_player view] setFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT_FULL)];
        [_player setFullscreen:YES animated:YES];
        [_player setControlStyle:MPMovieControlStyleNone];
        [self.view addSubview:[_player view]];
    }

    [_player play];

    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(terminateVideo)
     name:MPMoviePlayerPlaybackDidFinishNotification
     object:nil];   

    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    self.navigationController.navigationBarHidden = YES;
}

- (void) terminateVideo
{
    [[UIApplication sharedApplication] setStatusBarHidden:NO];
    self.navigationController.navigationBarHidden = NO;

    if ([_player respondsToSelector:@selector(view)])
    {
        [[_player view] removeFromSuperview];   
    }

    _player = nil;
    [_player release];
}
person Simon    schedule 15.12.2010

Ответ на этот вопрос имеет ошибку в конце:

_player = nil;
[_player release];

Они должны быть обращены:

[_player release];
_player = nil;

Обмен сообщениями nil с Release не имеет никакого эффекта.

person Sebastien Martin    schedule 14.01.2011

Вы можете установить UIStatusBarHidden в свой plist, это должно решить проблему :)

person Mikael    schedule 12.12.2010
comment
UIStatusBarHidden. Нет, это не помогает. - person Sergey Kopanev; 21.06.2011
comment
Скрытие строки состояния для всего приложения, чтобы она не появлялась во время воспроизведения фильма, не является подходящим решением. - person Dave Batton; 28.03.2012