2012-10-17 11 views
71

Un UIViewController mantiene un riferimento a UICollectionView. Il controller deve modificare il layout del flusso incorporato utilizzando UICollectionViewDelegateFlowLayout.Come impostare UICollectionViewDelegateFlowLayout?

E 'abbastanza facile da impostare l'origine dati del fine di sé:

MyViewController.m

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

Ma come faccio a impostare il controller per il layout di flusso delegato della vista?

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

ho provato:

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

ma ho l'errore: "tipi di puntatore incompatibili assegnando ...".

file di intestazione

La collezione si presenta così:

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout> 

risposta

182

Proprio self.collectionView.delegate = self;. Si noti che UICollectionViewDelegateFlowLayout eredita da UICollectionViewDelegate.

Ammetto che in un primo momento ti sorprenderà.

Oh e questo funziona solo se self.collectionView.collectionViewLayout è effettivamente impostato sul layout del flusso. (o impostato con initWithFrame:collectionViewLayout:)

+1

@JohnEstropia, scusa per la domanda, ma come iniziare il layout personalizzato nel codice? Vedo esempi con storyboard ma non con il codice stesso. Cosa dovrei fare? – gaussblurinc

+3

probabilmente, 'self.collectionViewLayout = UICollectionViewFlowLayout()', 'self.collectionViewLayout = [[UICollectionViewFlowLayout alloc] init]' –

7

In base alla precedente risposta, solo un esempio di utilizzo. Non è chiaro, ma posso mostrare come funziona:

@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