Frage Wie setze ich UICollectionViewDelegateFlowLayout?


Ein UIViewController verwaltet einen Verweis auf eine UICollectionView. Der Controller sollte das integrierte Flusslayout mithilfe von UICollectionViewDelegateFlowLayout ändern.

Es ist ziemlich einfach, die Datenquelle der Ansicht auf self zu setzen:

MyViewController.m

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

Aber wie stelle ich den Controller als das Delegate-Flow-Layout der Ansicht ein?

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

Ich habe es versucht:

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

Aber ich bekomme den Fehler: "Inkompatible Zeigertypen, die zuweisen ...".

Die Auflistungsheaderdatei sieht folgendermaßen aus:

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>

75
2017-10-17 00:08


Ursprung


Antworten:


Gerade self.collectionView.delegate = self;. Beachten Sie, dass UICollectionViewDelegateFlowLayout erbt von UICollectionViewDelegate.

Ich gebe zu, es kann dich auf den ersten Blick überraschen.

Oh, und das wird nur funktionieren, wenn self.collectionView.collectionViewLayout ist tatsächlich auf Ihr Flow-Layout eingestellt. (oder mit einstellen initWithFrame:collectionViewLayout:)


191
2017-10-17 00:38



Laut vorheriger Antwort nur ein Anwendungsbeispiel. Es ist wirklich nicht klar, aber ich kann zeigen, wie es funktioniert:

@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

9
2018-04-06 13:06