禁用 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 环境下,彻底失效了。纠结很久之后,发现
长按手势的默认属性中,有一个 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
//看看都是些什么东西。
}
禁用 WebView 放大镜及拷贝粘贴弹出框的更多相关文章
- 移动端页面 弹出框滚动,底部body锁定,不滚动 / 微信网页禁止回弹效果
需求:页面有弹出层菜单,当弹出层菜单超出屏幕可视区域时,不能滚动.加上滚动后,底部body的滚动事件如何禁止,加上了overflow:hidden;还是不可用. 如下图:地区弹出框可以滚动,而底部的b ...
- js简单显示和隐藏div,触发超链接,动态更改button值,setInterval()简单使用,jquery easyui弹出框简单使用 .
js简单显示和隐藏div .<!DOCTYPE html> .<html> .<head> .<meta charset="UTF-8"& ...
- Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...
PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框... AndBase中AbActivity封 ...
- form WebBrowser自动点击弹出提示框alert、弹出对话框confirm、屏蔽弹出框、屏蔽弹出脚本错误的解决办法
针对WebBrowser控件中自动点击弹出框及禁用脚本提示问题得到如下几种实际情况的解决办法,绝对管用. 1.屏蔽弹出错误脚本 将WebBrowser控件ScriptErrorsSuppressed设 ...
- 弹出框插件layer使用
layer是一款近年来备受青睐的web弹层组件,她具备全方位的解决方案,致力于服务各水平段的开发人员,您的页面会轻松地拥有丰富友好的操作体验. 插件官方地址:http://layer.layui.co ...
- Bootstrap模态弹出框
前面的话 在 Bootstrap 框架中把模态弹出框统一称为 Modal.这种弹出框效果在大多数 Web 网站的交互中都可见.比如点击一个按钮弹出一个框,弹出的框可能是一段文件描述,也可能带有按钮操作 ...
- 微信小程序组件 加减号弹出框
<!-- 点击立即抢拼弹出框 --> <view class='add-rob' bindtap="setModalStatus" data-status=&qu ...
- [Js插件]使用JqueryUI的弹出框做一个“炫”的登录页面
引言 查看项目代码的时候,发现项目中用到JqueryUi的弹出框,可拖拽,可设置模式对话框,就想着使用它弄一个登录页面. 弹出框 在Jquery Ui官网可定制下载弹出框,下载和弹出框下载相关的js文 ...
- 经验总结:WebBrowser自动点击弹出提示框alert、弹出对话框confirm、屏蔽弹出框、屏蔽弹出脚本错误的解决办法
经验总结:WebBrowser自动点击弹出提示框alert.弹出对话框confirm.屏蔽弹出框.屏蔽弹出脚本错误的解决办法 网上有好多解决方法,可是不一定好使,本人经过多次试验,针对WebBrows ...
随机推荐
- WinServer2008r2 机器时间格式修改
windows2008 这么高级的系统不可能改个系统的日期时间显示格式还要进注册表啊.于是有baidu,google了下终于发现了,原来还有不需要注册表的更简便方法.windows2008默认时间格式 ...
- 0601 Spring2.0 发布会及产品发展方向
ProductBacklog:继续向下细化; 1.界面美化,统一界面风格,以简洁美观为主: 2.丰富版面的内容,吸引用户: 3.尝试增加新的版面: Sprint 计划会议:确定此次冲刺要完成的目标 1 ...
- 在启动dubbo框架时报错。Unable to connect to zookeeper server within timeout: 5000
这是因为zookeeper服务没有启动,所以会报错超时.只要启动zookeeper就行了. zookerper的启动很简单的,网上随便搜搜都有.
- 根据日期 读取三个csv不留指定日期的内容 新保存一个文件
using System;using System.Collections.Generic;using System.Drawing;using System.Globalization;using ...
- smarty模板的安装配置
第一步:下载Smarty模版源码包了 百度一下“Smarty下载”,下载最新版本的Smarty模版第二部:解压缩,将下载好的Smarty包解压缩 右键->解压到当前文件夹...你懂的 ...
- VC++ CButton::SetCheck 的使用方法
CButton::SetCheck void SetCheck(int nCheck); 参数 nCheck 指定检查状态. 此参数可以是下列值之一: 值 ...
- iOS使用Safari调试UIWebView
1.设置Safari "Safari"->"偏好设置"->"高级",勾选"在菜单栏中显示开发菜单" 2.设置 ...
- 【MVC】 非常简单的页面导出 WORD, EXCEL方法
[MVC] 页面导出 WORD, EXCEL 前端 js function output() { var para = new Object(); para.html = getHtml(" ...
- 屏蔽input导致的回车提交事件
onkeypress="if(event.keyCode == 13) return false;"
- MySQL Batch 与 Transaction
最近在数据库上经常遇到死锁问题. 表现的问题有 1. 有一个查询为: 1) 一个复杂的 select 查处一组大数据 2) 使用事务 update 这组数据的状态 为了让锁定的时间变短, 我将这整个大 ...