Trucchi per migliorare le prestazioni di scorrimento di iPhone UITableView?


89

Ho un uitableview che carica immagini abbastanza grandi in ogni cella e le altezze delle celle variano a seconda delle dimensioni dell'immagine. Le prestazioni di scorrimento sono decenti, ma a volte possono essere a scatti.

Ho trovato questi suggerimenti che ho trovato sul blog di FieryRobot:

vetroso-scrolling-with-uitableview

scorrimento più vetroso con uitableview

Qualcuno ha qualche suggerimento per migliorare le prestazioni di scorrimento di uitableview?


Se è necessario memorizzare nella cache le altezze delle celle (che possono essere costose da calcolare e sono anche usate frequentemente), ho fornito un esempio. Usalo solo se è adatto alla tua applicazione. stackoverflow.com/questions/1371223/…
Paul de Lange

Risposte:


156
  1. Memorizza nella cache l'altezza delle righe (la vista tabella può richiederlo frequentemente)
  2. Crea una cache utilizzata meno di recente per le immagini utilizzate nella tabella (e annulla tutte le voci inattive quando ricevi un avviso di memoria)
  3. Disegna tutto nella UITableViewCell's, drawRect:se possibile, evita a tutti i costi le sottoview (o se richiedi la funzionalità di accessibilità standard, la visualizzazione del contenuto drawRect:)
  4. Rendi il tuo UITableViewCelllivello opaco (lo stesso vale per la visualizzazione del contenuto se ne hai uno)
  5. Utilizzare la funzionalità reusableCellIdentifier come consigliato dagli UITableViewesempi / documentazione
  6. Evita sfumature / effetti grafici complicati che non sono preconfezionati in UIImages

5
Inoltre, le immagini scaricate dovrebbero essere ridimensionate alla dimensione di imageView prima di essere visualizzate sulla cella!
Zoltán Matók

4
Vorrei aggiungere a questa risposta una delle mie esperienze degli ultimi anni: avere celle trasparenti probabilmente non è mai la causa di cattive prestazioni di scorrimento. Abbiamo un'app con celle MOLTO complicate (20+ sottoview) ed è tutto trasparente per mostrare lo sfondo. Con le opportune ottimizzazioni la trasparenza non fa differenza nemmeno su un 3GS. In realtà la cosa che ha rallentato di più le cose è stato il caricamento del pennino prima che ci fossero abbastanza celle da rimuovere dalla coda dalla vista tabella. Se si utilizzano le visualizzazioni secondarie, assicurarsi di avere gerarchie efficienti e non è necessario utilizzare drawRect.
Accatyyc

@Accatyyc, sembra che io abbia lo stesso problema. C'è un piccolo ritardo quando non ci sono abbastanza celle da rimuovere dalla coda, quando 3-4 celle vengono rimosse dalla coda, lo scorrimento è fluido. Esiste un modo per precaricare le celle in modo che siano presenti celle da rimuovere dalla coda e non caricare i file NIB durante lo scorrimento?
Tiois

@Tiois Sure there is. È necessario utilizzare il vecchio metodo di rimozione dell'accodamento delle celle (non registrare classi / pennini, ma crearli se dequeueCellWithIdentifier: restituisce nil). In questo modo puoi creare un insieme di celle prima ancora che esista la visualizzazione tabella, ad esempio creandone 20 prima. Quindi, invece di crearne di nuovi in ​​cellForRowAtIndexPath :, li estrai prima dalla tua cache, finché non è vuoto.
Accatyyc

Sto usando UICollectionView e sto affrontando lo stesso problema. Nel mio file pennino cella personalizzato. Sto usando diverse viste secondarie tra cui UIwebView e UIImageView all'interno di UIstackView verticale. quando scorro il mio elenco, le celle riutilizzate impiegano molto tempo per riadattare le loro dimensioni e lo scorrimento sembra molto a scatti.
Mansuu ...

40
  1. Se stai creando una sottoclasse UITableViewCell, non usare un pennino, ma scrivilo nel codice. È molto più veloce del caricamento dei file pennino.
  2. Se stai usando immagini, assicurati di memorizzarle nella cache in modo da non dover caricare dal file più di una volta per ciascuna (se hai la memoria, rimarrai sorpreso di quanto spazio occupano le immagini).
  3. Rendi il maggior numero di elementi opachi possibile. Allo stesso modo, non cercare di utilizzare le immagini con trasparenza.

3
non preoccuparti ... quelli erano troll. Bella risposta!
Steav

79
I voti negativi erano probabilmente perché "evitare i pennini" è un cattivo consiglio per migliorare le prestazioni. Se stai riutilizzando le celle, le celle non vengono ricostruite dai pennini durante lo scorrimento.
Steven Fisher

6
I pennini sono equivalenti in velocità, o un po 'più veloci in base alla ricerca Cocoa with Love. cocoawithlove.com/2010/03/…
MaxGabriel

@Steven Fisher che usa Pennino può essere più lento quando la tabella assegna e dealloca celle, ad esempio, durante lo scorrimento veloce.
Sound Blaster

3
L'utilizzo dei NIB può essere più lento durante la costruzione della cella . Se stai usando il riciclo delle celle, ci sono solo abbastanza celle allocate per riempire lo schermo; diciamo, forse 10 al massimo. Durante lo scorrimento, le celle non vengono create. Sono solo riutilizzati , non deallocati e riallocati. E, naturalmente, non ci sono costi per il dealloc. Quindi no, questo non è corretto.
Steven Fisher

34

Lo sviluppatore dietro Tweetie ha scritto molto su questo e ha del codice che dimostra come è stato fatto per quell'app. Fondamentalmente, lui / lei sostiene una visualizzazione personalizzata per cella di tabella e disegnandola manualmente (piuttosto che sottovisione con Interface Builder, tra le altre opzioni).

scorrimento veloce in tweetie con uitableview

Inoltre, Apple ha aggiornato il proprio codice di esempio per TableView nei suoi tutorial TableViewSuite (forse in risposta a questo?)

TableViewSuite


1
Questa è una soluzione fantastica. Sono solo curioso di sapere come aggiungerei un UIButton in cellView? Viene disegnato nel metodo drawRect?
Sukitha Udugamasooriya

1
@beno, il tuo link sembra rotto (il primo) qualche possibilità di mettere le mani sull'articolo originale?
apouche

3
L'articolo originale può essere letto qui: web.archive.org/web/20100922230053/http://blog.atebits.com/2008/…
jverdi

aggiunto collegamento all'archivio web in quanto la versione originale non esiste
Ralph Willgoss

1

Il killer delle prestazioni numero 1 per lo scorrimento UITableView sta disegnando ombre su qualsiasi livello di visualizzazione delle celle, quindi se le prestazioni di scorrimento sono importanti, non eseguire ombre a meno che fondamentalmente non rallenti il ​​thread principale.

ho pensato che questo dovesse essere detto poiché nessuna delle risposte accettate menzionava ombre e strati. : +)


6
se i problemi sono le ombre aggiungi queste due righe di codice e tutto funziona perfettamente self.layer.shouldRasterize = YES; self.layer.rasterizationScale = UIScreen.mainScreen.scale;
Pedro Romão

0

Qualsiasi problema con le UITableViewprestazioni di scorrimento può essere risolto utilizzando tecniche già descritte in altre risposte. Tuttavia, molte volte le prestazioni lente sono causate da qualcosa di intrinsecamente errato o ripetitivo.

Il fatto che UITableViewriutilizzi le celle e il fatto che ogni cella possa aver bisogno della propria immagine, insieme rendono la soluzione un po 'complessa. Da come viene risolto in modo generale, qui riassumo le cose che dovrebbero essere prese in considerazione:

  1. Carica i dati nell'origine dati - da REST / database. Questo passaggio dovrebbe essere eseguito in background, eventualmente utilizzando dispatch_async insieme alla coda GCD.
  2. Creare e inizializzare gli oggetti del modello di dati rilevanti e inserirli in un array
  3. [tableView reloaddata]
  4. All'interno cellForRowAtIndexPath, includere il codice che imposterà i dati (testo) dall'oggetto del modello di dati corretto dell'array.
  5. Ora le immagini potrebbero anche essere sotto forma di URL, quindi questo passaggio potrebbe essere un po 'bizzarro a causa del riutilizzo delle celle eseguito dalla visualizzazione tabella. Il cuore del fatto è caricare ancora una volta l'immagine dalla cache / URL del dispositivo utilizzando la coda asincrona, quindi impostarla per correggere cell.image (qualunque sia la proprietà dell'immagine della tua cella).

Per evitare problemi, fare riferimento a questo tutorial sul caricamento lento delle immagini nella vista tabella.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.