2014-04-01 14 views
22

hinzufügen habe ich eine UICollectionView in einem meiner viewcontroller. Meine Sammlungsansicht verwendet eine Unterklasse von UICollectionViewLayout (benutzerdefiniert) zum Layout der Zellen. Als erstes wähle ich Layout als Benutzerdefiniert im Dropdown-Menü des Storyboards und die Option zur Auswahl zusätzlicher Ansichten wird entfernt.Wie programm Header auf UICollectionView mit UICollectionViewLayout

Ich habe versucht, dass programmatisch tun, wie unten gezeigt, aber keiner der Delegatmethoden genannt bekommen.

- (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; 
    } 

In meiner viewDidLoad Methode habe ich

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

Kann jemand mir zeigen, wo ich vermasselt?

+0

haben Sie Delegaten Sammlung Ansicht verwenden? - 'collectionView setDelegate:' - 'collectionView setDataSource:' – james075

+0

Ja, die Datenquelle ist gesetzt. Alle anderen Datenquellenmethoden werden aufgerufen. –

+0

Sollte das Etikett nicht jedes Mal hinzufügen. Sie werden mit Etiketten auf Etiketten enden. Muss eine Unterklasse mit der Bezeichnung als Eigenschaft erstellen oder sie in der if-Anweisung festlegen, wenn sie statisch ist. – Sean

Antwort

9

das Problem gefunden, ich war nicht Attribute meiner Header in diesem UICollectionLayoutView Methode Rückkehr:

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

Du bist in der falschen Ansicht Art vorbei.

Ihre Linie die Klasse Registrierung:

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

werden sollten:

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

bearbeiten: Sieht aus wie Ihr Code alle mit sectionFooter ist. Versuchen Sie, eine Kopfzeile oder eine Fußzeile programmgesteuert hinzuzufügen?

+0

Ich habe versucht, beide hinzuzufügen, aber keine funktionierte. Die Delegiertenmethoden werden nicht einmal aufgerufen. (Ich aktualisierte die Frage zwar) –

+0

@ManishAhuja Sie erwähnten, dass Sie ein benutzerdefiniertes Layout haben, implementiert es layoutAttributesForSupplementaryViewOfKind: atIndexPath:? – dannyzlo

+0

Ja, tut es. Aber das wird auch nicht genannt. –

8

Überprüfen Sie, ob Sie die Referenzgröße in UICollectionViewFlowLayout für Kopf gab

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

und Fußzeile

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

Diese Methoden sind nur für UICollectionViewFlowLayout und nicht für UICollectionViewLayout verfügbar. –

0

Ihr Scheck:

if (kind == UICollectionElementKindSectionFooter) 

Ihr sollte überprüfen: UICollectionElementKindSectionHeader

gleiche gilt für:

dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter

1

Ihr Delegatmethode für Kopfreferenzgröße falsch ist, rufen Sie Fußzeile Methode, referenceSizeForFooterInSection, wie folgt:

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

Individuell gesetzt HeaderReferenceSize wird das Header-Problem beheben. Aber App wird zum Absturz führen Sie die oben genannte Methode und geben Null in viewForSupplementaryElementOfKind für Footer zurück.

1

Ich glaube, Sie dies in Ihrem viewdidload Methode aufrufen sollte:

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