iOS在WKWebView中加载页面时自动弹出软键盘_webview.keyboarddisplayrequiresuseraction-程序员宅基地

技术标签: iOS软键盘  UIWebView  WKWebView  

实现方式(UIWebView)

首先需要web端设置input为focus聚焦状态,然后设置UIWebView的keyboardDisplayRequiresUserAction属性,默认为YES。如果设置为YES,用户必须明确的点击页面上的元素来显示键盘;如果设置为NO,则进入web页面会自动弹出键盘。

实现方式(WKWebView)

目前我们基本都用WKWebView来代替UIWebView,因为WKWebView与UIWebView相比较,拥有更快的加载速度和性能,更低的内存占用,更加细致的委托协议配置。但是WKWebView并没有UIWebView的keyboardDisplayRequiresUserAction属性,那就只能通过runtime处理了(同时也需要web端设置input为focus聚焦状态),如下:

一、导入runtime头文件
#import <objc/runtime.h>
二、在使用了WKWebView的Controller中添加方法
- (void)allowDisplayingKeyboardWithoutUserAction {
    Class class = NSClassFromString(@"WKContentView");
    NSOperatingSystemVersion iOS_11_3_0 = (NSOperatingSystemVersion){11, 3, 0};
    NSOperatingSystemVersion iOS_12_2_0 = (NSOperatingSystemVersion){12, 2, 0};
    NSOperatingSystemVersion iOS_13_0_0 = (NSOperatingSystemVersion){13, 0, 0};
    if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion: iOS_13_0_0]) {
        SEL selector = sel_getUid("_elementDidFocus:userIsInteracting:blurPreviousNode:activityStateChanges:userObject:");
        Method method = class_getInstanceMethod(class, selector);
        IMP original = method_getImplementation(method);
        IMP override = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, BOOL arg3, id arg4) {
            ((void (*)(id, SEL, void*, BOOL, BOOL, BOOL, id))original)(me, selector, arg0, TRUE, arg2, arg3, arg4);
        });
        method_setImplementation(method, override);
    }else if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion: iOS_12_2_0]) {
        SEL selector = sel_getUid("_elementDidFocus:userIsInteracting:blurPreviousNode:changingActivityState:userObject:");
        Method method = class_getInstanceMethod(class, selector);
        IMP original = method_getImplementation(method);
        IMP override = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, BOOL arg3, id arg4) {
            ((void (*)(id, SEL, void*, BOOL, BOOL, BOOL, id))original)(me, selector, arg0, TRUE, arg2, arg3, arg4);
        });
        method_setImplementation(method, override);
    }else if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion: iOS_11_3_0]) {
        SEL selector = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:changingActivityState:userObject:");
        Method method = class_getInstanceMethod(class, selector);
        IMP original = method_getImplementation(method);
        IMP override = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, BOOL arg3, id arg4) {
            ((void (*)(id, SEL, void*, BOOL, BOOL, BOOL, id))original)(me, selector, arg0, TRUE, arg2, arg3, arg4);
        });
        method_setImplementation(method, override);
    } else {
        SEL selector = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:userObject:");
        Method method = class_getInstanceMethod(class, selector);
        IMP original = method_getImplementation(method);
        IMP override = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, id arg3) {
            ((void (*)(id, SEL, void*, BOOL, BOOL, id))original)(me, selector, arg0, TRUE, arg2, arg3);
        });
        method_setImplementation(method, override);
    }
}
三、在Controller的viewDidLoad方法中调用
[self allowDisplayingKeyboardWithoutUserAction];
现在进入web页面即会自动弹出软键盘了~

参考:Stack Overflow

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/c_furong/article/details/115206924

智能推荐

Python图像处理库PIL的滤波_ImageFilter_简述pil对图像进行滤波处理有哪些滤波器?-程序员宅基地

文章浏览阅读4.4k次,点赞10次,收藏36次。 Python图像处理库PIL的滤波_ImageFilterImageFilter模块提供了滤波器相关定义;这些滤波器主要用于Image类的filter()方法。一、ImageFilter模块所支持的滤波器当前的PIL版本中ImageFilter模块支持十种滤波器:1、 BLURImageFilter.BLUR为模糊滤波,处理之后的图像会整体变得模糊。..._简述pil对图像进行滤波处理有哪些滤波器?

Qt Quick 常用元素:RadioButton(单选框),CheckBox(复选框) 与 GroupBox(分组框)_qml radiobutton-程序员宅基地

文章浏览阅读125次。先介绍一下 ExclusiveGroup。ExclusiveGroup (互斥分组)本身是不可见元素,用于将若干个可选择元素组合在一起, 供用户选择其中的一个选项。你可以在 ExclusiveGroup 对象中定义 RadioButton、CheckBox、Action 等元素,此时不需要设置它们的 exclusiveGroup 属性;_qml radiobutton

vue处理json数据的原理_vue中json处理方法-程序员宅基地

文章浏览阅读2.7k次。json后端给我的数据,现在要将 标准陪练-5节 这条数据不展示。我的想法第一想法是要么隐藏,要么处理json删除这条数据。我用delete,但是发现原json长度不变只是变空了,而且在v-for渲染的时候报错了{{item.lesson_name}}var app = new Vue({el:"#myapp",data:function(){return{json:[{"type_name":"..._vue如何将json数据变为空

JSON提取器-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏24次。1.创建json提取器、相关配置及使用Variable names:保存的变量名,后面使用${Variable names}引用JSON Path expressions:调试通过的json path表达式Match Numbers:匹配数字(0代表随机,1代表第一个,-1代表所有)Default Values:找不到时默认值,一般设置为NOT FOUNDCompute concate..._json提取器

Java基于SpringBoot的药店管理系统(亮点:Echarts数据可视化)_基于售药机的可视化控制系统-程序员宅基地

文章浏览阅读267次,点赞6次,收藏12次。今天带来的是基于java springboot的药店药品管理系统,医药药品行业是关乎民生的行业, 一个不小心很可能造成严重的后果。因此, 为了让药店管理日常业务能够更加快速、高效、准确的运转, 设计一个适合的药店管理系统对一家药店来说是十分重要的。_基于售药机的可视化控制系统

学习vue_vue new set-程序员宅基地

文章浏览阅读329次。1.MVVM模式 2.CMD命令操作3.CDN4.ES6-键值对5.模板字符串 6.生命周期钩子7.数组侦听 8.事件对象属性9.事件修饰符 10.v-model修饰符11.key属性的作用 12.v-if与v-show的区别13. v-for与v-if一同使用的注意事项14. 父子组件之间传递数据的方法 子组件向父组件传递数据 +父组件向子组件传递数据 15.单页应用(SPA) _vue new set

随便推点

使用Let's Encrypt申请永久免费通配符证书_不能直接用域名后缀申请通配符证书!-程序员宅基地

文章浏览阅读5.1k次,点赞3次,收藏11次。由于现在网络安全形势的影响,大多数网站都启用了https。本文介绍一种申请永久免费的通配符证书的方法,可以适配一个域名下的所有站点(例如:www.abc.com和子域名ss.abc.com都可以用一个证书启用https)。我所使用的申请证书的环境是Centos7,因为这个是官方提供的是一个python的程序,有一些依赖的库,要pip下载,因为有些链接容易超时,还是建议把pip的源改到中国来。申..._不能直接用域名后缀申请通配符证书!

SDL2.0自己整理的学习教程+自己的学习笔记_sdl2 教程 pdf-程序员宅基地

文章浏览阅读2.4k次。网上大多教程教的比较浅 以下部分是我结合教程和自己上SDL官网一个一个找出来翻译的写的比较乱见谅第一章hello喜欢先发代码在分析 #include "SDL2\SDL.h"#include "SDL2\SDL_image.h"#undef mainint main(int argc, char* args[]){SDL_Window *p = NULL;/*窗口*_sdl2 教程 pdf

tensorboard 如何显示两个模型的对比?_tensorboard 对比不同模型训练-程序员宅基地

文章浏览阅读2.3k次。我将两组模型一个用softmax分类器分类,一个直接线性输出,想比较一下训练过程中的参数变化.一个放到了./json/下,一个放到了./json/Acc下试用的网上的语句失败tensorboard --logdir = run1:"./json/" , run2:"./json/Acc/"这样的路径,每次要么直接乱码,要么直接就找不到文件。后来发现去掉 --logdir 后面的”=“直接输入大的文件夹./json/tensorboard --logdir ./json/_tensorboard 对比不同模型训练

VUE el-input正则验证-程序员宅基地

文章浏览阅读4.6k次。①只能输入大于0的整数check(value) { let reg = /^[1-9]\d*$/; var _this = this; if (value) { if (new RegExp(reg).test(value) == false) { setTimeout(() => { ..._vue el正则检验

计算机网络②:物理层/MAC层概念、交换机与VLAN、ICMP与ping、网关gateway、路由协议_物理层 mac层-程序员宅基地

文章浏览阅读1k次。第2章:从二层到三层从物理层到MAC层2.1 物理层、MAC层概念IP层要封装了MAC层才能将网络包放入物理层局域网:LAN,Local Area NetworkMAC:Medium Access Control:媒体访问控制第二层名为链路层,主要解决三个问题:①网络包的发给谁,谁接收 :这里要用到一个物理地址,叫做链路层地址,也叫MAC层地址(因为该层主要解决媒体接入控制问题)。②多路访问:媒体接入控制(控制谁先发,谁后发,防止混乱):例如随机接入协议。③发送时出现错误怎么办_物理层 mac层

python和java哪个更值得学,python和java哪个好学点-程序员宅基地

文章浏览阅读533次,点赞25次,收藏10次。Python与Java新手应该选哪个?应该是当今讨论最为热门的话题了。(文末送福利)在过去的几年中,Python的普及速度令人惊叹,Java的王者地位也常年不衰用python代码画雪人。目前两者的竞争愈发激烈,怎么选择成为了许多初学者萦绕心中的问题,网上有很多版本的说法牵引着他们的思维,让本来很简单的问题复杂化。这篇文章,我将会带领你们了解Python与Java之间的区别,各自的优点,相信读完之后,你就会有了自己的答案。