Bagaimana cara mengatur UICollectionViewDelegateFlowLayout?


108

UIViewController menyimpan referensi ke UICollectionView. Pengontrol harus memodifikasi tata letak aliran bawaan menggunakan UICollectionViewDelegateFlowLayout.

Cukup mudah untuk menyetel sumber data tampilan ke sendiri:

MyViewController.m

- (void)viewDidLoad
{
    self.collectionView.dataSource = self;
}

Tapi bagaimana cara mengatur pengontrol menjadi tata letak aliran delegasi tampilan?

- (void)viewDidLoad
{
    self.collectionView.dataSource= self;
    // self.collectionView.??? = self; 
}

Saya sudah mencoba:

- (void)viewDidLoad
{
    self.collectionView.dataSource= self;
    self.collectionView.collectionViewLayout = self; 
}

Tapi saya mendapatkan kesalahan: "Jenis penunjuk tidak kompatibel yang menetapkan ...".

File header koleksi terlihat seperti ini:

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>

Jawaban:


265

Cuma self.collectionView.delegate = self;. Perhatikan bahwa UICollectionViewDelegateFlowLayoutmewarisi dari UICollectionViewDelegate.

Saya akui itu membuat saya lengah pada awalnya.

Oh dan ini hanya akan berfungsi jika self.collectionView.collectionViewLayoutbenar-benar diatur ke tata letak aliran Anda. (atau set dengan initWithFrame:collectionViewLayout:)


1
@JohnEstropia, maaf atas pertanyaannya, tetapi bagaimana cara menggunakan tata letak khusus dalam kode? Saya melihat contoh dengan papan cerita tetapi tidak dengan kode itu sendiri. Apa yang harus saya lakukan?
gaussblurinc

3
mungkin, self.collectionViewLayout = UICollectionViewFlowLayout(),self.collectionViewLayout = [[UICollectionViewFlowLayout alloc]init]
Daishi Nakajima

14

Menurut jawaban sebelumnya hanya contoh penggunaan. Ini benar-benar tidak jelas tetapi saya dapat menunjukkan cara kerjanya:

@interface PrettyViewController()<UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
    //some code
@end

@implementation PrettyViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.collectionView.delegate = self;//bingo! right here
}

#pragma mark - UICollectionViewDelegateFlowLayout

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section {
    return CGSizeMake([[UIScreen mainScreen] bounds].size.width, 20.0);
}


@end

1

Dua sen saya untuk macOS Mojave - Swift

(Saya telah jatuh ke sini mencari NSCollectionView... Saya tahu pertanyaannya tentang UICollectionView..)

Semua yang dikatakan di atas (menentukan delegasi menyiratkan ukuran sel, juga) benar untuk macOS juga.

CATATAN : Jika Anda menulis:

class MyViewController:
    NSCollectionViewDelegate,
    NSCollectionViewDataSource,
    **NSCollectionViewDelegateFlowLayout** 
{

metode:

func collectionView(_ collectionView: NSCollectionView, 
                      layout collectionViewLayout: NSCollectionViewLayout, 
               sizeForItemAt indexPath: IndexPath) -> NSSize

akan dipanggil.

Jika dihapus, tidak ada metode delegasi yang akan dipanggil. (karena kelas tidak mematuhi protokol).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.