2012-10-03 24 views
39

Ich arbeite an einem Projekt, das eine UICollectionView verwendet, um mehrere Alben anzuzeigen. Die Gegenstände zeigen gut, aber jetzt möchte ich eine Überschrift über dem ersten Abschnitt zeigen.UICollectionView-Header wird nicht angezeigt

Dazu habe ich die registerNib:forSupplementaryViewOfKind:withReuseIdentifier: meiner Init-Methode hinzugefügt. Wie folgt aus:

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

(. Die AlbumHeader Nib enthält eine Ansicht der Klasse AlbumHeader, die eine Unterklasse von UICollectionView ist)

Danach setzte ich collectionView:viewForSupplementaryElementOfKind:atIndexPath Methode:

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

Jetzt Es sollte versuchen, die Header-Ansicht zu laden, nehme ich an. Aber es wird nicht, die Methode für die ergänzende Ansicht wird nicht aufgerufen.

Was fehlt mir? Stuck für Stunden, habe die Dokumentation auf UICollectionView s oft gelesen, aber nichts scheint zu helfen. Irgendwelche Gedanken?

Antwort

106

für das Verfahren Nach einem Blick YuF gefragt, ich lesen Sie, dass die Größe der Kopf-/Fußzeilen standardmäßig 0,0 ist. Wenn die Größe 0 ist, wird die Kopf-/Fußzeile nicht angezeigt.

Sie können die Größe mit einer Eigenschaft:

flowLayout.headerReferenceSize = CGSizeMake(0, 100); 

Dann werden alle Header die gleiche Größe haben. Wenn es für jeden Abschnitt anders sein muss, können Sie die folgende Methode implementieren, die Teil des Protokolls UICollectionViewDelegateFlowLayout ist.

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

    return CGSizeZero; 
} 

anzumerken, dass in der vertikalen Bildlauf er die zurück height und die volle Breite der Sammelansicht, in horizontal-Scrolling verwendet es verwendet die Rückkehr width und über die volle Höhe der Auflistungsansicht.

+4

Für alle, die noch in dieses Problem hineingeraten, musste ich, um diese Arbeit zu machen, auch eine Größe für 'collectionview.footerReferenceSize' angeben. Nicht sicher, ob diese Anforderung iOS 7 spezifisch ist ... –

+1

Dies ist ein unglaublicher Tipp. Tausend Dank, Guido! – Fattie

+1

Genießen Sie diese Prämie! :) – Fattie

2

Haben Sie implementieren:

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

Es gibt eine Tonne von Methoden ist einfach zu implementieren, eine Sache, Arbeit zu machen ... Ich bin zu lernen. Sag mir, ob es funktioniert.

Edit: Sorry falsche Methode. Das ist für Unterklassen, denke ich. Derjenige ich spreche ist in UICollectionViewLayout (das Layout-Objekt Sie Unterklasse, wenn Ihr Layout ergänzenden Ansichten unterstützt):

- layoutAttributesForSupplementaryViewOfKind:atIndexPath: 

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

+0

Diese Methode scheint nicht Teil eines Delegierten zu sein? –

+0

@GuidoH haben Sie FlowLayout oder Ihr benutzerdefiniertes Layout verwendet? Diese Antwort bezieht sich auf ein benutzerdefiniertes Layout. – Juguang

+0

Ich habe das Flusslayout verwendet. Die akzeptierte Antwort löste alles und macht auch Sinn. =) –