2016-11-01 11 views
7

タスク

UICollectionViewに単一のタップジェスチャーを追加しても、セルの選択には影響しません。セル選択を維持しながら、タップジェスチャをUICollectionViewに追加する方法は?

collectionViewのno-cell部分に他のタップがいくつか必要です。 XCode8、スウィフト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戻り値を確認してください。 > CollectionView
  • 3つのジェスチャーcollectionView上のセルには何のジェスチャーを、誰もが選択セルで動作するように思わない
    • UIScrollViewDelayedTouchesBeganGestureRecognizer
    • - どちらも、それらが細胞のレスポンダチェーンを形成する意味タップセルを、返さ
    • UIScrollViewPanGestureRecognizer
    • UITapGestureRecognizer
  • コールスタックは、セル選択がdiffeを持っているようですジェスチャーのターゲットアクションパターンを使用してスタックトレースをレンタルします。
  • ダブルタップジェスチャは、セル選択とともに動作します。

質問

は、より多くの痕跡を見つけることができませんでした。どのようにセル選択を実装するか、またはこのタスクを達成するためのアイデア?

答えて

15

あなたはジェスチャー認識を追加したいときはいつでも、しかし、ターゲットビューからタッチを盗むませんgestureRecognizerインスタンスのUIGestureRecognizer.cancelsTouchesInViewをfalseに設定する必要があります。

+0

ありがとう!私は再び基本的な文書に戻って、私が見逃しているものを見つけることを試みる! – jchnxu

5

の代わりにあなただけのindexPathを取得し、および/または、このように細胞ができdidSelectItem強制しようとしている:あなたは、

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") 
    } 
} 
+0

ありがとうございます!これは本当に役に立ちます。コレクションビューにジェスチャーを追加します。 UICollectionViewは、高レベルのジェスチャ認識子を使用するのではなく、未加工のタッチを分析しているようですが、それは限られています。 – jchnxu

関連する問題