从MPMoviePlayerController隐藏StatusBar

时间:2010-09-06 17:26:24

标签: iphone ipad mpmovieplayercontroller statusbar

我一直在努力解决一个非常烦人的问题,我希望能在这个问题上找到帮助。

我正在使用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通知而没有运气。

有人可以帮助我吗?

提前致谢。

9 个答案:

答案 0 :(得分:22)

不幸的是,在遇到这个问题之后,通过研究和大量实验,我已经确定在全屏模式下隐藏iOS状态栏几乎是不可能的。无论你做什么,当显示全屏播放器控件时,状态栏也会显示(它不会尊重setStatusBarHidden:YES)。嵌入式播放器控件不是这种情况,但用户可以在嵌入式和全屏模式之间轻松切换,因此在显示控件时,您无法真正使用它来保持状态栏。

当然,当控件淡出时,状态栏至少会消失......

答案 1 :(得分:9)

不要将电影播放器​​的视图添加到主视图中;相反,按照以下模式呈现电影播放器​​(为简洁/清晰省略了一些步骤):

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;


}

答案 2 :(得分:2)

使用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模拟器上测试过)。

答案 3 :(得分:1)

状态栏确实隐藏了,但是再次显示了播放控件。

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

答案 4 :(得分:1)

使用MPMovieControlModeVolumeHidden对我不起作用,唯一有效的是MPMovieControlModeVolumeOnly和全屏视频:

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

而且,我将电影视图作为子视图添加到父视图中:

[parentView addSubview:myMoviePlayer.view];

我的应用程序应该没有状态栏,为了向后兼容,我在app delegate上使用以下代码:

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

答案 5 :(得分:0)

这不是答案,我遇到同样的问题。我可以更新一部分..

状态栏仅显示控件显示的时间。

点击电影,隐藏了conrols&状态栏,再次单击,显示控件,状态栏也会返回。

我也是在启动电影之前以编程方式隐藏状态栏。

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

以下是我添加电影的方式:

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

答案 6 :(得分:0)

对于那些遇到过这个问题的人,我找到了一个可能有帮助的解决方案。它仅适用于您的应用程序的其余部分未显示状态栏以及您是否尝试在影片完成后再次隐藏它并返回到界面时,而不是在播放期间。

如果将MPMoviePlayerController作为子视图添加到正被推送到导航控制器视图堆栈的UIView,则可以使用该父视图控制器的viewWillDisappear方法来帮助您。

在该方法中,您可以将控件样式更改为none,这将在视图消失之前清除所有和所有电影播放器​​控件,并在您已将其设置为隐藏时清除状态栏。这对于用户来说是完全不明显的,因为视图正在离开屏幕并且他们不再与之交互。

答案 7 :(得分:0)

我遇到了同样的问题,但我添加到info.plistStatus bar is initially hidden - Boolean - YES并且它有效! 顺便说一下,我使用的是iOS 5.1,Xcode 4.3.2。

答案 8 :(得分:0)

我不知道我的解决方案是否适用于您的问题,但它适用于我的设置,即运行iOS 5.1的第4代ipod。

我的应用程序根本不显示状态栏,而在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以防止任何控件,但实际上状态栏在从其父视图中删除moviePlayer时显示。