2012-10-17 24 views
71

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

Es ist ziemlich einfach die Ansicht der Datenquelle selbst zu setzen:

MyViewController.m

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

Aber wie kann ich den Controller einstellen der Delegat Fluss Layout der Ansicht zu sein?

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

Ich habe versucht:

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

Aber ich bekomme die Fehlermeldung: "Nicht kompatible Zeigertypen zuweisen ...".

Die Sammlung Header-Datei sieht wie folgt aus:

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout> 

Antwort

182

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

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

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

+1

@JohnEstropia, tut mir leid für die Frage, aber wie benutzerdefinierte Layout im Code zu initiieren? 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]' –

7

Nach vorheriger Antwort nur Beispiel der Verwendung. 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