0

Je travaille avec des gestes la première fois ici. S'il vous plaît laissez-moi savoir si mon approche est mauvaise ou une meilleure solution. J'essaie de supprimer la collectionView Cell en balayant vers la gauche tout comme la fonction de suppression UITableview. La suppression fonctionne correctement. Maintenant, ce que je veux est, Une fois que je glisser la cellule et tapez ne importe où sur CollectionView il devrait glisser à sa position d'origine (même comme tableview supprimer la fonctionnalité de ligne)Réinitialiser CollectionviewCell position sur le geste du robinet

J'utilise/essayer ce code Mise à jour viewDidLoad et exploité événement

override func viewDidLoad() { 
super.viewDidLoad() 

     let tap = UITapGestureRecognizer(target: self, action: #selector(tapped(_:))) 
     self.view.addGestureRecognizer(tap) 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

let Cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath) as! CustomCell 
    Cell.backgroundColor = UIColor.white 

    let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(delete(sender:))) 
    leftSwipe.direction = UISwipeGestureRecognizerDirection.left 
    Cell.addGestureRecognizer(leftSwipe) 

    let tap = UITapGestureRecognizer(target: self, action: #selector(tapped(_:))) 
    Cell.addGestureRecognizer(tap) 

    Cell.deleteButton.addTarget(self, action: #selector(DeleteCell(sender:)), for: .touchUpInside) 
} 

func tapped(_ recognizer: UITapGestureRecognizer) { 
    // self.collectionView.performBatchUpdates({ 
     //self.collectionView.reloadSections(NSIndexSet(index: 0) as IndexSet) 
    //}, completion: nil) 


    let point = recognizer.location(in: collectionView) 
    let indexPath = collectionView.indexPathForItem(at: point)   
    let cell = self.collectionView.cellForItem(at: indexPath!) 

    UIView.animate(withDuration: 0.4) { 

     cell?.contentView.frame = CGRect(x: 0, y: 0, width: (cell?.contentView.frame.width)!, height: (cell?.contentView.frame.height)!) 
    } 

} 

func delete(sender: UISwipeGestureRecognizer){ 

    let cell = sender.view as! CustomCell 

    UIView.animate(withDuration: 0.4) { 
     cell.contentView.frame = CGRect(x: -90, y: 0, width: cell.contentView.frame.width, height: cell.contentView.frame.height) 
    } 
} 

func DeleteCell(sender : AnyObject){ 

    let cell = sender.superview as! CustomCell 
    let i = self.collectionView.indexPath(for: cell)!.item 

    let indexpath = self.collectionView.indexPath(for: cell) 
    let array : NSMutableArray = [] 

    self.collectionView.performBatchUpdates({ 

     self.userArray.remove(at: i) 

     array.add(indexpath!) 

     self.collectionView.deleteItems(at:array as! [IndexPath]) 

    }, completion: nil) 
} 


class CustomCell: UICollectionViewCell { 
    let deleteButton: UIButton = { 
    let deleteBtn = UIButton() 
    deleteBtn.setImage(UIImage(named: "red"), for: .normal) 
    deleteBtn.contentMode = .scaleAspectFit 
    return deleteBtn 
    }() 
} 

donc ici, je suis en mesure de définir la position de la cellule arrière à l'original par self.collectionView.performBatchUpdates mais son animation pas lisse. J'ai essayé d'utiliser

UIView.animate(withDuration: 0.4) {    
    cell.contentView.frame = CGRect(x: 0, y: 0, width:  cell.contentView.frame.width, height: cell.contentView.frame.height) 
} 

, mais il ne fonctionne que si la cellule chipé exploité, aucune autre cellule ou nulle part ailleurs. Toute suggestion serait utile!!

Répondre

0

Enfin, obtenu la solution.

Voici le projet de démonstration, j'ai trouvé - CollectionViewSlideLeft

espère que cela aidera quelqu'un comme moi. :)

0

À l'heure actuelle, vous accédez à votre cellule depuis l'intérieur de lui-même. La raison pour laquelle cela ne fonctionne que pour appuyer sur la cellule que vous venez de balayer est parce que c'est la seule cellule avec cette instance spécifique de UITapGestureRecognizer. Pour résoudre ce problème, vous devez ajouter ce dispositif de reconnaissance gestuelle à l'ensemble de votre vue. Essayez d'ajouter ceci à votre méthode viewDidLoad():

let tap = UITapGestureRecognizer(target: self, action: #selector(tapped(_:))) 
self.view.addGestureRecognizer(tap) 
+0

Merci jacolack! Je l'ai essayé et c'est pareil. La cellule ne revient que si je tape sur la cellule sélectionnée. – iUser

+0

À quelle classe ajoutez-vous ceci? – Jacolack

+0

Hey désolé, mais n'a pas obtenu quelle classe vous demandez ici. J'ai mis à jour mon code ci-dessus. Regardez ceci, s'il vous plaît. – iUser