TableViewのタップイベントを分ける

失敗ログ

以下の画像のようなcellで画像部分とそれ以外のイベントを分ける必要がある時、私がすぐに思いついたのはUILongTapGuestureでジェスチャーを分ける方法でした。

UILongTapGuestureRecognizerで対処から位置がズレたらキャンセルする

しかしcellないのUIにUILongTapGuestureRecognizerを付与してしまうとtableViewをスクロールした時にスクロールされないという問題が発生します。

ジェスチャーがtouches○○のイベント処理を完全に奪ってしまっているのが原因です。

解決策

super.touchesBegan(touches, with: event)を呼び出すタイミングを遅くすれば実現できます。

   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches where touch.view == yasaiImageView{
            //やりたい処理
            return
        }
        super.touchesBegan(touches, with: event)
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches where touch.view == yasaiImageView {
        	//やりたい処理 
        	return	
        }
        super.touchesEnded(touches, with: event)
    }

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches where touch.view == yasaiImageView {
            //やりたい処理
            return
        }
        super.touchesCancelled(touches, with: event)
    }

※注意すべき点はタップした領域が別の操作をしたいViewだった場合最後にreturnを入れてあげることです。
これを入れないとdidSelectRowAtも呼ばれてしまうため二重で処理が走ってしまいます。