Ich verwende UICollectionView in meinem Projekt, aber es zeichnet nicht die Zellen für die wiederverwendeten. Denken Sie, dass ich 20 Zellen habe, wenn die App geöffnet wird. Die Zeichenmethode wird 20 Mal aufgerufen. Dann ändere ich die Anzahl der Zellen auf 30 und lade CollectionView neu, dann wird die Zeichenmethode nur 10 Mal aufgerufen. Ich möchte die Zeichenmethode 30 Mal aufrufen, da ich einige Operationen (Hinzufügen von Bildern) in dieser Methode zur Zelle ausführe.

Hinweis : Ich habe in iPhone 5s (iOS 10.3.3) getestet.

Unten wird die GameCollectionViewCell-Klasse als benutzerdefinierte Zelle für CollectionView verwendet

extension GameCollectionViewCell {

    override func draw(_ rect: CGRect) {

                var princess : UIImageView = UIImageView(image: UIImage(named: "CategoryImages/"+card!.contentImage)?.withAlignmentRectInsets(UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0 )))

                var size : CGSize = CGSize(width: rect.size.width-1.8, height: rect.size.height-1.8)
                var origin : CGPoint = CGPoint(x: rect.origin.x+0.9, y: rect.origin.y+0.9)
                var princessRect : CGRect = CGRect(origin: origin, size: size)

                princess.frame = princessRect
                princess.layer.masksToBounds =  true
                princess.layer.cornerRadius = 2;

                contentView.addSubview(princess)

            }
        }
0
nihasmata 17 Jän. 2019 im 20:29

3 Antworten

Beste Antwort

Vielen Dank an @RobertDresler. Er hat meinen Tag gerettet. Wenn Sie nach dem erneuten Laden von CollectionView die Methode setNeedsDisplay () aufrufen, wird die Methode draw () aufgerufen. Bitte überprüfen Sie unten.

override func prepareForReuse() {

        super.prepareForReuse()
        setNeedsDisplay()

    }
1
nihasmata 18 Jän. 2019 im 15:41

Ich hatte das gleiche Problem mit meiner Sammlungsansicht. Die beste Lösung besteht darin, Funktionen in Ihrem GameCollectionViewCell Sprichwort updateView() hinzuzufügen und die UI-Elemente zur Unteransicht hinzuzufügen

func updateView() {
    var princess : UIImageView = UIImageView(image: UIImage(named: "CategoryImages/"+card!.contentImage)?.withAlignmentRectInsets(UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0 )))

            var size : CGSize = CGSize(width: rect.size.width-1.8, height: rect.size.height-1.8)
            var origin : CGPoint = CGPoint(x: rect.origin.x+0.9, y: rect.origin.y+0.9)
            var princessRect : CGRect = CGRect(origin: origin, size: size)

            princess.frame = princessRect
            princess.layer.masksToBounds =  true
            princess.layer.cornerRadius = 2;

            addSubview(princess)
}

Rufen Sie im Viewcontroller beim Erstellen der Zelle für den Indexpfad die obige Methode auf

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! GameCollectionViewCell
    cell.updateView()       
    return cell
}
0
Srinivasan Raman 17 Jän. 2019 im 21:29

Es ist richtig, dass Sie eine Methode in einer Erweiterung nicht überschreiben sollten, genau wie Sie es in LifeCycle-Methoden Ihrer Controller tun (z. B. viewDidLoad(). Beachten Sie auch, dass Sie meistens {{X1} aufrufen sollten. } Erstellen Sie stattdessen eine Unterklasse.

Fügen Sie beim Hinzufügen von Unteransichten in einer Unterklasse UICollectionViewCell Ihre Codes in die init-Methode ein:

override init(frame: CGRect) {
    super.init(frame: frame)
}

Wenn Sie etwas in der Ebene Ihrer Ansicht ändern möchten, können Sie layoutSubviews() überschreiben:

override func layoutSubviews() {
        super.layoutSubviews()

}

Ich hoffe das hilft.

0
Glenn 18 Jän. 2019 im 05:21