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>
Apodaca Kaya
sumber

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:)

John Estropia
sumber
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
WINSergey
sumber
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).

ingconti
sumber