今天测试APP的时候发现一个问题,复现比较困难,所以描述的有点多,具体如下:
当前控制器是push的方法压栈进来的,然后隐藏了导航栏,
wkwebview加载网页,网页里面的video标签,调用了iOS系统的播放器播放视频,
播放结束之后关闭播放器,点击左上角的返回按钮返回,然后导航栏上移了,
纯wkwebview,无导航栏
返回之后导航栏上移
经过一天的努力确定问题原因
wkwebview点击视频播放的时候会调用系统AVPlayerViewController来播放的,具体步骤:
先隐藏当前window的状态栏-->当天window的页面会上移20像素-->再创建新的window显示出来-->把系统播放器加载之后添加到新的window上面进行播放-->播放停止dissmis或者下滑返回
小伙伴们应该看出来问题的所在了,就是返回操作之后系统没有给我们显示状态栏,以及上移的20像素等相关操作,是不是很恶心
解决
方法一:就是让前端的兄弟添加下面的属性,禁止调用系统播放器(比较简单粗暴)
IOS 视频禁止全屏播放 前端将video标签加入属性 webkit-playsinline,如:;
方法二:如果必须使用系统播放器的需求,跟我一样的就用下面的方法
监听UIWindow隐藏,做相关操作
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(endFullScreen) name:UIWindowDidBecomeHiddenNotification object:nil];
//通知回调
-(void)endFullScreen{
NSLog(@"退出全屏");
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
self.navigationController.navigationBar.frame = CGRectMake(0, -44, MainScreenWidth, 44);//矫正导航栏移位
#pragma clang diagnostic pop
}
然后注释掉这个设置
注释该行代码
注:
上面是监听的通知,监听window的隐藏,做相关操作
下面是实现方法,解释一下,
我的当前页面的导航栏是隐藏的,所以显示状态栏时自动上移20像素,系统自动调整
重新设置导航栏bar的内部位置
今天测试了很多的方法,没有解决我的问题,只有这个方法简单的解决了问题,还是觉得这个方法并不好,如果小伙伴们有更好的办法,请留言给我,谢啦
补充:彻底解决了这个问题
当前情况简单说明一下:我的页面包含webview,webview内嵌导航栏的,按照原定计划我是不用显示导航栏的,可是因为这个bug,需要解决,
最终方案
我自己显示了原生导航栏,上面的功能按键都用OC原生写上去了,最终经过很长时间的测试,导航栏移位的问题不再出现了