2014-04-01 1 views
22

Ho unoin uno dei miei viewcontroller. La mia vista raccolta utilizza una sottoclasse di UICollectionViewLayout (personalizzata) per il layout delle celle. Per prima cosa, non appena seleziono Layout come personalizzato nel menu a discesa sullo storyboard, l'opzione per selezionare le viste supplementari scompare.Come aggiungere l'intestazione a livello di codice su UICollectionView con UICollectionViewLayout

Ho provato a farlo programmaticamente come mostrato di seguito, ma nessuno dei metodi delegati viene chiamato.

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 
{ 
    if (kind == UICollectionElementKindSectionHeader) { 

     UICollectionReusableView *reusableview = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath]; 

     if (reusableview==nil) { 
      reusableview=[[UICollectionReusableView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
      } 

     UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
     label.text=[NSString stringWithFormat:@"Recipe Group #%li", indexPath.section + 1]; 
     [reusableview addSubview:label]; 
     return reusableview; 
     } 
    return nil; 
    } 

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section { 
    CGSize headerSize = CGSizeMake(320, 44); 
    return headerSize; 
    } 

nel mio metodo viewDidLoad devo

[self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView"]; 

Qualcuno mi può punto dove sto rovinare?

+0

hanno impostato delegato alla visualizzazione collezione? - 'collectionView setDelegate:' - 'collectionView setDataSource:' – james075

+0

Sì, l'origine dati è impostata. Vengono chiamati tutti gli altri metodi dell'origine dati. –

+0

Non aggiungere l'etichetta ogni volta. Finirai con le etichette sopra le etichette. Sarà necessario creare una sottoclasse con l'etichetta come proprietà, o impostarla nell'istruzione if se sarà statica. – Sean

risposta

9

trovato il problema, non stavo tornando attributi del mio header in questo metodo UICollectionLayoutView:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect; // return an array layout attributes instances for all the views in the given rect 
18

Stai passando il tipo di visualizzazione errata.

La vostra linea la registrazione della classe:

[self.collectionView registerClass:[UICollectionReusableView class] 
    forSupplementaryViewOfKind:UICollectionElementKindSectionFooter 
    withReuseIdentifier:@"HeaderView"]; 

dovrebbe essere:

[self.collectionView registerClass:[UICollectionReusableView class] 
    forSupplementaryViewOfKind: UICollectionElementKindSectionHeader 
    withReuseIdentifier:@"HeaderView"]; 

Edit: Sembra che il codice è tutto utilizzando sectionFooter. Stai cercando di aggiungere un'intestazione o un piè di pagina a livello di programmazione?

+0

Stavo cercando di aggiungere entrambi, ma nessuno ha funzionato. I metodi delegati non vengono nemmeno chiamati. (Ho aggiornato la domanda però) –

+0

@ManishAhuja Hai detto che hai un layout personalizzato, implementa layoutAttributesForSupplementaryViewOfKind: atIndexPath:? – dannyzlo

+0

Sì, lo fa. Ma anche questo non viene chiamato. –

8

Verificare che ti ha dato formato di riferimento per l'intestazione in UICollectionViewFlowLayout

[flowLayout setHeaderReferenceSize:CGSizeMake(320, 50)]; 

e piè di pagina

[flowLayout setFooterReferenceSize:CGSizeMake(320, 50)]; 
+5

Questi metodi sono disponibili solo per UICollectionViewFlowLayout e non per UICollectionViewLayout. –

0

il vostro controllo:

if (kind == UICollectionElementKindSectionFooter) 

vostro dovrebbe verificare la presenza di: UICollectionElementKindSectionHeader

stesso per:

dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter

1

vostro metodo delegato per la dimensione di riferimento intestazione è sbagliata, si chiamano metodo piè di pagina, referenceSizeForFooterInSection, come segue:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section { 
    CGSize headerSize = CGSizeMake(320, 44); 
    return headerSize; 
} 

Imposta individualmente HeaderReferenceSize risolverà il problema dell'intestazione. Ma l'app si blocca mantenendo il metodo sopra riportato e restituendo nil in viewForSupplementaryElementOfKind per Piè di pagina.

1

penso che si dovrebbe chiamare questo nel metodo viewdidload:

[collectionViewFlowLayout setHeaderReferenceSize:CGSizeMake(self.collectionView.frame.size.width, 50)];