Reputation: 871
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.
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")
}
Yeah, it gets in the way now. When you tap on cell, it logs "tapped".
Couldn't find more trace. Any ideas on how cell selection is implemented or to achieve this task?
Upvotes: 26
Views: 24583
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
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
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