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!!
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
À quelle classe ajoutez-vous ceci? – Jacolack
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