d.a*_*man 6 iphone uinavigationbar mpmovieplayercontroller ios
我有一个MPMoviePlayerController以纵向或横向方式播放全屏视频的对象.如果我在视频播放时旋转方向并在视频开始播放后几秒钟内完成旋转并且视频状态栏可见,则当视频结束时我的导航栏是完美的.但是,如果我等到视频状态栏消失几秒钟进入视频播放然后旋转方向,当视频结束时我navigationBar部分隐藏在状态栏后面,就像向上推.
你见过这样的东西吗?
我能够轻松地重新创建这个bug.我创建了一个新的单视图应用程序,只需添加一个按钮和一个导航栏.如果我在播放视频时旋转方向,点击以启用全屏,视频状态栏仍然可见,视频播放完毕后,一切都很好.但是,如果我在视频状态栏消失后等待旋转,当我旋转并且视频结束时,navigationBar位于状态栏下.见图:
这是我正在使用的简单代码:
- (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];
}
Run Code Online (Sandbox Code Playgroud)
以下是我目前所处的建议.我一定有错,因为不幸的是我仍然有同样的问题.
这是方法 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];
Run Code Online (Sandbox Code Playgroud)
这是我目前的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];
Run Code Online (Sandbox Code Playgroud)
如果您收听MPMoviePlayerWillExitFullscreenNotification通知,则可以强制主视图正确重绘,如下所示.引用的"窗口"是应用程序的主UIWindow对象.
当MPMoviePlayerController切换到全屏时,它实际上创建了一个单独的UIWindow实例来呈现视频.通过在转换回来时捕获通知,此代码将确保您切换回的视图正确重新排列.
不可否认,这不是一个优雅的解决方案,但它确实每次都有效.
UIView *view = [window.subviews lastObject];
if (view) {
[view removeFromSuperview];
[window addSubview:view];
}
Run Code Online (Sandbox Code Playgroud)
要收听此通知,您需要执行以下操作,其中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];
Run Code Online (Sandbox Code Playgroud)
好的,所以我在UIWebView中首先在MPMoviePlayerController中找到了这个与我的应用程序相同的错误,我解决了这个问题,将此代码放在我的视图控制器中.
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.navigationController setNavigationBarHidden:YES animated:YES];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
棘手的错误,棘手的修复.
| 归档时间: |
|
| 查看次数: |
3475 次 |
| 最近记录: |