Deslizar hacia la izquierda / derecha en la colección No se llama mientras se desplaza verticalmente

Tengo una colecciónView con desplazamiento vertical que cubre toda la pantalla del dispositivo (es decir, pantalla completa).

He registrado los gestos Swipe Left and Right para mi vista de colección.

 //------------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) 

Problema: Deslizar los gestos de callback a izquierda y derecha no se dispara mientras collectionView se desplaza verticalmente.

¿Hay alguna solución simple para esto?

aquí está toda mi class ViewController

 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. } } 

aquí está mi colección

introduzca la descripción de la imagen aquí

EDIT 1

Resuelto, para soluciones haga clic aquí

El delegate de los reconocedores de gestos pnetworkingeterminados de UICollcetionView es el object de la vista de colección en sí (obviamente).

La implementación pnetworkingeterminada de gestor de -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer de -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer devuelve YES de lado de la class UICollectionView.

Por lo tanto, para resolver su problema, debe configurar el object de vista de colección como delegado en sus reconocedores de gestos de deslizar "hacia la izquierda" y "hacia la derecha" de la siguiente manera.

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

Esto debería hacer que su rightSwiped() y leftSwiped() se disparen cuando se produce el deslizamiento correspondiente.

Prueba el siguiente código que puede ayudarte.

 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 } 

Aquí hay una solución muy simple

1) Necesita tomar una propiedad para almacenar compensación de contenido anterior

2) Implementar el método de delegado ScrollViewDidScroll y comparar el contenido actual Compensar con el contenido anterior Compensar

 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) Se puede hacer sin agregar ningún reconocedor de gestos.

Gracias @ Hariprasad por apuntarme shouldRecognizeSimultaneouslyWithGestureRecognizer

Esta es la solucion

Tengo subclasss UICollectionView e implementé UIGestureRecognizerDelegate como a continuación

 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 } */ requinetworking 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 seguirá siendo el mismo que se menciona en la pregunta