【iOS開發】禁用WebView放大鏡及拷貝貼上彈出框

KyXu發表於2015-09-12

背景:
當你的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 的部分,讓它自動設定好手勢的控制區域,否則無論怎麼設定,手勢都不會起作用。


相關文章