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*)通知中