Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 导航栏和MPMoviePlayerController的异常行为。iOS中的Bug还是我的错误?_Iphone_Ios_Uinavigationbar_Mpmovieplayercontroller - Fatal编程技术网

Iphone 导航栏和MPMoviePlayerController的异常行为。iOS中的Bug还是我的错误?

Iphone 导航栏和MPMoviePlayerController的异常行为。iOS中的Bug还是我的错误?,iphone,ios,uinavigationbar,mpmovieplayercontroller,Iphone,Ios,Uinavigationbar,Mpmovieplayercontroller,我有一个MPMoviePlayerController对象,可以在纵向或横向全屏播放视频。如果我在视频播放时旋转方向,并在视频开始播放且视频状态栏可见后的几秒钟内旋转,当视频结束时,我的导航栏是完美的。但如果我等到视频状态栏在视频播放几秒钟后消失,然后旋转方向,当视频结束时,我的导航栏部分隐藏在状态栏后面,如向上推 你见过这样的事吗 我可以很容易地重现这个bug。我创建了一个新的单视图应用程序,只添加了一个按钮和一个导航栏。如果我在播放视频时旋转方向,点击以启用全屏,视频状态栏仍然可见,当视频结

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

你见过这样的事吗

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

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

- (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];
}
以下是我目前的情况,并给出了以下建议。我一定是出了什么问题,因为不幸的是我仍然有同样的问题

以下是全屏播放的方法
onplayerwillexit

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

如果您收听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];

好的,我在我的应用程序中发现了这个奇怪的错误,首先是在UIWebView中,然后是在MPMoviePlayerController中,我将代码放在我的视图控制器中解决了这个问题

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self.navigationController setNavigationBarHidden:YES animated:YES];
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}
棘手的错误,棘手的修复

- (void) moviePlayerWillExitFullScreen:(id)sender {

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

}

伙计们试试这个。。。它对我有用。我尝试了许多其他方法,但只有这一种有效。

您可能需要包括一两个屏幕截图。您的屏幕截图链接已断开。谢谢您的帮助。我是编程新手,所以我不太确定如何实现该通知,但我将尝试一下。知道有一个解决方案,我感到非常欣慰。我更新了我的答案,为您提供了这个解决方案。我对UIWindow对象感到困惑。以我的简单测试应用程序为例,我只有一个单一的视图应用程序,只有一个按钮和一个导航栏。我试图用“self.view”将“window”分为子窗口,但一定不正确。在应用程序委托中,您将有一个对UIWindow对象的引用-这就是您想要的对象。感谢您的耐心等待!在我的应用程序委托文件中,它指的是UIWindow*窗口,合成为window=\u window。window和_window都给了我一个未声明的标识符错误。最后!!非常感谢你。我不得不玩一点,但还是成功了。我把代码放在我的-(作废)电影完成:(NSNotification*)通知中