web-dev-qa-db-ja.com

セルの選択を維持しながら、タップジェスチャをUICollectionViewに追加する方法は?

仕事

シングルタップジェスチャをUICollectionViewに追加します。セル選択の邪魔になりません。

CollectionViewのセルのない部分で他のタップが必要です。

コード

XCode8を使用して、Swift 3。

override func viewDidLoad() {
    ...
    collectionView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    print(indexPath)
}

func tap(sender: UITapGestureRecognizer){
    print("tapped")
}

結果

ええ、今では邪魔になります。セルをタップすると、「タップ」がログに記録されます。

分析

  • CollectionViewとセルのhitTest戻り値を確認します。両方ともタップされたセルを返しました。つまり、Cell-> CollectionViewのレスポンダーチェーンを形成します。
  • セルにジェスチャーはありません
  • collectionViewでの3つのジェスチャ、誰もセル選択で動作しないようです。
    • UIScrollViewDelayedTouchesBeganGestureRecognizer
    • UIScrollViewPanGestureRecognizer
    • UITapGestureRecognizer
  • callStack、セル選択にはジェスチャのターゲットアクションパターンと異なるスタックトレースがあるようです。
  • ダブルタップジェスチャは、セルの選択とともに機能します。

質問

これ以上のトレースが見つかりませんでした。セル選択の実装方法に関するアイデアや、このタスクを達成するためのアイデアはありますか?

19
jchnxu

ジェスチャレコグナイザーを追加したいが、ターゲットビューからタッチを盗みたくない場合は、 UIGestureRecognizer.cancelsTouchesInViewgestureRecognizerインスタンスをfalseにします。

28
Josh Homann

didSelectItemを強制しようとする代わりに、次のようにindexPathやセルを取得できます。

func tap(sender: UITapGestureRecognizer){

    if let indexPath = self.collectionView?.indexPathForItem(at: sender.location(in: self.collectionView)) {
        let cell = self.collectionView?.cellForItem(at: indexPath)
        print("you can do something with the cell or index path here")
    } else {
        print("collection view was tapped")
    }
}
11
Frankie