UICollectionViewDelegateFlowLayout nasıl ayarlanır?


108

Bir UIViewController, bir UICollectionView için bir başvuru tutar. Denetleyici, UICollectionViewDelegateFlowLayout kullanarak yerleşik akış düzenini değiştirmelidir.

Görünümün veri kaynağını self olarak ayarlamak oldukça kolaydır:

MyViewController.m

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

Ancak denetleyiciyi, görünümün temsilci akış düzeni olacak şekilde nasıl ayarlayabilirim?

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

Denedim:

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

Ama şu hatayı alıyorum: "Uyumsuz işaretçi türleri atanıyor ...".

Koleksiyon başlık dosyası şuna benzer:

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>

Yanıtlar:


265

Sadece self.collectionView.delegate = self;. Not UICollectionViewDelegateFlowLayoutgelen devralırUICollectionViewDelegate .

İlk başta beni hazırlıksız yakaladığını kabul ediyorum.

Oh ve bu sadece self.collectionView.collectionViewLayoutakış düzeninize gerçekten ayarlanmışsa çalışacaktır . (veya şununla ayarla initWithFrame:collectionViewLayout:)


1
@JohnEstropia, soru için özür dilerim, ancak kodda özel düzen nasıl başlatılır? Görsel senaryo taslakları ile örnekler görüyorum ama kodun kendisiyle değil. Ne yapmalıyım?
gaussblurinc

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

14

Önceki cevaba göre sadece kullanım örneği. Gerçekten net değil ama nasıl çalıştığını gösterebilirim:

@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

MacOS Mojave için iki sentim - Swift

(Aradım buraya NSCollectionViewdüştüm ... Sorunun hakkında olduğunu biliyorum UICollectionView..)

Yukarıda belirtilenlerin tümü (temsilcinin belirtilmesi hücre boyutunu da ifade eder) macOS için de doğrudur.

NOT : Yazarsanız:

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

yöntem:

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

olacaktır çağrılabilir.

Kaldırılırsa, hiçbir temsilci yöntemi çağrılmaz. (sınıf protokole uymadığı için).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.