UITextViewに以下の様にtapGestureを付与したいのですが、その際に文字が入力されている部分をタップしても反応しない様にしたいです。その様な挙動は可能でしょうか?
現状これだと文字の上をtapしても反応してしまいます。
Swift
1let uiView = UITextView() 2let tapGestureRecognizer = UITapGestureRecognizer(target: context.coordinator, action: #selector(Coordinator.tapGesture)) 3uiView.addGestureRecognizer(tapGestureRecognizer)
追記
入力した文字をタップするとタップした場所にカーソルが動きますが、今回 UITextView 自体にGestureRecognizer を追加しているのでそれによって文字をタップした際にそのジェスチャーが呼ばれてしまいます。そのジェスチャーによって呼ばれるメソッドでは UITextView の表示を消すというものなので、カーソルを移動させようと文字をタップすると TextView が消えてしまします。それを避けたいです。
ですので最終的に実現したい事はUITextViewの文字が入力されている以外の部分をtapしてメソッドが呼ばれ TextView が非表示になるという挙動です。そして文字をタップした場合は普通にカーソルが移動します。
以下の様に無理やり呼んだメソッドの先でテキストの範囲の座標をtapした場合は何もしないという様にする事はできますが、それだとテキストをタップした際にカーソルの移動がうまくいかなくなってしまいます。。。
Swift
1 @objc func tapGesture(gestureRecognizer: UITapGestureRecognizer){ 2 3 if let uiView = gestureRecognizer.view as? UITextView { 4 let range = (uiView.text as NSString).range(of: uiView.text) 5 let rect = uiView.layoutManager.boundingRect(forGlyphRange: range, in: uiView.textContainer) 6 7 let tapPoint = gestureRecognizer.location(in:uiView) 8 9 if !(tapPoint.x > rect.origin.x && tapPoint.x < rect.origin.x + rect.size.width 10 && tapPoint.y > rect.origin.y && tapPoint.y < rect.origin.y + rect.size.height) { 11 doSomething() 12 } 13 14 } 15 }
回答1件
あなたの回答
tips
プレビュー