2013-03-01 6 views
6

Wie implementieren Sie Header in einer uicollectionview? Ich weiß, dass Sie ergänzende Ansichten hinzufügen können, aber ich weiß nicht, wie Sie sie über einem Abschnitt "schweben" lassen, wie es Header in einer uitableview tun.UICollectionView Schwebende Header oben und auf der Seite

Hier ist meine Situation: Ich habe eine Collectionview mit den Zellen in einem Rasterformat ausgelegt. Sie können horizontal und vertikal scrollen. Ich möchte oben eine Kopfzeile haben, damit Sie beim horizontalen Bildlauf horizontal scrollen, aber nicht vertikal blättern. Ich möchte auch die gleiche Sache auf der linken Seite, wo es vertikal mit der Collectionview aber nicht horizontal scrollt. Ist dies mit ergänzenden Ansichten der richtige Ansatz?

Die endgültige Funktionalität, nach der ich suche, ähnelt der Numbers-Tabellenkalkulations-App auf iOS.

Vielen Dank im Voraus für Ihre Hilfe!

Antwort

19

Update für iOS9:

let flow = collectionView.collectionViewLayout as! UICollectionViewFlowLayout 
flow.sectionHeadersPinToVisibleBounds = true 

Pass entlang.

+0

Schnell und einfach. Dies ist eine noch bessere Option, als in UITableView zwischen gruppiert/plain wählen zu müssen. Danke, mein guter Herr. – NSGangster

+0

Sie sind großartig! Genial! – deepax11

9

EDIT: Wie in den Kommentaren erwähnt, ist diese Antwort gültig, aber nicht für mehrere Abschnitte. Sehen Sie dieses Blog für eine bessere Lösung: http://blog.radi.ws/post/32905838158/sticky-headers-for-uicollectionview-using#notes


Sie müssen dieses Verhalten in Ihrem Layout angeben:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSMutableArray* attributesArray = [[super layoutAttributesForElementsInRect:rect] mutableCopy]; 

    BOOL headerVisible = NO; 

    for (UICollectionViewLayoutAttributes *attributes in attributesArray) { 
    if ([attributes.representedElementKind isEqualToString:UICollectionElementKindSectionHeader]) { 
     headerVisible = YES; 
     attributes.frame = CGRectMake(self.collectionView.contentOffset.x, 0, self.headerReferenceSize.width, self.headerReferenceSize.height); 
     attributes.alpha = HEADER_ALPHA; 
     attributes.zIndex = 2; 
    } 
    } 

    if (!headerVisible) { 
    UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader 
                         atIndexPath:[NSIndexPath 
                            indexPathForItem:0 
                            inSection:0]]; 
    [attributesArray addObject:attributes]; 
    } 

    return attributesArray; 
} 
+0

Wenn Sie also den x-Ursprung des Frames auf "self.collectionView.contentOffset.x" setzen, bleibt er so an der Seite des Frames der Ansicht hängen. Vielen Dank für die Antwort! –

+0

In diesem Fall ist das für die X-Achse korrekt. Für Ihr Szenario müssten Sie mit einer zweiten Kopfzeile, die der Y-Achse folgt, duplizieren. –

+0

Dies ist ein schäbiger Hack, der nur für Sammlungsansichten mit Kopfzeilen nur für den ersten Abschnitt funktioniert. –

Verwandte Themen