2012-09-29 14 views
12

Ho una sottoclasse di UICollectionViewLayout che colloca le celle in una circonferenza. Il layout restituisce YES per la chiamata shouldInvalidateLayoutForBoundsChange:. Su la rotazione, la cella nella posizione iniziale svanisce e la cella nella posizione finale svanisce in.Qual è il miglior modo migliore per disabilitare le dissolvenze incrociate su UICollectionView/UICollectionViewLayout?

Aggiungendo il seguente codice per il mio layout posso disattivato le dissolvenze e il cerchio di elementi sembra semplicemente ruotare con il cambiamento dell'orientamento:

- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath { 
    return nil; 
} 

- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath { 
    return [self layoutAttributesForItemAtIndexPath:itemIndexPath]; 
} 

perché i metodi vengono chiamati su un cambiamento limiti, perché la documentazione non lo fa sembra suggerire che fanno? La documentazione sembra indicare che vengono chiamati correlati all'inserimento e alla rimozione di elementi dalla vista di raccolta.

C'è un modo migliore per disattivare la dissolvenza incrociata durante la rotazione?

Note:

  • Il initialLayoutAttributesForAppearingItemAtIndexPath: documentazione stati che di default il metodo restituisce nil ma chiama a super restituito valori non zero.
  • ho impostare le interruzioni simbolici punti sui metodi UICollectionView deleteItemsAtIndexPaths:, moveItemAtIndexPath:toIndexPath: e insertItemsAtIndexPaths: e nessuno di loro sono colpiti durante la rotazione.
+0

Questo è solo un salto nel buio, ma per la disabilitazione dell'animazione di rotazione, si potrebbe spegnere l'animazione di base del tutto per l'operazione di rotazione: [CATransaction iniziano]; [CATransaction setValue: (id) kCFBooleanFalse forKey: kCATransactionDisableActions]; // fai la tua rotazione [commit di CATransaction]; – maz

+0

Forse, internamente su un limite, gli elementi vengono rimossi e aggiunti e di conseguenza vengono richiamati i metodi. Per quanto riguarda il perché -deleteItemsAtIndexPaths: and -insertItemsAtIndexPaths: non essere chiamato .. nessun indizio qui. Forse il programmatore UIKit ha imbrogliato ed evitato l'API per eseguire l'inserimento e l'eliminazione? Non senza precedenti. – maz

+1

Potrebbe disabilitare le animazioni implicite sulla strato di rinforzo della vista usando qualcosa come descrivo qui: http://stackoverflow.com/questions/2244147/disabling-implicit-animations-in-calayer-setneedsdisplayinrect/2244734#2244734? –

risposta

10

I UICollectionViewLayout.h stati di file

// This set of methods is called when the collection view undergoes an 
    animated transition such as a batch update block or an animated 
    bounds change. 
// For each element on screen before the invalidation, 
    finalLayoutAttributesForDisappearingXXX will be called and an 
    animation setup from what is on screen to those final attributes. 
// For each element on screen after the invalidation, 
    initialLayoutAttributesForAppearingXXX will be called an an 
    animation setup from those initial attributes to what ends up on 
    screen. 

che dice chiaramente che sono chiamati bounds modifiche. Piuttosto che rimuovere/inserire, "vecchio stato" e "nuovo stato" sembrano più accurati.

Problemi correlati