导航栏和MPMoviePlayerController非常奇怪的行为。 iOS中的错误或我的错误?

时间:2011-12-02 05:13:56

标签: iphone ios uinavigationbar mpmovieplayercontroller

我有一个MPMoviePlayerController对象,可以纵向或横向播放全屏视频。如果我在视频播放时旋转方向并在视频开始播放后几秒钟内完成旋转并且视频状态栏可见,则当视频结束时我的导航栏是完美的。但是,如果我等到视频状态栏在视频播放几秒后消失然后旋转方向,则当视频结束时,navigationBar部分隐藏在状态栏后面,就像向上推。

你见过这样的东西吗?

我可以轻松地重新创建这个bug。我创建了一个新的单视图应用程序,只需添加一个按钮和一个导航栏。如果我在播放视频时旋转方向,点击以启用全屏,视频状态栏仍然可见,视频播放完毕后,一切都很好。但是,如果我在视频状态栏消失后等待旋转,当我旋转并且视频结束时,navigationBar位于状态栏下。见图:

iPhone Image

以下是我正在使用的简单代码:

- (void) playMovie {
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource: @"movie" ofType: @"mov"]];
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: url];

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

moviePlayer.controlStyle = MPMovieControlStyleDefault;
moviePlayer.shouldAutoplay = YES;

[self.view addSubview: moviePlayer.view];
[moviePlayer setFullscreen: YES animated: YES];

- (void) moviePlayBackDidFinish: (NSNotification *) notification
    MPMoviePlayerController *player = [notification object];
[[NSNotificationCenter defaultCenter] removeObserver: self 
                                                name: MPMoviePlayerPlaybackDidFinishNotification 
                                              object: player];

if ([player respondsToSelector: @selector(setFullscreen:animated:)])
{
    [player.view removeFromSuperview];
}

以下是我目前处理以下建议的地方。我一定有错,因为不幸的是我仍有同样的问题。

以下是方法onPlayerWillExitFullScreen

UIView *view = [[[UIApplication sharedApplication] delegate].window.subviews lastObject];    
if (view) {
    [view removeFromSuperview];
    [[[UIApplication sharedApplication] delegate].window addSubview:view]; 
}

MPMoviePlayerController *player = [aNotification object];
[[NSNotificationCenter defaultCenter] removeObserver: self 
                                                name: MPMoviePlayerWillExitFullscreenNotification 
                                              object: player];    

这是我当前的playMovie方法:

 NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource: @"movie" ofType: @"mov"]];
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: url];

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

[[NSNotificationCenter defaultCenter]addObserver: self
                                        selector: @selector(onPlayerWillExitFullScreen:) 
                                            name: MPMoviePlayerWillExitFullscreenNotification 
                                          object: self.moviePlayer];

moviePlayer.controlStyle = MPMovieControlStyleDefault;
moviePlayer.shouldAutoplay = YES;

[self.view addSubview: moviePlayer.view];
[moviePlayer setFullscreen: YES animated: YES];

3 个答案:

答案 0 :(得分:5)

如果您收听MPMoviePlayerWillExitFullscreenNotification通知,则可以强制主视图正确重绘,如下所示。引用的“窗口”是应用程序的主UIWindow对象。

当MPMoviePlayerController切换到全屏时,它实际上会创建一个单独的UIWindow实例来呈现视频。通过在转换回来时捕获通知,此代码将确保您切换回的视图正确重新排列。

不可否认,这不是一个优雅的解决方案,但每次都有效。

UIView *view = [window.subviews lastObject];
if (view) {
     [view removeFromSuperview];
     [window addSubview:view];
}

要收听此通知,您需要执行以下操作,其中self.playerController是您的MPMoviePlayerController对象。

请记住,一旦释放播放器,就停止收听此通知!

    // Determine the default notification centre
    NSNotificationCenter *centre = [NSNotificationCenter defaultCenter];
    // Listen for interesting movie player notifications
    [centre addObserver: self
               selector: @selector(onPlayerWillExitFullScreen:) 
                   name: MPMoviePlayerWillExitFullscreenNotification 
                 object: self.playerController];

答案 1 :(得分:5)

好的,所以我在UIWebView中首先在MPMoviePlayerController中找到了这个与我的应用程序相同的错误,我解决了这个问题,将此代码放在我的视图控制器中。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self.navigationController setNavigationBarHidden:YES animated:YES];
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}

棘手的错误,棘手的修复。

答案 2 :(得分:3)

- (void) moviePlayerWillExitFullScreen:(id)sender {

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

}

伙计们试试这个...它适合我。我尝试了许多其他方法,只有这个方法有效。