我的 webview 显示包含视频的网页。这个 webview 包含导航栏和状态栏。
问题是在以横向模式观看视频并返回 webview 后,视图高度发生了变化。并且当时没有任何 webview 方法被调用。
它在人像模式下工作正常。
以下是一些视图的屏幕截图:
观看视频前/观看视频后纵向旋转
横向旋转观看视频后
为什么会这样?
我的 webview 显示包含视频的网页。这个 webview 包含导航栏和状态栏。
问题是在以横向模式观看视频并返回 webview 后,视图高度发生了变化。并且当时没有任何 webview 方法被调用。
它在人像模式下工作正常。
以下是一些视图的屏幕截图:
为什么会这样?
观看视频后尝试添加此行..
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
更新:
- (void)viewWillAppear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(update:) name:@"MPAVControllerPlaybackStateChangedNotification" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(update:) name:@"MPMoviePlaybackStateInterrupted" object:nil];
}
更新方法如下...
#pragma mark -
#pragma mark NSNotification Action
- (void)update:(NSNotification *)n {
NSLog(@">>>>>>>>>>>>>>>>>> Str Key ===>>%@",[NSNotificationCenter defaultCenter]);
NSLog(@"\n\n\n\n\n>>>>>>>>>>> Updateing >> %@ >>>>>>>>\n\n",[n description]);
if ([[[n userInfo]objectForKey:@"MPAVControllerNewStateParameter"] intValue] == 0) {
NSLog(@">>>>>> 1111111111111111111111111111111111111");
}
/*
>>>>>>>>>>> Updateing >> NSConcreteNotification 0x9c85740 {name = MPAVControllerPlaybackStateChangedNotification; object = <MPAVController: 0x6770010>; userInfo = {
MPAVControllerNewStateParameter = 1;
MPAVControllerOldStateParameter = 2;
}}>>>>>>>>
*/
if ([[[n userInfo]objectForKey:@"MPAVControllerNewStateParameter"] intValue] == 1 && [[[n userInfo]objectForKey:@"MPAVControllerOldStateParameter"] intValue] == 2 ) {
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
//[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
}
}
我设法修复它的方法非常简单,基本上是问题的核心:当您旋转视图并且 NavigationController 重新计算其新位置时,它认为它应该位于窗口顶部,因为状态栏是隐。之后显示状态栏和导航栏时,它们是重叠的。
解决这个问题的方法非常简单,只需保留一个 BOOL 来记住您的叠加层是显示还是隐藏,并在您的 ViewController 中实现 willRotateToInterfaceOrientation 和 willAnimateRotationToInterfaceOrientation 。
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if (!isOverlayShowing)
{
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if (!isOverlayShowing)
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
通过在这两种方法中快速显示和隐藏 StatusBar,StatusBar 在 NavigationBar 重新计算其位置的确切时刻显示。我不知道这是否是解决此问题的最佳实施方式,但到目前为止,此方法有效并且不会在屏幕上产生任何闪烁并且非常流畅。