Swipe left / right on collection View is not called when scrolling vertically

I have a vertical scroll view collection that spans the entire screen on the device (i.e. full screen mode).

I register Swipe Left and Right gestures for my collection view.

 //------------right swipe gestures in collectionView--------------// let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.rightSwiped)) swipeRight.direction = UISwipeGestureRecognizerDirection.Right self.collectionView.addGestureRecognizer(swipeRight) //-----------left swipe gestures in collectionView--------------// let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.leftSwiped)) swipeLeft.direction = UISwipeGestureRecognizerDirection.Left self.collectionView.addGestureRecognizer(swipeLeft) 

Problem: Scrolling left and right callback gestures do not work when the Collection View scrolls vertically.

Is there an easy way around this problem.

here is my whole ViewController class

 import UIKit class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { @IBOutlet weak var collectionView: UICollectionView! let reuseIdentifier = "cell" // also enter this string as the cell identifier in the storyboard var items = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48"] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. collectionView.dataSource = self collectionView.delegate = self //------------right swipe gestures in collectionView--------------// let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.rightSwiped)) swipeRight.direction = UISwipeGestureRecognizerDirection.Right self.collectionView.addGestureRecognizer(swipeRight) //-----------left swipe gestures in collectionView--------------// let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.leftSwiped)) swipeLeft.direction = UISwipeGestureRecognizerDirection.Left self.collectionView.addGestureRecognizer(swipeLeft) } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return self.items.count } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { // get a reference to our storyboard cell let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CustomCell // Use the outlet in our custom class to get a reference to the UILabel in the cell cell.lable.text = self.items[indexPath.item] cell.backgroundColor = UIColor.yellowColor() return cell } func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { print(indexPath.row) } func rightSwiped() { print("right swiped ") } func leftSwiped() { print("left swiped ") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

here is my collection view looks like

enter image description here

EDIT 1

Solved, for solutions click here

+5
source share
4 answers

delegate default gesture recognizer delegate UICollcetionView is a collection view object (obviously).

Implementation -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer by default returns YES in the direction of the UICollectionView class.

So, to solve your problem, you need to set the collection view object as a delegate for your β€œleft” and β€œright” finger gesture recognizers as follows.

 swipeRight.delegate = collectionView; swipeLeft.delegate = collectionView; 

This should cause your rightSwiped() and leftSwiped() be fired when the appropriate leftSwiped() happens.

+2
source

Try using the following code that might help you.

 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { // get a reference to our storyboard cell let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CustomCell cell.lable.text = self.items[indexPath.item] cell.backgroundColor = UIColor.yellowColor() let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.leftSwiped)) swipeLeft.direction = UISwipeGestureRecognizerDirection.Left cell.addGestureRecognizer(swipeLeft) let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.rightSwiped)) swipeRight.direction = UISwipeGestureRecognizerDirection.Right cell.addGestureRecognizer(swipeRight) return cell } 
0
source

The solution is very simple here.

1) You need to take a property to store the previous content offset

2) Implement the ScrollViewDidScroll delegate ScrollViewDidScroll and compare the current content Offset with previous content Offset

 var contentOffset: CGFloat = 0 

// MARK: UICollectionViewDelegate

 func scrollViewDidScroll(scrollView: UIScrollView) { if contentOffset > scrollView.contentOffset.y { // scrolling up } else if contentOffset < scrollView.contentOffset.y { //scrolling Down } contentOffset = scrollView.contentOffset.y } 

3) This can be done without adding a gesture recognizer.

0
source

Thanks @Hariprasad for telling me shouldRecognizeSimultaneouslyWithGestureRecognizer

Here is the solution

I have a subclass of UICollectionView and implemented by UIGestureRecognizerDelegate as below

 import UIKit class TouchCollectionView: UICollectionView, UIGestureRecognizerDelegate { /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. override func drawRect(rect: CGRect) { // Drawing code } */ required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) let gesture = UIGestureRecognizer() gesture.delegate = self // Set Gesture delegate so that shouldRecognizeSimultaneouslyWithGestureRecognizer can be set to true on initialzing the UICollectionView } func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true } } 

Whole ViewController will remain the same as indicated in the question

0
source

All Articles