addlistener
addlistener

Reputation: 871

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

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

Question

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

Upvotes: 26

Views: 24583

Answers (3)

childrenOurFuture
childrenOurFuture

Reputation: 1987

I get another way: when adding gestures, set delegate, implement below method

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

you can decide whether the gesture recognizer to receive the touch by your own logic, with position or the page's hidden property, based on your demand.

Upvotes: 0

Josh Homann
Josh Homann

Reputation: 16327

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.

Upvotes: 44

Frankie
Frankie

Reputation: 11918

Instead of trying to force didSelectItem you can just get the indexPath and/or cell this way:

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

Upvotes: 17

Related Questions