2014-02-12 12 views
12

Ich habe ein UICollectionView. Ich möchte einen Header hinzufügen. Mein Header wäre nur ein UILabel. Ich habe:eine einfache UIView als Header UICollectionView

1) ausgewählt "Section Header" als Sammlung Ansicht Zubehör im IB.

2) erstellt eine Sammlung wiederverwendbare Ansicht im IB, auf der Seite, erklärt, wie collectionViewHeader.

3) hinzugefügt diese Zeilen:

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

      return collectionViewHeader; 
    } 
    return nil; 
} 

Aber sie sind nie genannt.

Habe ich eine Klasse erstellen, müssen nur für das Etikett, um

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

zu benutzen?

Warum ist es nicht so einfach wie die UITableView, wo man einfach per Drag-and-Drop wollen was auch immer Header Sie? Die Dinge sind so mit UICollectionView kompliziert ...

Antwort

13

Wenn Sie den Header in Storyboard nicht setzen, werden Sie es registrieren.

In viewDidLoad:

- (void)viewDidLoad 
{ 
    [self.collectionView registerClass:[YourOwnSubClass class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView"]; 
} 

Aber jede Art und Weise, müssen Sie UICollectionReusableView Unterklasse.

@interface YourOwnSubClass : UICollectionReusableView 

dann:

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

    YourOwnSubClass *headerView = [collectionView dequeueReusableSupplementaryViewOfKind: 
             UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];  
    [self updateSectionHeader:headerView forIndexPath:indexPath]; 

    return headerView; 
} 

- (void)updateSectionHeader:(UICollectionReusableView *)header forIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *text = [NSString stringWithFormat:@"header #%i", indexPath.row]; 
    header.label.text = text; 
} 
+1

Dankten ändern für deine Antwort. Leider wird der collectionView: viewForSupplementaryElementOfKind: atIndexPath nicht aufgerufen. Und wissen Sie, wie Sie Ihrer YourOwnSubClass eine Feder hinzufügen? –

+0

dann hast du vielleicht vergessen dich selbst als Delegierten zu definieren? Was meinst du? eine Feder als Unteransicht hinzufügen? oder initialisiere YourOwnSubClass von der Nib? – Raz

+0

Delegate ist gesetzt, alles andere funktioniert gut:/Ich meine YourOwnSubClass von Nib initialisieren, da es eine UICollectionReusableView ist. –

12

In schnellen wie unten

Register Kopfansicht

collectionView.registerClass(HeaderView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "headerView") 

In UICollectionViewDelegate

func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { 

    let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: "headerView", forIndexPath: indexPath) 

    headerView.frame.size.height = 100 

    return headerView 
} 

Wichtig ist, dass Sie den Fluss Layout mit der Größe Header sind liefern

flowLayout.headerReferenceSize = CGSize(width: self.collectionView.height, height: 100) 

Andernfalls wird die delegierte Methode nicht

4

genannt wird Setzen Sie sich einfach den Blick auf UICollectionView hinzufügen und insets

collectionView.addSubview(headerView) 
collectionView.contentInset.top = 300 

headerView.frame = CGRect(x: 0, 
          y: -300, 
          width: collectionView.frame.size.width, 
          height: 300) 
+3

das fühlt sich an wie ein Hack –

+1

@RayTso Wir fügen nur eine Ansicht zu einer anderen Ansicht hinzu. Ich sehe, dass dies in vielen Apps gemacht wird – onmyway133

Verwandte Themen