2012-10-03 1 views
39

Sto lavorando a un progetto che utilizza uno UICollectionView per mostrare diversi album. Le voci mostrano bene, ma ora voglio mostrare un'intestazione sopra la prima sezione.UICollectionView intestazione non visualizzata

Per fare ciò, ho aggiunto il registerNib:forSupplementaryViewOfKind:withReuseIdentifier: al mio metodo init. Come questo:

[self.collectionView registerNib:[UINib nibWithNibName:@"AlbumHeader" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kAlbumHeaderIdentifier]; 

(. Il AlbumHeader pennino contiene una vista della classe AlbumHeader, che è una sottoclasse di UICollectionView)

Dopo di che, ho realizzato collectionView:viewForSupplementaryElementOfKind:atIndexPath metodo:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { 
    return [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:kAlbumHeaderIdentifier forIndexPath:indexPath]; 
} 

Ora dovrebbe provare a caricare la vista dell'intestazione, suppongo. Ma non è così, il metodo per la vista supplementare non viene chiamato.

Cosa mi manca? Bloccato per ore, ho letto la documentazione su UICollectionView s molte volte, ma nulla sembra aiutare. qualche idea?

risposta

106

Dopo aver guardato per il metodo YUF chiesto, ho leggere che per impostazione predefinita la dimensione delle intestazioni/piè di pagina è 0,0. Se la dimensione è 0, l'intestazione/il piè di pagina non verranno visualizzati.

È possibile impostare il formato con una proprietà:

flowLayout.headerReferenceSize = CGSizeMake(0, 100); 

Poi tutte le intestazioni avranno la stessa dimensione. Se deve essere diverso per ogni sezione, è possibile implementare il seguente metodo, che fa parte del protocollo UICollectionViewDelegateFlowLayout.

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { 
    if (section == albumSection) { 
     return CGSizeMake(0, 100); 
    } 

    return CGSizeZero; 
} 

noti che in verticale scorrimento utilizza la restituito height e la larghezza della vista raccolta, in scorrimento orizzontale che utilizza il ritorno width e l'intera altezza della vista raccolta.

+4

Per chiunque stia ancora affrontando questo problema, per far sì che funzioni, dovevo anche dare una dimensione a "collectionview.footerReferenceSize". Non sono sicuro se tale richiesta sia specifica per iOS 7 ... –

+1

Questo è un consiglio incredibile. Grazie mille, Guido! – Fattie

+1

Goditi questa grazia! :) – Fattie

2

Forse si sceglie di implementare:

- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 

C'è un sacco di metodi per implementare solo per far funzionare una cosa ... sto imparando troppo. Dimmi se funziona.

Modifica: metodo sbagliato mi dispiace. Questo è per sottoclassi, penso. Quello che sto parlando è in UICollectionViewLayout (l'oggetto layout sottoclasse, se il layout supporta viste supplementari):

- layoutAttributesForSupplementaryViewOfKind:atIndexPath: 

Vedi qui: https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UICollectionViewLayout_class/Reference/Reference.html#//apple_ref/occ/cl/UICollectionViewLayout

+0

Questo metodo non sembra essere parte di alcun delegato? –

+0

@GuidoH hai usato FlowLayout o il tuo layout personalizzato? Questa risposta si riferisce al layout personalizzato. – Juguang

+0

Ho usato il layout del flusso. La risposta accettata ha risolto tutto e ha anche senso. =) –