禁用 WebView 放大镜及拷贝粘贴弹出框

文/KyXu(简书作者)
原文链接:http://www.jianshu.com/p/40048d9c979a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

背景:
当你的App中有 WebView 或者有 Text 文本的时候,毫无疑问,系统默认地会在你进行长按的时候,弹出一个框,来让你拷贝、粘贴、剪切文本等,亦或是弹出一个放大镜。
而当你进行开发的时候,往往很明确的知道自己的 WebView 希望展示的是什么东西,这个时候,你可能会希望自定义长按手势(LongPressGesture)的功能,而不是任由系统“智能”地帮助你。
然而当你做了一系列工作自定义了长按手势之后,却发现它的优先级是低于系统默认的弹出框的。

在 StackOverFlow 上面查找一番之后,发现一个可能对某些人有效的方法是:

webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitUserSelect=‘none‘;")
webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitTouchCallout=‘none‘;")

将这两行代码加入到 webViewShouldLoadWithRequest 方法中,可以通过CSS来修改网页。

【重点】

然而这并不是对所有情况都有效,甚至今天在 Xcode 7 GM + iOS 9 环境下,彻底失效了。纠结很久之后,发现

UILongPressGestureRecognizer.png

长按手势的默认属性中,有一个 minimumPressDuration 默认值是 0.5,也就是说,在长按了0.5秒时,我们自定义的长按手势执行方法和系统的冲突了,于是解决方法显而易见:把自定义长按手势的反应时间缩短到0.5s以内,这样就可以在系统方法执行之前完成操作,而事实上,你甚至可以简单粗暴地把它改为0.1s,依然不会和点按的 Tap 手势有冲突。

self.longPressPan.minimumPressDuration = 0.3

希望对大家有所帮助 :)

更新:在 StoryBoard 中拖动手势控件到 ViewController 的时候,不要拖动到 ViewController 的顶端,而要拖动到 ViewController 的 View 的部分,让它自动设置好手势的控制区域,否则无论怎么设置,手势都不会起作用。

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:nil];

longPress.delegate = self;

longPress.minimumPressDuration = 0.3;  //这里为什么要设置0.3,因为只要大于0.5就无效,我像大概是因为默认的跳出放大镜的手势的长按时间是0.5秒,

//如果我们自定义的手势大于或小于0.5秒的话就来不及替换他的默认手势了,这是只是我的猜测。但是最好大于0.2

//秒,因为有的pdf有一些书签跳转功能,这个值太小的话可能会使这些功能失效。

[self.webView addGestureRecognizer:longPress];

 

#pragma mark - UIGestureRecognizerDelegate

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

{

return NO;  //这里一定要return NO,至于为什么大家去看看这个方法的文档吧。

//还有就是这个委托在你长按的时候会被多次调用,大家可以用nslog输出gestureRecognizer和otherGestureRecognizer

//看看都是些什么东西。

}

时间: 2024-10-11 07:43:31

禁用 WebView 放大镜及拷贝粘贴弹出框的相关文章

Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...

PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框...   AndBase中AbActivity封装好了许多方法提供我们去使用,使得在使用的时候更加的方便,只需要传递相关参数即可..省去了我们自己使用基础的函数进行构造...   就好比进度框,Toast框,弹出框,确认框...这些基本的东西都在AndBase的AbActivity封装好了...我们只需要传递参数调用其中内部的方法就可以完成这些视

经验总结:WebBrowser自动点击弹出提示框alert、弹出对话框confirm、屏蔽弹出框、屏蔽弹出脚本错误的解决办法

经验总结:WebBrowser自动点击弹出提示框alert.弹出对话框confirm.屏蔽弹出框.屏蔽弹出脚本错误的解决办法 网上有好多解决方法,可是不一定好使,本人经过多次试验,针对WebBrowser控件中自动点击弹出框及禁用脚本提示问题得到如下几种实际情况的解决办法,绝对管用. 1.屏蔽弹出错误脚本 将WebBrowser控件ScriptErrorsSuppressed设置为True即可. (参考本篇博客:http://www.cnblogs.com/qqflying/archive/20

js简单显示和隐藏div,触发超链接,动态更改button值,setInterval()简单使用,jquery easyui弹出框简单使用 .

js简单显示和隐藏div 01.<!DOCTYPE html> 02.<html> 03.<head> 04.<meta charset="UTF-8"> 05.<title>Insert title here</title> 06.<script type="text/javascript"> 07. window.onload=function(){ 08. document.g

网页弹出框--播放视频

网页点击弹出框播放视频 1/准备好基础网页.重置样式表什么的都已经写好的网页 2/调入弹出框CSS样式 /*! * ui-dialog.css * Date: 2014-07-03 * https://github.com/aui/artDialog * (c) 2009-2014 TangBin, http://www.planeArt.cn * * This is licensed under the GNU LGPL, version 2.1 or later. * For details

Bootstrap模态弹出框

前面的话 在 Bootstrap 框架中把模态弹出框统一称为 Modal.这种弹出框效果在大多数 Web 网站的交互中都可见.比如点击一个按钮弹出一个框,弹出的框可能是一段文件描述,也可能带有按钮操作,也有可能弹出的是一张图片.本文将详细介绍Bootstrap模态弹出框 结构分析 Bootstrap框架中的模态弹出框,分别运用了“modal”.“modal-dialog”和“modal-content”样式,而弹出窗真正的内容都放置在“modal-content”中,其主要又包括三个部分: ? 

SAP 本地文件上传到内表 sap gui 安全性弹出框 解决方法 .

本地上传文件到内表时候, 可以使用函数TEXT_CONVERT_XLS_TO_SAP:将xlsx,xls文件导入到内表 也可使用函数GUI_UPLOAD:将TXT文件导入到内表等   系统默认情况下,可能会产生“SAP GUI 安全性”的一个弹出框,如下图所示:   个人研究结果,如下(仅供参考) 产生原因:sap 系统对外部数据导入时候,会有一个自动的安全性提示检查. 在sap 安全性里面有个安全配置,默认的时候用的系统定制的安全配置, 会将已确认过的文件或者文件夹,加入到安全配置列表里面,遇

几乎纯css实现弹出框

今天需要做一个弹出框,右下角提示的那种 ,看了一两个jquery的插件 总是不太满意 .一方面js内容太多,另一方面 不太好配合已经存在的样式使用.所以 就自己用css直接实现了下 效果还可以 . 上代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>html5桌面通知</title> <style type="text/c

安卓中的弹出框

AlertDialog.Builder builder = new Builder(Context context) 得到一个context所在页面的弹出框, 可以是单选 builder.setSingleChoiceItems(items, checkedItem,listener)  items为弹出框的条目,checkedItem为默认选择的条目(一个),listener为弹出框的点击事件监听器(DialogInterface.OnClickListener的类型,是内部类), 也可以是多

Bootstrap方法为页面添加一个弹出框

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Bootstrap 实例 - 弹出框(Popover)插件</title> <link rel="stylesheet" href="https://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap