Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add tap gesture to UICollectionView , while maintaining cell selection?

Tags:

Task

Add a single tap gesture to UICollectionView, do not get in the way of cell selection.

I want some other taps on the no-cell part of the collectionView.

Code

Using 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") } 

Result

Yeah, it gets in the way now. When you tap on cell, it logs "tapped".

Analysis

  • I check the hitTest return value of the collectionView and the cell. Both returned the tapped cell, which means they form a responder chain of Cell -> CollectionView
  • no gestures on the cell
  • 3 gestures on collectionView, no one seems to work with the cell select
    • UIScrollViewDelayedTouchesBeganGestureRecognizer
    • UIScrollViewPanGestureRecognizer
    • UITapGestureRecognizer
  • callStack, seems cell selection has a different stack trace with gesture's target-action pattern.
  • double tap gesture works along with cell selection.

Question

Couldn't find more trace. Any ideas on how cell selection is implemented or to achieve this task?

like image 697
jchnxu Avatar asked Nov 01 '16 18:11

jchnxu


People also ask

What is gesture tap?

Tap and swipe are two common gestures that allow the user to perform primary actions on their mobile devices. The tap gesture is essentially a brief touch of the mobile screen surface with the fingertip. Common uses of this gesture in iOS and Android devices include: Select or submit. Activate.

How do I use UITapGestureRecognizer?

The iOS UITapGestureRecognizer class has a built-in way to detect a double tap on any view. All you need to do is create the recognizer, set its numberOfTapsRequired property to 2, then add it to the view you want to monitor.

How do I highlight cells in collectionView?

How to use? Just inherit BaseCollectionViewCell . If needed, configure in cell's init or collectionView 's delegate methods. If you don't need highlight effect, just find a method named 'shouldHighlightItemAtIndexPath' in UICollectionViewDelegate and return false or just set cell.


1 Answers

Whenever you want to add a gesture recognizer, but not steal the touches from the target view, you should set UIGestureRecognizer.cancelsTouchesInView for your gestureRecognizer instance to false.

like image 116
Josh Homann Avatar answered Oct 31 '22 22:10

Josh Homann