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?
hmmm? Ich habe Ihren Code in einem neuen Testansicht-Controller ausgeführt, und nur die sichtbaren und teilweise sichtbaren Zellen werden angefordert. – DonMag
Verwenden Ihre Zellen das automatische Layout für ihre Größe? – BigAl
Ich habe nur grundlegende Zellen in externen XIB-Dateien erstellt und den Code ohne Änderungen ausgeführt. – DonMag