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

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

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

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

WebKit

WebKitはAppleのSafariとAndroid, iOS, RIM Blackberry, SymbianとWebOSを含むインストール済みのモバイルブラウザの動力となっているオープンソースのウェブブラウザエンジンです。

Swift

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

Q&A

解決済

1回答

2805閲覧

SwiftのwebViewで表示されたWebの画面でタッチイベントの処理を行いたい

Hondeeeen

総合スコア7

iOS

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

WebKit

WebKitはAppleのSafariとAndroid, iOS, RIM Blackberry, SymbianとWebOSを含むインストール済みのモバイルブラウザの動力となっているオープンソースのウェブブラウザエンジンです。

Swift

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

0グッド

0クリップ

投稿2018/11/16 18:51

前提・実現したいこと

iOSアプリの開発をしています!
webViewで表示されたWebの画面でタッチイベントの処理を行いたいです!

今のところ、指定したURLをwebViewでネイティブの画面からWebの画面を表示させることはできていて、ネイティブの処理であるタッチイベント(touchesBegan(), touchesEnded())をWebの画面で処理させることができていません。。。

該当のソースコード

import UIKit import WebKit class ViewController: UIViewController, WKUIDelegate { var webView: WKWebView! override func loadView() { let webConfiguration = WKWebViewConfiguration() webView = WKWebView(frame: .zero, configuration: webConfiguration) webView.uiDelegate = self view = webView } override func viewDidLoad() { super.viewDidLoad() let myURL = URL(string:"https://www.apple.com") let myRequest = URLRequest(url: myURL!) webView.load(myRequest) } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { print("Began") } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { print("Ended") } }

補足情報(FW/ツールのバージョンなど)

Xcode version 10.1
Swift version 4.2.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは、改めましてここで回答します。

まず、overrideされているtouchesBeganなどのタッチ系統の関数ですが、WKWebViewでは作用しないようです。
https://discussions.apple.com/thread/7786341 こちらに、Appleでのディスカッションがあるので御覧ください。

WKWebViewを継承したクラスで、touchesBeganなどのタッチ系統の関数をオーバーライドしても無理でした。

以下のようにUITapGestureRecognizerを利用した実装を勧めます。

swift

1import UIKit 2import WebKit 3 4class TouchWebViewController: UIViewController { 5 6 // MARK: Stored properties 7 8 private let googleUrl = URL(string: "https://google.com")! 9 10 // MARK: IBOutlet 11 12 @IBOutlet weak var webView: WKWebView! { 13 didSet { 14 // Set up web view 15 webView.load(URLRequest(url: googleUrl)) 16 } 17 } 18 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 23 // UITapGestureRecognizerでタップイベントを取るようにする 24 let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) 25 tapRecognizer.numberOfTapsRequired = 1 26 27 // このときUIGestureRecognizerDelegateに準拠したオブジェクトを設定する 28 tapRecognizer.delegate = self 29 webView.addGestureRecognizer(tapRecognizer) 30 } 31 32 // MARK: Private functions 33 34 @objc private func handleTap(_ sender: UITapGestureRecognizer){ 35 NSLog("Tap") 36 } 37} 38 39 40extension TouchWebViewController: UIGestureRecognizerDelegate { 41 42 // MARK: UIGestureRecognizerDelegate 43 44 // このgestureRecognizerをオーバーライドしてtrueにしないとサブビューではTapイベントを検知できない 45 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 46 return true 47 } 48}

投稿2018/11/17 01:33

編集2018/11/17 01:36
freddi_kit

総合スコア15

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

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

Hondeeeen

2018/11/17 15:24

解決しました! 本当に助かりました! ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問