iOS 12.0 WebView键盘弹出,关闭后界面没有回收的问题
iOS 12.0 WebView键盘弹出,关闭后界面没有回收的问题
背景
公司有人反馈,iOS 12.0的手机上,H5页面有个地方键盘弹出了,关闭之后,再次点击输入框,没有反应了,其实是界面上移了之后,没有回到原来的位置。所以导致再次点击输入框时,没有反应
修改
最开始,修改方法时,添加iOS 12.0之后,设置 contentInsetAdjustmentBehavior
为 UIScrollViewContentInsetAdjustmentAutomatic
,设置了之后,键盘的问题解决了,但是又出现新的问题,iPhone X系列的全面屏的适配,之前H5页面body写的height:100%
的地方,会显示高度不对。
if (@available(iOS 12.0, *)) {
self.web.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic;
}
于是笔者再次尝试修改:
参考iOS12 WKWebView出现input 键盘页面上顶不下移解决方法,在H5界面监听键盘弹出和收起,在收起时,对webview的scrollview做偏移处理,设置后,发现对笔者的项目来说仍旧不生效,笔者的项目同一个网页上有多个可输入的地方,且有在弹出框输入的操作。
故而再次修改:
笔者发现,有人给出参考方法,由H5端,监听键盘弹起和回收,然后进行处理,但是如果让H5处理,需要每个业务的H5都要单独处理,所以笔者就想,由原生监听键盘收起的通知,然后调用js的方法,代码如下:
viewDidLoad中,针对版本处理进行处理,添加键盘回收的通知
if (zDeviceVersion.floatValue >= 12.0 && zDeviceVersion.floatValue < 13.0) { // 兼容12.0的系统问题
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
然后在通知的方法中实现,调用JS处理方法
- (void)keyboardWillHide:(NSNotification *)note {
NSString *jsStr =
@"setTimeout(() => {const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0;window.scrollTo(0, Math.max(scrollHeight - 1, 0));}, 300);";
[self.web evaluateJavaScript:jsStr completionHandler:nil];
}