网页在iOS12键盘隐藏时视图发生偏移

背景

  在iOS系统中会经常嵌入网页,在键盘输入的时候为了不遮挡键盘为使视图居中显示。但在此时在不同版本系统下或者使用不同的WebView(UIWebView或者WKWebView),会造成一些视图的偏移问题,以下介绍的是其中一个问题。

问题描述

  在iOS12系统下,使用WKWebView,并把该WKWebView的scrollview的contentInsetAdjustmentBehavior设置为UIScrollViewContentInsetAdjustmentNever。这一操作的原因是因为在iOS11的时候,初期适配为了使用MJRefresh,不设置这一属性会造成网页回弹有问题。在这种历史原因下,随着iOS12的推出,此时却出现了网页适配问题,即打开键盘的时候由于为了避免遮挡,视图会上移,输入完成后键盘隐藏,此时视图却没有回到正常的位置。如下图所示:

  使用前:

Simulator Screen Shot - iPhone X - 2018-10-10 at 14.25.30.png

  打开键盘时

Simulator Screen Shot - iPhone X - 2018-10-10 at 14.27.14.png

  键盘收起后

Simulator Screen Shot - iPhone X - 2018-10-10 at 14.28.22.png

  查看视图布局,发现此时webview并未发生移动,而是里面的视图发生了移动,未回到正确的位置。

WX20181010-143244.png

解决方案

  在github上面找到类似问题UI breaks when OSKB displays on iOS 12 - Ionic 4 Beta 7, Capacitor 1 beta-8ionic-team/capacitor#814,稍有不同的时网页使用了viewport-fit=cover的属性,而我这里碰到的问题是没有使用这个属性也出现了视图偏移未回弹到正确位置。问题中提到的两个解决方案,一个是去掉viewport-fit=cover和使用UIWebView,我测试过UIWebView确实可以保证正常,而viewport-fit=cover我并未使用这个属性,可供有使用这个属性的参考。我这里有第三种解决方案,即在iOS12下恢复webview的scrollview的UIScrollViewContentInsetAdjustmentAutomatic属性:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 120000 // iOS 12.0 supported
    if (@available(iOS 12.0, *)) {
        webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic;
    } else {
        // Fallback on earlier versions
    }
#else
    // Pre-iOS 7 code here
#endif
最近的文章

iOS原生工程嵌入flutter多实例研究

背景​ 随着跨平台开发越来越流行,flutter的横空出世,给很多人在h5、rect native之外的另一种选择。由于h5和rect native都存在着性能的问题,而谷歌开始推出flutter时宣传性能出众,更贴近原生,于是便想着用现有的iOS工程嵌入flutter,来看看效果。以下是对flutter的一些研究。嵌入Flutter1、官方嵌入方法​ 官方提供的嵌入方法是基本引入的pod工程,详细情况可看教程https://github.com/flutter/flutter/wiki/...…

继续阅读
更早的文章

iOS本地js文件加密

背景  app本地网页文件一般情况下会选择对js进行混淆加密,但混淆加密只是对js文件中的内容进行的混淆,在一定程度上还是可以还原出来。现在介绍另外一种加密方式,虽说此种加密方式也不完全不能还原出来,但可以尽量减少性能影响的情况下提高解密难度。  此种方式Android和iOS两种平台都可使用,只存在少量差别,总体思路一样。加密方式详解重定向js文件  常规的混淆加密方式只是对字符串进行了混淆,但如果在浏览器中调试仍然可以看清网页执行的来龙去脉。如果我们能够捕获网页所需要加载的js文件...…

继续阅读