2017-06-04 3 views
2

J'ai une vue de collection avec beaucoup de différentes images, et je veux que quand une image est tapotée, une bordure vient autour d'elle.UITapGestureRecognizer ne modifie pas le contenu de CollectionViewCell. Swift

J'ai créé une cellule personnalisée, et une UICollectionViewCell avec l'incorporation d'imageView dans une autre vue (qui est le contour) pour l'image. J'ai donc mis en place un UITapGestureRecognizer qui fonctionne pour obtenir l'index, mais lorsque je place la vue externe pour avoir un boder, ça ne marche pas.

Voici ma cellule:

import UIKit 

class PicViewCell: UICollectionViewCell { 


    @IBOutlet weak var imageView: UIImageView! 


    @IBOutlet weak var imageOutline: UIView! 


} 

Ceci est mon UICollectionViewController:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! PicViewCell 

      // Configure the cell 

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:))) 

      cell.imageOutline.addGestureRecognizer(tapGesture) 




     return cell 

Voici la méthode pour la tapGesture

func handleTap(sender: UITapGestureRecognizer) { 
     print("tap") 

     if let indexPath = self.collectionView?.indexPathForItem(at: sender.location(in: self.collectionView)) { 

      let cell = collectionView?.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! PicViewCell 

    cell.imageOutline.layer.borderWidth = 5 


     } else { 
      print("") 
     } 


    } 

Répondre

2

Dans votre routine handleTap, vous re appelant la mauvaise méthode pour récupérer la cellule. Vous voulez cellForItem(at:) qui récupérera la cellule existante ou retourner nil si elle n'est pas à l'écran:

let cell = collectionView?.cellForItem(at: indexPath) as! PicViewCell 

Autre solution

Si vous modifiez la vue que vous puisez, vous pouvez accéder à comme le view du sender:

func handleTap(sender: UITapGestureRecognizer) { 
    if let imageOutline = sender.view as? UIImageView { 
     imageOutline.layer.borderWidth = 5 
    } 
} 

Remarque: Dans les deux solutions, vous devez mettre à jour votre modèle lorsqu'une cellule est délimitée de sorte que si cette cellule défile de l'écran et revienne à l'écran, vous pouvez utiliser les données du modèle pour définir le contour de la cellule. correctement dans votre priorité de collectionView(_:cellForItemAt:).

+0

Cela fonctionne très bien. Mais comme vous l'avez dit, lorsque je retourne à la cellule, elle ne reste pas délimitée. J'ai mis à jour le modèle, mais il ne reste pas défini. Merci – RJB

+0

Dans 'collectionView (_: cellForItemAt:)' après avoir déplacé la cellule réutilisable, vous devez définir la couche borderWidth à 5 si votre modèle indique que la cellule a été tapée. – vacawama

+0

Merci, vous m'avez aidé une tonne. – RJB