2012-09-30 19 views
19

Ho notato che quando si chiama in un setLayout:animatedUICollectionView per passare tra due layout, la cella attualmente visibile non aderisce alla zIndex è attributi di layout è stato impostato in layoutAttributesForItemAtIndexPath:.UICollectionView setLayout: animato: non conservare zIndex

Ad esempio, se dovesse avere un UICollectionView con UICollectionViewFlowLayout, impostare è minimumLineSpacing di un numero negativo in modo che le cellule si sovrappongono e quindi impostare un zIndex su ogni cella superiore a quella della cella precedente, quindi sembra come se la le celle sono impilate dal basso verso l'alto.

Tuttavia, ciò si interrompe se si imposta il layout su un altro layout, quindi si torna al layout originale. È come se la cella attualmente visibile non ascolti lo zIndex e sia posizionata sopra le altre celle. Se faccio scorrere la cella fuori dallo schermo, di nuovo su di esso è nella posizione corretta.

risposta

1

impostare lo z-index in Prova:

- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath; 
- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath; 
+0

Grazie per la risposta, anche se non ho avuto fortuna con la soluzione. Penso che il problema è che UICollectionView fa qualcosa con lo zIndex della cella selezionata. Potrei sbagliarmi ma cambiare il layout potrebbe non chiamare il '' initialLayoutAttributesForAppearingItemAtIndex'' se la cella è già visibile e rimane visibile durante la modifica del layout. – sampage

+0

Ho appena elaborato un rapido esempio di questo ed è stato in grado di riprodurre i problemi con Z-Index. Ho capito che 'initialLayoutAttributesForAppearingItemAtIndex' è stato chiamato per ogni elemento sullo schermo dopo l'invalidazione (modifica dei limiti animati, blocco di aggiornamento batch), ma dopo aver riletto i documenti, è per gli elementi che necessitano di animazione. Fortunatamente, sono riuscito a ottenere risultati consistenti cambiando layout impostando lo z-index in 'layoutAttributesForElementsInRect:' invece di 'layoutAttributesForItemAtIndexPath:' –

+0

@sampage puoi dirmi di più sullo z-index delle celle selezionate? Non riesco a trovare nessuna prova di ciò che stai dicendo, ma noto alcune incongruenze nelle mie animazioni ... Grazie! –

10

ho avuto lo stesso problema. La modifica del layout ignorerà zIndex per la cella.

sono riuscito a farlo "look giusto" applicando una traduzione sul asse z come questo:

attributes.transform3D = CATransform3DMakeTranslation(0, 0, indexPath.row); 

ma è solo una correzione visiva, se si tenta di fare clic sulla voce realizzeremo che zIndex è ancora sbagliato finché non viene riciclato scorrendolo fuori dallo schermo.

+0

Se la tua risposta non è una soluzione reale, ti suggerisco di postarla come commento. –

+0

Mi dispiace, non ho familiarità con l'etichetta Stack Overflow. Non sono sicuro di come pubblicare un commento, tutto quello che posso trovare è 'Aggiungi un'altra risposta'. – TheoB

+0

Hai assolutamente ragione: [aggiungendo un commento] (http://stackoverflow.com/privileges/comment) richiede 50 punti reputazione. Non volevo spingerti. Collaborare è il benvenuto. Il mio commento è un invito a collaborare nel modo SO. :) –

8

Sono riuscito a ottenere il comportamento che sto cercando utilizzando una combinazione di grimfrog e le risposte di Charlie Elliott.

La soluzione di Charlie Elliott ha ottenuto il risultato finale corretto per gli elementi nella vista raccolta, ma durante l'animazione si verificava ancora un problema con lo zIndex.

La soluzione di grimfrog ha fornito l'aspetto corretto ma il problema dello zIndex non è ancora corretto dopo il cambio di layout, nonostante l'aspetto corretto.

La combinazione dei due, pur non essendo una grande soluzione, funziona e fa uso della supportati trasformare e proprietà ZIndex dei UICollectionViewLayoutAttributes

Nel mio layout, ho

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSArray *attributes = [super layoutAttributesForElementsInRect:rect]; 

    [attributes enumerateObjectsUsingBlock:^(UICollectionViewLayoutAttributes *attributes, NSUInteger idx, BOOL *stop) { 
    attributes.zIndex = attributes.indexPath.item + 1; 
    }]; 

    return attributes; 
} 

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewLayoutAttributes *attributes = [super layoutAttributesForItemAtIndexPath:indexPath]; 

    attributes.transform3D = CATransform3DMakeTranslation(0, 0, attributes.indexPath.item); 
    return attributes; 
} 

ho vinto' Rendo questa come la risposta corretta, ma sono sicuro che ci deve essere un altro modo per risolvere questo problema, ma sono interessato a vedere se questo risolve il problema anche per gli altri.

+0

Questo funziona per me, ma non sono sicuro del motivo per cui transform3D deve essere impostato in layoutAttributesForItemAtIndexPath. Non funziona se è impostato solo in layoutAttributesForElementsInRect. – honcheng

3

Questo anche io. Dopo diversi test mi sono reso conto che lo UICollectionView forzerà le celle selezionate a trovarsi in cima, indipendentemente dallo z-index.

0

Utilizzando @sampage & risposte @grimfrog come punto di partenza, sono stato in grado di ottenere una situazione simile a lavorare

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)path 
{ 
    UICollectionViewLayoutAttributes* attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:path]; 
    attributes.zIndex = path.item; 
    attributes.transform3D = CATransform3DMakeTranslation(0, 0, path.item); 
    // other attribute settings 
    return attributes; 
} 

miei layoutAttributesForElementsInRect: chiamate layoutAttributesForItemAtIndexPath: quando si genera la matrice di attributi - quindi ho solo bisogno di includere lo zIndex e trasforma3D lì.

6

Prova:

// In UICollectionViewCell subclass 
- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes 
{ 
    [super applyLayoutAttributes:layoutAttributes]; 
    // Setting zPosition instead of relaying on 
    // UICollectionView zIndex management 'fixes' the issue 
    self.layer.zPosition = layoutAttributes.zIndex; 
} 
+0

Funziona a meraviglia, grazie. –

0

ho ottenuto un'altra soluzione. Poiché tutte le celle appartengono alla stessa superview, chiamando bringSubviewToFront : quando la visualizzazione delle celle funziona. Specificamente, esaminando la gerarchia di vista di debug, sebbene UICollectionViewLayout non restituisca le celle in base a zIndex, mostra comunque le celle in base all'ordine inverso in cui ciascuna sottoview viene aggiunta alla sua super vista.

Problemi correlati