0

Warum wird UICollectionViews cellForItem am Indexpfad für ALLE Zellen aufgerufen, bevor es angezeigt wird. Sollte das CollectionView nicht nur die Zellen bekommen, die es benötigt..i.e. die Zellen, die auf dem Bildschirm wie eine Tabellenansicht angezeigt werden?Warum wird UICollectionViews cellForItem am Indexpfad für ALLE Zellen direkt am Anfang aufgerufen?

Schritte

  • Storyboard mit Viewcontroller. ViewController verfügt über CollectionView. CollectionView verfügt über ein vertikales Ablauflayout.

  • Viewcontroller hat IBOutlet für die Collection und implementiert die Datenquelle des Collection und Delegatmethoden

  • Innerhalb der Datenquelle und Delegatmethoden Zellen (die Verwendung automatischen Layout für ihre Größe) an die Kollektiongeben werden .. Zelle Artikel auf Indexpfad

eine print-Anweisung platzieren, bevor die Zelle geführt wird, zeigen, dass alle Zellen angefordert werden, bevor die Kollektion auf dem Bildschirm angezeigt wird.

import UIKit 

class ViewController: UIViewController { 
    @IBOutlet weak var collectionView: UICollectionView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var flowLayout=collectionView.collectionViewLayout as! UICollectionViewFlowLayout; 
     flowLayout.estimatedItemSize = CGSize(width:20,height:30); 
     self.collectionView.register(UINib(nibName:"ShortCell", bundle:nil), forCellWithReuseIdentifier: "ShortCell"); 
     self.collectionView.register(UINib(nibName:"LongCell", bundle:nil), forCellWithReuseIdentifier: "LongCell"); 
    } 
} 

extension ViewController:UICollectionViewDelegate,UICollectionViewDataSource{ 
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return 500; 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let row=indexPath.row; 
     print("row:",indexPath.row); 
     let rem = row % 2; 
     if(rem==0){ 
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ShortCell", for: indexPath); 
      return cell; 
     } 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "LongCell", for: indexPath); 
     return cell; 
    } 
} 

Warum benötigt die CollectionView alle Zellen, bevor es angezeigt wird? Warum fragt es Zellen nicht nur stückchenweise wie eine Tabellenansicht? Ist das ein Problem?

+0

hmmm? Ich habe Ihren Code in einem neuen Testansicht-Controller ausgeführt, und nur die sichtbaren und teilweise sichtbaren Zellen werden angefordert. – DonMag

+0

Verwenden Ihre Zellen das automatische Layout für ihre Größe? – BigAl

+0

Ich habe nur grundlegende Zellen in externen XIB-Dateien erstellt und den Code ohne Änderungen ausgeführt. – DonMag

Antwort

1

Nach einem bisschen Untersuchung ...

Wenn flowLayout.estimatedItemSize verwendet, Auto-Layout ist ein Layout Pass zu berechnen, wie viele Zellen zu dieser geschätzten Größe passen, jeder innerhalb der ignorierend Auto-Sizing tatsächliche Zellen.

Also, wenn Sie .estimatedItemSize auf eine tatsächliche geschätzte Größe, ändern, sollten Sie nur erhalten (etwa) die Anzahl der Anrufe zu cellForItemAt nach Bedarf.

Seien Sie einfach vorsichtig, dass Sie nicht die Größe überschätzt. Wenn Sie das tun, erhalten Sie entweder mit einem ganzen Bündel von

Das Verhalten des UICollectionViewFlowLayout up ist nicht definiert, weil: die Artikel Breite muss kleiner sein als die Breite der UICollectionView abzüglich der Abschnitt Einsätze links und rechts Werte , abzüglich der Inhaltseinfügungen links und rechts Werte.

Fehlermeldungen, oder Sie erhalten doof (ungenau) Scroll-Indikatoren.

+0

Meine geschätzte Größe entspricht der tatsächlichen Größe der Zellen, und die uicollectionview-Funktion hat wie erwartet funktioniert und nur Zellen bei Bedarf erhalten! Danke für den Tipp :) – BigAl

Verwandte Themen