2013-03-01 19 views
6

Come si implementano le intestazioni in una vista di raccolta? So che puoi inserire viste supplementari, ma non so come farle "fluttuare" sopra una sezione come le intestazioni di un uitableview do.UICollectionView Intestazioni mobili sulla parte superiore e laterale

Ecco la mia situazione: ho una vista delle collezioni con le celle disposte in un formato a griglia. È possibile scorrere orizzontalmente e verticalmente. Voglio avere un'intestazione in cima in modo che quando si scorre in orizzontale scorre in orizzontale con esso, ma non scorre verticalmente. Voglio anche lo stesso tipo di cose sul lato sinistro, dove scorre verticalmente con la collectionview ma non orizzontalmente. Sta implementando questo con punti di vista supplementari l'approccio giusto?

La funzionalità finale che sto cercando è simile a quella dell'app per fogli di calcolo di Numbers su iOS.

Grazie in anticipo per il vostro aiuto!

risposta

19

Aggiornamento per iOS9:

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

passarlo insieme.

+0

Veloce e semplice. Questa è un'opzione ancora migliore di dover scegliere tra raggruppati/semplici in UITableView. Grazie, signore. – NSGangster

+0

Sei fantastico! Eccezionale! – deepax11

9

MODIFICA: come indicato nei commenti, questa risposta è valida, ma non per più sezioni. Vedere questo blog per una soluzione migliore: http://blog.radi.ws/post/32905838158/sticky-headers-for-uicollectionview-using#notes


è necessario specificare che il comportamento nel layout:

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

Quindi impostare l'origine x del frame su "self.collectionView.contentOffset.x" lo farà in modo che rimanga attaccato al lato del frame della vista? Grazie mille per la risposta! –

+0

In questo caso, è corretto per l'asse x. Per il tuo scenario, dovresti duplicare con una seconda intestazione che segue l'asse y. –

+0

Questo è un hack malconcio che funziona solo per le viste di raccolta con intestazioni solo per la prima sezione. –

Problemi correlati