技术标签: iOS软键盘 UIWebView WKWebView
首先需要web端设置input为focus聚焦状态,然后设置UIWebView的keyboardDisplayRequiresUserAction属性,默认为YES。如果设置为YES,用户必须明确的点击页面上的元素来显示键盘;如果设置为NO,则进入web页面会自动弹出键盘。
目前我们基本都用WKWebView来代替UIWebView,因为WKWebView与UIWebView相比较,拥有更快的加载速度和性能,更低的内存占用,更加细致的委托协议配置。但是WKWebView并没有UIWebView的keyboardDisplayRequiresUserAction属性,那就只能通过runtime处理了(同时也需要web端设置input为focus聚焦状态),如下:
#import <objc/runtime.h>
- (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);
}
}
[self allowDisplayingKeyboardWithoutUserAction];
文章浏览阅读4.4k次,点赞10次,收藏36次。 Python图像处理库PIL的滤波_ImageFilterImageFilter模块提供了滤波器相关定义;这些滤波器主要用于Image类的filter()方法。一、ImageFilter模块所支持的滤波器当前的PIL版本中ImageFilter模块支持十种滤波器:1、 BLURImageFilter.BLUR为模糊滤波,处理之后的图像会整体变得模糊。..._简述pil对图像进行滤波处理有哪些滤波器?
文章浏览阅读125次。先介绍一下 ExclusiveGroup。ExclusiveGroup (互斥分组)本身是不可见元素,用于将若干个可选择元素组合在一起, 供用户选择其中的一个选项。你可以在 ExclusiveGroup 对象中定义 RadioButton、CheckBox、Action 等元素,此时不需要设置它们的 exclusiveGroup 属性;_qml radiobutton
文章浏览阅读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数据变为空
文章浏览阅读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提取器
文章浏览阅读267次,点赞6次,收藏12次。今天带来的是基于java springboot的药店药品管理系统,医药药品行业是关乎民生的行业, 一个不小心很可能造成严重的后果。因此, 为了让药店管理日常业务能够更加快速、高效、准确的运转, 设计一个适合的药店管理系统对一家药店来说是十分重要的。_基于售药机的可视化控制系统
文章浏览阅读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
文章浏览阅读5.1k次,点赞3次,收藏11次。由于现在网络安全形势的影响,大多数网站都启用了https。本文介绍一种申请永久免费的通配符证书的方法,可以适配一个域名下的所有站点(例如:www.abc.com和子域名ss.abc.com都可以用一个证书启用https)。我所使用的申请证书的环境是Centos7,因为这个是官方提供的是一个python的程序,有一些依赖的库,要pip下载,因为有些链接容易超时,还是建议把pip的源改到中国来。申..._不能直接用域名后缀申请通配符证书!
文章浏览阅读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
文章浏览阅读2.3k次。我将两组模型一个用softmax分类器分类,一个直接线性输出,想比较一下训练过程中的参数变化.一个放到了./json/下,一个放到了./json/Acc下试用的网上的语句失败tensorboard --logdir = run1:"./json/" , run2:"./json/Acc/"这样的路径,每次要么直接乱码,要么直接就找不到文件。后来发现去掉 --logdir 后面的”=“直接输入大的文件夹./json/tensorboard --logdir ./json/_tensorboard 对比不同模型训练
文章浏览阅读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正则检验
文章浏览阅读1k次。第2章:从二层到三层从物理层到MAC层2.1 物理层、MAC层概念IP层要封装了MAC层才能将网络包放入物理层局域网:LAN,Local Area NetworkMAC:Medium Access Control:媒体访问控制第二层名为链路层,主要解决三个问题:①网络包的发给谁,谁接收 :这里要用到一个物理地址,叫做链路层地址,也叫MAC层地址(因为该层主要解决媒体接入控制问题)。②多路访问:媒体接入控制(控制谁先发,谁后发,防止混乱):例如随机接入协议。③发送时出现错误怎么办_物理层 mac层
文章浏览阅读533次,点赞25次,收藏10次。Python与Java新手应该选哪个?应该是当今讨论最为热门的话题了。(文末送福利)在过去的几年中,Python的普及速度令人惊叹,Java的王者地位也常年不衰用python代码画雪人。目前两者的竞争愈发激烈,怎么选择成为了许多初学者萦绕心中的问题,网上有很多版本的说法牵引着他们的思维,让本来很简单的问题复杂化。这篇文章,我将会带领你们了解Python与Java之间的区别,各自的优点,相信读完之后,你就会有了自己的答案。