質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1418閲覧

WKWebViewの中で画像を長押すとカスタマイズのActionSheetを表示したい

Abest

総合スコア6

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/03/23 06:24

前提・実現したいこと

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 }

初めての質問で、お手数をお掛け致しますが、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

下記の回答など参考になりますでしょうか?
https://stackoverflow.com/questions/34275334/how-to-override-wkwebview-hyperlink-action-sheet

流れとしては、
longPressedの中でフラグを立てて、
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void)
の中で対象だった場合はdecisionHandler(decisionHandler(WKNavigationActionPolicy.cancel)で既存処理をキャンセルし、ActionSheetを設定して呼び出しているようです。

投稿2018/03/23 07:44

newmt

総合スコア1277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問