美文网首页技术iOS开发IOS
【iOS开发】禁用 WebView 放大镜及拷贝粘贴弹出框

【iOS开发】禁用 WebView 放大镜及拷贝粘贴弹出框

作者: KyXu | 来源:发表于2015-09-12 14:13 被阅读8395次

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

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

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

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

    【重点】

    然而这并不是对所有情况都有效,甚至今天在 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 的部分,让它自动设置好手势的控制区域,否则无论怎么设置,手势都不会起作用。

    相关文章

      网友评论

      • MrZombie:js那个的确没用,这个方法能用
      • 帅帅帅帅要很帅:有用,感谢~
        KyXu:@帅帅帅帅要很帅 不客气
      • 梁大大大大大壮_:给作者点赞哈
        KyXu:@梁大大大大大壮_ 谢谢:pray:
      • 754d552ed636:不错,谢谢,学到了:wink:
      • 蟋蟀wang:连续点击,依然可以复制 :worried:
        不知蜕变的挣扎:双击复制如何禁止呢?
        39d3c13a6193:@KyrieXu 如果是一个点击按钮,我连续点击了出现了复制粘贴,这也是好事。。?
        KyXu:@蟋蟀wang 这是好事啊,我们只是希望自己的长按手势方法可以覆盖掉系统默认的,现在系统给用户提供了其他方式来复制文本,这没有干扰到我们自己写的方法的执行。
      • ForestSen:多谢 分享
      • Kong先生:赞一个,已经应用
      • 2aff861ff6dc:楼主的意思是要自己添加一个longpressGesture?
        KyXu:@2aff861ff6dc 对

      本文标题:【iOS开发】禁用 WebView 放大镜及拷贝粘贴弹出框

      本文链接:https://www.haomeiwen.com/subject/qaipcttx.html