heightForRowAtIndexPath essere chiamato per tutte le righe e quante righe in un UITableView prima di problemi di prestazioni?

StackOverflow https://stackoverflow.com/questions/5324205

Domanda

Ho pensato che avevo letto che per un UITableView che heightForRowAtIndexPath non viene invitato tutte le righe, ma solo su quelli che saranno visibili. Questo non è quello che sto vedendo però. Sto vedendo centinaia di chiamate al heightForRowAtIndexPath per la semplice situazione dell'orientamento essere cambiato di iPhone, per esempio.

Così sto supponendo qui, pertanto, che per un UITableView con heightForRowAtIndexPath implementato, lo fa (cioè heightForRowAtIndexPath) ottenere chiamato per tutte le righe (non solo quelle visibili) ... fatemi sapere se questo non è del tutto corretto.

DOMANDA:? Dato quanto sopra, il numero di righe in un UITableView (dove è implementata heightForRowAtIndexPath) si può avere prima di problemi di prestazioni si verificano in genere

C'è un modo per aggirare i problemi di prestazioni? cioè impostare un'altezza nominale / standard per ogni riga e non attuare heightForRowAtIndexPath, ma quindi impostare correttamente ogni altezza di righe solo quando è visualizzato e impostare correttamente qui ... ma quale metodo si potrebbe fare questo?

È stato utile?

Soluzione

Date un'occhiata alla sezione di discussione nel documentazione tableView:heightForRowAtIndexPath:

Il metodo consente il delegato di specificare le righe con altezze variabili. Se questo metodo viene attuato, il valore restituito sostituisce il valore specificato per la proprietà rowHeight UITableView per la riga determinato.

Non ci sono implicazioni di prestazioni di utilizzare tableView: heightForRowAtIndexPath: invece della proprietà rowHeight . Ogni volta che viene visualizzata una vista tabella, chiama tableView: heightForRowAtIndexPath:. Sulla delegato per ciascuna delle righe, che può risultare in un significativo problema di prestazioni con viste tabella avente un gran numero di righe (circa 1000 o più)

Per questo si deve utilizzare la proprietà rowHeight del UITableView. Se avete bisogno di diverse altezze che si sono fuori di fortuna perché è necessario utilizzare tableView:heightForRowAtIndexPath:.

Per quanto ne sappia non esiste alcun modo per modificare l'altezza delle righe al display.
Il Tableview deve conoscere la dimensione corretta prima, otherewise ci sarebbero cambiamenti di posizione brutto per tutto il tempo.

Altri suggerimenti

Credo di avere trovato una soluzione a questo.

In iOS 7 Apple ha introdotto alcune nuove proprietà Tableview. Uno di loro è la:

tableView:estimatedHeightForRowAtIndexPath:

Quindi, se si fornisce un altezza di riga stimato, per esempio, poi quando tableView: heightForRowAtIndexPath: viene chiamato più volte prima della visualizzazione della tabella, viene chiamato solo per le celle visibili della tabella; per le cellule rimanenti, viene utilizzata l'altezza stimata.

Questa è la fonte di queste informazioni: https://books.google.gr/books?id=wLaVBQAAQBAJ&pg= PT521 & LPG = PT521 & dq = heightforrowatindexpath + solo + per + le cellule e fonte + visibili + = bl & ots = 7tuwaMT5zV & sig = h3q8AaFvoCgcrPu2fQchVkIEjwg & hl = it & sa = X & ved = 0CEMQ6AEwBWoVChMInLK0xbPuxwIVCbUaCh3_nQWG # v = onepage & q = heightforrowatindexpath% 20only% 20for% 20the% 20visible% 20cells & f = false

Mio Dio, ho trascorso più di un'ora cercando di trovare la fonte del mio problema di prestazioni!

Finalmente ho trovato anche centinaia di chiamate a heightForRowAtIndexPath e una ricerca mi ha fatto questo thread. Questo è davvero fastidioso. Prestazioni scende già qui quando appena la visualizzazione di 250 articoli. Per fortuna le cellule voglio visualizzare ora tutti hanno la stessa dimensione. Ma potevo immaginare qualcuno che vuole visualizzare alcune cellule diverse per un tableView con> 200 oggetti!

FIX questa mela!

Saluti

Un modo per migliorare le prestazioni in tableViews con un grande numero di righe e l'altezza delle celle dinamiche è nella cache l'altezza delle celle, una volta che vengono prima calcolati.

Un approccio semplicistico per raggiungere questo obiettivo è quello di mantenere un NSMutableDictionary in cui la chiave è l'id del record nella cella (o qualsiasi altro mezzo identificativo si potrebbe avere), e il valore è un NSNumber con l'altezza della riga. Una volta che l'altezza viene prima calcolato, memorizzarlo il NSMutableDictionary dal record id. Nel tableView:heightForRowAtIndexPath e tableView:estimatedHeightForRowAtIndexPath: si controlla per un'altezza cache nel dizionario e restituirlo se trovato. Se non trovato, calcolare l'altezza, e memorizzare nella cache prima di tornare l'altezza.

Potrebbe essere necessario stare attenti con invalidare la cache per le righe che le altezze di cambiamento. Ad esempio, se si dispone di un pulsante di espansione in una delle vostre cellule, è necessario rimuovere l'altezza di quella cella dalla cache una volta il pulsante di espansione è sfruttato metodo delegato per l'altezza si chiama.

Si potrebbe ancora avere un calo di prestazioni, se si tenta di visualizzare 1000 delle cellule in una sola volta, quando mostra la tabella, in quanto è probabile che chiamare il metodo di altezza per ogni riga. Un lavoro in giro per che è quello di scaldare prima la cache, se possibile, in un compito di fondo, prima del primo visualizzazione delle cellule.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top