Mengapa cellForItem UICollectionView di jalur indeks, dipanggil untuk SEMUA sel sebelum ditampilkan. Bukankah seharusnya collectionView hanya mendapatkan sel yang dibutuhkannya.. sel yang akan ditampilkan di layar seperti tampilan tabel?

Langkah

  • Papan cerita dengan ViewController. ViewController memiliki CollectionView. CollectionView memiliki tata letak aliran vertikal.

  • ViewController memiliki IBOutlet untuk collectionView dan mengimplementasikan sumber data collectionView dan metode delegasi

  • Di dalam sumber data dan sel metode delegasi (yang menggunakan tata letak otomatis untuk ukurannya) diteruskan ke tampilan koleksi .. sel untuk item di jalur indeks

Menempatkan pernyataan cetak sebelum sel dilewatkan, menunjukkan bahwa semua sel diminta sebelum tampilan koleksi ditampilkan di layar.

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;
    }
}

Mengapa tampilan koleksi perlu mendapatkan semua sel sebelum ditampilkan? Mengapa itu tidak hanya meminta sel sedikit demi sedikit seperti tampilan tabel? Apakah ini masalah?

0
BigAl 12 Oktober 2017, 18:56
Hmmm? Saya baru saja menjalankan kode Anda di pengontrol tampilan pengujian baru, dan hanya sel yang terlihat dan sebagian terlihat yang diminta.
 – 
DonMag
12 Oktober 2017, 19:22
Apakah sel Anda menggunakan tata letak otomatis untuk ukurannya?
 – 
BigAl
12 Oktober 2017, 19:32
Saya baru saja membuat sel dasar dalam file xib eksternal, dan menjalankan kode Anda tanpa pengeditan.
 – 
DonMag
12 Oktober 2017, 19:34

1 menjawab

Jawaban Terbaik

Setelah sedikit menyelidiki ...

Saat menggunakan flowLayout.estimatedItemSize, tata letak otomatis membuat pass tata letak untuk menghitung berapa banyak sel yang akan muat pada ukuran yang diperkirakan, mengabaikan ukuran otomatis apa pun dalam sel yang sebenarnya .

Jadi, jika Anda mengubah .estimatedItemSize ke perkiraan ukuran sebenarnya, Anda hanya akan mendapatkan (sekitar) jumlah panggilan ke cellForItemAt sesuai kebutuhan.

Berhati-hatilah agar Anda tidak melebih-lebihkan ukurannya. Jika Anda melakukannya, Anda akan berakhir dengan sejumlah besar

Perilaku UICollectionViewFlowLayout tidak ditentukan karena: lebar item harus kurang dari lebar UICollectionView dikurangi bagian yang menyisipkan nilai kiri dan kanan, dikurangi nilai kiri dan kanan sisipan konten.

Pesan kesalahan, atau Anda mendapatkan indikator gulir berukuran konyol (tidak akurat).

2
DonMag 12 Oktober 2017, 21:22
Membuat perkiraan ukuran saya mendekati ukuran sebenarnya dari sel dan uicollectionview mulai bekerja seperti yang diharapkan, hanya mendapatkan sel saat dibutuhkan! Terima kasih atas tipnya :)
 – 
BigAl
12 Oktober 2017, 23:41