2012-11-30 19 views
6

Ho ereditato un progetto troppo complicato (quindi non conosco tutti i meccanismi interni) e sto correndo un bug. Alcune parti della mia app hanno alcune lunghe animazioni fatte con CATransaction, e sembra che causi ripetutamente il richiamo delle immagini di layout quando le animazioni sono attive. Questo non accade su iOS5 e tutto sembra corretto, ma su iOS6 viene chiamato senza sosta e interferisce con gran parte del layout della vista. La traccia dello stack è tutto nascosta/disattivata, ma sembra iniziare con CA::Transaction::commit()layoutSubviews richiamati ripetutamente su ios6 dopo CATransaction

Qualcosa con CATransaction è cambiato tra le versioni di ios per causare qualcosa di simile?

+1

stai animando uniview con autoresizesSubviews impostato su true? – mxb

+0

sta utilizzando l'autolayout? Questo è stato introdotto in iOS6. Se fai determinate cose che chiamano il layout, o fai le cose nel posto sbagliato, otterrai un loop o ottieni un relayout molto più spesso del necessario. Per prima cosa devi cercare spurie setNeedsLayout o chiamate di layout. – uchuugaka

+0

Hai controllato questa domanda? http://stackoverflow.com/questions/728372/when-is-layoutsubviews-called – arturdev

risposta

0

Sembra un problema di Autolayout. La vista o una qualsiasi delle sue sottoview utilizza Autolayout? L'autolayout è bello ma non sembra molto veloce ed efficiente, quindi potrebbe causare problemi durante l'animazione.

Ovviamente può essere necessario che le sottoview siano disposte in ciascun passaggio dell'animazione se la dimensione della vista della vista cambia in modo tale da influire sul posizionamento o sulla dimensione della visualizzazione secondaria. Considera l'animazione e quali effetti ha.

1

vedi questo post: UIView/CALayer: Transform triggers layoutSubviews in superview

Apple mi ha risposto via STI:

Perché vedo questo comportamento? è questa incoerenza o sto fraintendendo alcuni concetti chiave?

Una vista verrà contrassegnata per il layout ogni volta che il sistema avverte che qualcosa è cambiato che richiede la vista per ricalcolare i fotogrammi delle sue sottoview. Ciò può verificarsi più spesso di quanto ci si aspetterebbe e esattamente quando il sistema sceglie di contrassegnare una vista in quanto richiede che il layout sia un dettaglio di implementazione.

perché fa a cascata verso l'alto la gerarchia della vista?

In generale, modificare una proprietà geometrica di una vista (o strato) attiverà una cascata di layout di invalidazione della gerarchia vista, perché viste padre possono avere vincoli di layout automatico che coinvolgono il bambino modificata. Si noti che il layout automatico è attivo in qualche modo indipendentemente dal fatto che sia stato abilitato esplicitamente.

Come posso evitare di visualizzare superview per layoutView ogni volta che cambio la trasformazione?

Non esiste alcun modo per aggirare questo comportamento. Fa parte della contabilità interna di UIKit necessaria per mantenere coerente la gerarchia della vista.

+0

Ho già visto questo post, ma non capisco come aggirare questo problema. Nel mio caso ho un controllo personalizzato in cui l'albero della vista è A-> B Sto animando il B.layer e ho bisogno di impostare il frame della B nel layoutSubviews di A.Ma layoutSubviews di A è chiamato quando anima Blayer –

Problemi correlati