前提・実現したいこと
swift 4
Xcode 9.2
iOS 10.3
WKWebViewの中で画像を長押すとカスタマイズのActionSheetを表示、他のリンクとかはそのままのデフォルトのActionSheetを表示する機能を実現したいです。
実装中に以下の問題が発生しました。
発生している問題
document.body.style.webkitTouchCallout='none'
を使うとすべてのリンクに対する長押しは無効になります。しかし、それを使わないと画像を長押すときにデフォルトのActionSheetと自分が作ったものが同時に重なって表示します。
該当のソースコード
関係のあると思うコードをアップロードしました。
swift
1@objc func longPressed(_ gesture: UILongPressGestureRecognizer) { 2 3 if gesture.state == UIGestureRecognizerState.began { 4 5 let touchPoint: CGPoint = gesture.location(in: self.view) 6 let ptX = touchPoint.x 7 var ptY = touchPoint.y 8 9 if (ptY <= (self.webview.frame.origin.y + self.webview.frame.size.height)) 10 { 11 12 if #available(iOS 7.0, *) { 13 14 ptY -= 20.0 15 } 16 17 self.webview.evaluateJavaScript("document.elementFromPoint((ptX), (ptY)).tagName", completionHandler: {(_ object: Any, _ error: Error?) -> Void in 18 let tagname = object as! String 19 if tagname == "IMG" { 20 self.webview.evaluateJavaScript("document.elementFromPoint((ptX), (ptY)).src", completionHandler: {(_ object: Any, _ error: Error?) -> Void in 21 self._imgURL = object as! String 22 let imageData = try? Data(contentsOf: URL(string: self._imgURL)!) 23 if imageData != nil { 24 25 self.handleLongTouch() //ここでカスタマイズのActionSheetを呼び出す 26 } 27 }) 28 } 29 }) 30 } 31 } 32 } 33 34fileprivate var longPressGesture: UILongPressGestureRecognizer! { 35 36 let longPressGesture: UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressed)) 37 longPressGesture.minimumPressDuration = 0.5 38 longPressGesture.delegate = self 39 return longPressGesture 40 } 41 42private func loadWebview() { 43 44 let webConfiguration = WKWebViewConfiguration() 45 let noneSelectScript = WKUserScript(source: "document.body.style.webkitTouchCallout='none'", injectionTime: .atDocumentEnd, forMainFrameOnly: false) 46 webConfiguration.userContentController.addUserScript(noneSelectScript) 47 self.webview = WKWebView(frame: .zero, configuration: webConfiguration) 48 49 self.webview.translatesAutoresizingMaskIntoConstraints = false 50 self.webview.allowsBackForwardNavigationGestures = true 51 self.view.addSubview(self.webview) 52 self.webview.topAnchor.constraint(equalTo: self.webviewContainer.topAnchor).isActive = true 53 self.webview.rightAnchor.constraint(equalTo: self.webviewContainer.rightAnchor).isActive = true 54 self.webview.leftAnchor.constraint(equalTo: self.webviewContainer.leftAnchor).isActive = true 55 self.webview.bottomAnchor.constraint(equalTo: self.webviewContainer.bottomAnchor).isActive = true 56 self.webview.navigationDelegate = self as WKNavigationDelegate 57 self.webview.uiDelegate = self as? WKUIDelegate 58 }
初めての質問で、お手数をお掛け致しますが、宜しくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。