34393


UITextViewの下にある、UIviewに貼ったUILongPressGestureRecognizerを認識させたい。

textViewをタップすると、テキストの入力状態になってしまって下のviewの長押しが認識されないようなのです。


CC BY-SA 3.0
2017-04-30T12:12:39.700
34391
2017-04-30T21:15:42.887
2017-04-30T12:24:40.050
12297
12297
question
swift
UITextViewの下にある、UIviewに貼ったUILongPressRecognizerを認識させたい。


本家英語版のstackoverflowに類似のスレッドがあったので、試してみました。

[Add UITapGestureRecognizer to UITextView without blocking textView
touches](https://stackoverflow.com/q/28858908/6541007)

`UITextView`を`textView`、「下にある、`UIview`」を`wrappingView`として、それらを含む`ViewController`に以下のような記述をしました。

[code]

    class ViewController: UIViewController, UIGestureRecognizerDelegate {
    
        @IBOutlet weak var wrappingView: UIView!
        @IBOutlet weak var textView: UITextView!
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            let longPressGR = UILongPressGestureRecognizer(target: self, action: #selector(longPressOnWrappingView))
            longPressGR.delegate = self
            wrappingView.addGestureRecognizer(longPressGR)
        }
    
        func longPressOnWrappingView(_ sender: UILongPressGestureRecognizer) {
            print(#function)
            //...
        }
    
        func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
            return true
        }
    
        //...
    }
    
[/code]

ポイントは`UILongPressGestureRecognizer`にdelegateを設定し、そのdelegateメソッド`gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)`で`true`を返していると言うところです。

* * *

ただし、本来の`UITextView`のジェスチャーに対する動作を無効化しているわけではありませんので、`UITextView`上で長押しした場合の動作に加えて、`UILongPressGestureRecognizer`のactionに指定した動作が実行されます。

そういった`UITextView`本来のジェスチャー応答とどのように共存させるのかの詳細が書かれていませんし、その内容によってはAppleからHIG違反でrejectされる可能性もあるので、それ以上は試していません。

そこら辺をもう少し詳しく記載されれば、他の方からより適切な回答を得られる可能性はあるかと思いますが、私的にはUIデザインを再考された方が良いように思われます。


CC BY-SA 3.0
2017-04-30T21:15:42.887
34393
2017-04-30T21:15:42.887
2017-05-23T12:38:55.250
-1
13972
34391
answer