4
votes

Comment ajouter un geste pour une vue dans une cellule de vue de collection?

J'ajoute une vue ayant un ensemble d'images (socialView) dans une cellule de vue de collection (ayant également d'autres vues) sur laquelle un clic commun doit être effectué. Ce clic ne doit pas être identique au clic de cellule de vue de collection.

Je pense à ajouter à chaque fois UITapGestureRecognizer pour socialView dans la méthode déléguée CollectionView cellForItemAt . Mais je veux savoir est-ce la bonne manière? De plus, je veux obtenir l'indexPath / position sur lequel socialView a été appelé.

class CustomViewCell: UICollectionViewCell {

    var index : IndexPath!
    var socialViewDelegate : SocialViewDelegate!

    @IBOutlet weak var socialView: UIView!

    override func awakeFromNib() {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        socialView.isUserInteractionEnabled = true
        socialView.addGestureRecognizer(tapGesture)
    }

    @objc func handleTap(){
        socialViewDelegate.socialViewTapped(at: index)
    }
}
protocol SocialViewDelegate {
    func socialViewTapped(at index: IndexPath)
}

UPDATE p >

J'ai fait selon les suggestions ci-dessous, mais je ne suis pas en mesure de savoir où dois-je ajouter UITapGestureRecognizer dans la cellule personnalisée. Voici la cellule personnalisée que j'ai créée.

class CustomViewCell: UICollectionViewCell {

    var index : IndexPath!
    var socialViewDelegate : SocialViewDelegate!

    @IBOutlet weak var socialView: UIView!

    override init(frame: CGRect) {
        super.init(frame:frame)
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action:   #selector(self.viewTapped))
        socialView.addGestureRecognizer(tapGestureRecognizer)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder:aDecoder)
    }

    @objc func viewTapped(){
        socialViewDelegate.socialViewTapped(at: index)
    }
}

La fonction init n'est pas appelée. J'ai également essayé de mettre l'initialisation requise, mais là, la vue sociale n'est pas initialisée. Donc être crashé

REPONSE FINALE

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.socialViewTapped))

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "bidderAuctionCell", for: indexPath) as! BidderAuctionViewCell
     cell.socialView.addGestureRecognizer(tapGestureRecognizer)
}

@objc func socialViewTapped() {
     // Which item cell's socialview is clicked
}


6 commentaires

@RobertDresler a ajouté du code. Vérifiez s'il vous plaît


@JarvisTheAvenger J'ai mis à jour le code, je ne parviens pas à ajouter le geste dans la classe personnalisée


vous pouvez le résoudre en passant l'indexPath à votre classe personnalisée. et déléguez ce robinet à votre viewcontroller


avez-vous ajouté cette classe dans le XIB de la cellule ??


vous n'avez pas ajouté UIGestureRecognizerDelegate à votre classe personnalisée


J'ai mis à jour ma réponse. Vous devez faire toutes vos opérations liées aux gestes de tapotement dans la méthode awakeFromNib.


3 Réponses :


0
votes

Pour ajouter un geste de toucher, veuillez ajouter le code suivant dans la cellule de votre vue de collection.

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.socialViewTapped))
socialView?.addGestureRecognizer(tapGestureRecognizer)
socialView?.isUserInteractionEnabled = true

Ajoutez ce code à la cellule de vue de collection.


4 commentaires

Ceci est une solution générique pour n'importe quelle vue, pouvez-vous me dire comment je peux obtenir le indexPath.row pour la vue sociale cliquée. J'ai ajouté le code


L'idée de base est d'ajouter ce code à la classe de cellule que vous avez créée, il y aura donc un objet de cellule différent. Si vous voulez indexPath, vous pouvez créer une variable dans la cellule et la définir dans la méthode cellForRow at.


Pouvez-vous vérifier maintenant? @ Let's_Create


remplacez la méthode awakeFromNib dans votre classe de cellule et ajoutez-y un geste de pression



3
votes

@Anurag vous pouvez résoudre ce problème en utilisant l'un des concepts suivants Délégation, Fermetures, Notifications. Je vais vous suggérer de suivre le modèle de délégation qu'iOS suit largement dans ses composants tels que UITableView, UICollectionView, etc.

  • Avant de mettre en œuvre le modèle de délégation, ajoutez un outil de reconnaissance des gestes tactiles à la vue.
  • Dans CollectionViewCell, déclarez une méthode de protocole pour déléguer votre appui / action
  • Confirmez la mise en œuvre du délégué dans votre contrôleur de vue.
  • Implémentez votre méthode déléguée dans votre contrôleur de vue.

Exemple de codage:

1. Votre CollectionViewCell doit ressembler à ceci :

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


               let cell =  collectionView.dequeueReusableCell(withReuseIdentifier: "cellIdentifier",
                                                  for: indexPath) as! YourCell

              cell.delegate = self
              return cell
          }



    // MARK: Delegate
     extension YourViewController : ViewTappedDelegate {
        func viewTapped(_ photo : String) {
          // Handle delegation here...
        }
    }

2. Dans ViewController

   import UIKit

    Protocol ViewTappedDelegate: class {
     func viewTapped(_ photo : String) { }
   }

    class YourCell: UICollectionViewCell, UIGestureRecognizerDelegate {

        @IBOutlet weak var containerView: UIView!
        weak var delegate : ViewTappedDelegate?

        override func awakeFromNib() {
            let tapGesture = UITapGestureRecognizer(target: self,
                                                    action: #selector(handleTap(recognizer:)))
            tapGesture.delegate = self
            containerView.isUserInteractionEnabled = true
            containerView.addGestureRecognizer(tapGesture)
        }

        @objc func handleTap(recognizer:UITapGestureRecognizer) {
            //Call Delegate method from here...
        }

    }


1 commentaires

Hé merci, ça a marché. Mais vous n'avez pas besoin d'ajouter tapGesture.delegate = self. C'est juste que je dois écrire le code dans awakeFromNib. Merci beaucoup.



0
votes

J'espère que cela fonctionne si vous n'avez toujours pas trouvé de solution vous utilisez un protocole comme celui-ci, dans votre cellule personnalisée comme celle-ci

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, CustomDelegate{
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCell
    cell.delegate = self
    cell.selectedAtIndex = indexPath
    return cell
}
func showData(indexPath: IndexPath?) {
    if let ip = indexPath{
            print("\(ip) is the index path for tapped view")
    }
}
}

écrivez votre contrôleur de vue comme ceci

import UIKit

protocol CustomDelegate {
    func showData(indexPath: IndexPath?)
}

class CustomCell: UICollectionViewCell {

// properties

var delegate: CustomDelegate?
var selectedAtIndex: IndexPath?

// outlets

override func awakeFromNib() {
    super.awakeFromNib()
    myView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(dothis)))
}

@objc func dothis(){
    delegate?.showData(indexPath: selectedAtIndex)
}

@IBOutlet weak var myView: UIView!
}

dites si cela aide


0 commentaires