2012-07-04 13 views
15

Questa domanda è molto semplice. Qual è la differenza di prestazioni tra la rimozione di un UIView dalla gerarchia di visualizzazione e il nascondere un UIView?Prestazioni di UIView: removeFromSuperview VS nascondi

Ho letto che le viste che non sono necessarie dovrebbero essere rimosse dalla gerarchia della vista. Attualmente ho la situazione che a volte dovrebbe essere visibile un UIButton. Quando nascondo lo UIButton e quando lo rimuovo dalla sua superview?

È costoso modificare la gerarchia della vista?

risposta

1

Se è necessario alternare tra mostrare e nascondere la sottoview, l'approccio migliore è sicuramente nascosto. Per un UIButton le implicazioni della memoria non sono comunque così grandiose. E il codice è sicuramente più semplice se si passa semplicemente alla proprietà hidden.

Inoltre, si ottiene il vantaggio aggiuntivo che la proprietà hidden è animabile!

+0

Quindi qual è la differenza tra il rendering di un UIView nascosto e il fatto di non avere quella vista nella gerarchia della vista? C'è una differenza? – bas

+0

Sì. Nel caso in cui sia stato rimosso, lo stai ricreando da zero. Questo potrebbe essere utile per la gestione della memoria, ma potrebbe essere negativo per le prestazioni e meno interessante in quanto non è possibile animare la modifica. – Mundi

+0

Bene se si mantiene un riferimento alla vista non è necessario ricreare. Ero interessato al sovraccarico di alterare la gerarchia della vista. Cosa provoca questa alterazione. Immagino che in sostanza altera una struttura ad albero che UIKit sta gestendo come una rappresentazione della gerarchia della vista. Pensi che sia accurato? – bas

7

Ho fatto un esperimento su iOS6 iPad mini, con una grande vista a scorrimento che ha un sacco di contenuti ricchi (incluse immagini, ombre esterne, livelli sfumati, immagini di sfondo con motivi, sapete, quei designer :)) e Ho trovato che view.hidden = SÌ ≠ [visualizza removeFromSuperview].

Originariamente pensavo che l'impostazione nascosta a SÌ rendesse la vista non renderizzata/disegnata, quindi avere molte viste nascoste non avrebbe alcun impatto sull'efficienza. Ma il risultato attuale è: 1) se imposto le viste fuori schermo nella vista a scorrimento grande a quelle nascoste (e le visualizzano quando tornano nell'area visibile), lo scorrimento non è affatto uniforme/continuo. Quando è in decelerazione naturale sembra molto nervoso. 2) se rimuovo le viste fuori schermo dalla vista di scorrimento (ma mantengo ancora in memoria un array di tracciamento, così quando tornano possono essere aggiunte immediatamente), lo scorrimento è ovviamente più scorrevole.

+2

Che in realtà per me ribadisce il fatto che l'impostazione di un UIView su "nascosto" lo salva dal rendering e probabilmente aumenta le prestazioni in qualche modo. Certo, il nervosismo deriva dal renderlo "non visibile" che probabilmente forza un setNeedsDisplay insieme a un setNeedsLayout (non sono sicuro di quest'ultimo), il che contribuirebbe al rallentamento. Per una vista tabella è probabilmente una cattiva idea, ma per una vista molto più ampia di "dietro" altre viste, potrebbe essere una buona idea nasconderlo in modo che non inneschi un ridisegno inutilmente quando non è necessario. – strange