Wie setze ich UICollectionViewDelegateFlowLayout?


108

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

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

MyViewController.m

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

Aber wie stelle ich den Controller als 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 die Fehlermeldung: "Inkompatible Zeigertypen zuweisen ...".

Die Sammlungsheaderdatei sieht folgendermaßen aus:

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>

Antworten:


265

Einfach self.collectionView.delegate = self;. Beachten Sie, dass UICollectionViewDelegateFlowLayouterbt von UICollectionViewDelegate.

Ich gebe zu, es hat mich zuerst überrascht.

Oh, und das funktioniert nur, wenn self.collectionView.collectionViewLayoutes tatsächlich auf Ihr Ablauflayout eingestellt ist. (oder setzen mit initWithFrame:collectionViewLayout:)


1
@ JohnEstropia, sorry für die Frage, aber wie man ein benutzerdefiniertes Layout im Code initiiert? Ich sehe Beispiele mit Storyboards, aber nicht mit Code selbst. Was soll ich machen?
Gaussblurinc

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

14

Nach vorheriger Antwort nur 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

1

Meine zwei Cent für macOS Mojave - Swift

(Ich bin hierher gefallen auf der Suche nach NSCollectionView... Ich weiß, die Frage war ungefähr UICollectionView...)

Alles oben Gesagte (die Angabe eines Delegaten impliziert auch die Zellengröße) ist auch für macOS korrekt.

HINWEIS : Wenn Sie schreiben:

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

die Methode:

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

wird aufgerufen.

Wenn entfernt, wird keine Delegatmethode aufgerufen. (da die Klasse das Protokoll nicht befolgt).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.