2009-08-29 2 views
87

Ho una visione utente che carica immagini abbastanza grandi in ogni cella e l'altezza della cella varia a seconda della dimensione dell'immagine. Le prestazioni di scorrimento sono decenti, ma a volte possono essere a scatti.Trucchi per migliorare le prestazioni di scorrimento di UITableView per iPhone?

ho trovato questi suggerimenti che ho trovato sul blog FieryRobot:

glassy-scrolling-with-uitableview

more-glassy-scrolling-with-uitableview

qualcuno ha qualche consiglio per migliorare lo scorrimento UITableView prestazioni?

+0

Se è necessario memorizzare nella cache le altezze delle celle (che possono essere costose da calcolare e vengono anche utilizzate di frequente), ho fornito un esempio. Usalo solo se è adatto alla tua applicazione. http://stackoverflow.com/questions/1371223/how-do-i-cache-something-for-aperview/10992748#10992748 –

risposta

151
  1. Cache l'altezza delle righe (la vista tabella può richiedere questo spesso)
  2. creare una cache meno utilizzato di recente per le immagini utilizzati nella tabella (e invalidare tutte le voci inattive quando si ricevere un avviso di memoria)
  3. disegnare tutto nel UITableViewCell 's drawRect: se possibile subviews evitare a tutti i costi (o se si richiede la funzionalità di accessibilità di serie, della visualizzazione dei contenuti drawRect:)
  4. Fai la tua UITableViewCell' s strato opaco (SA Mi va per la vista dei contenuti, se ne avete uno)
  5. utilizzare la funzionalità reusableCellIdentifier come raccomandato dal UITableView esempi/documentazione
  6. Evita gradienti/effetti grafici complessi che non sono precotto in UIImage s
+4

Inoltre, le immagini scaricate devono essere ridimensionate alla dimensione di imageView prima di essere visualizzate sulla cella! –

+3

Vorrei aggiungere a questa risposta una mia esperienza degli ultimi anni: avere celle trasparenti non è probabilmente mai la causa di cattive prestazioni di scorrimento. Abbiamo un'app con celle MOLTO complicate (oltre 20 subviews) ed è completamente trasparente per mostrare lo sfondo. Con le opportune ottimizzazioni, la trasparenza non fa alcuna differenza nemmeno su un 3GS. In realtà, la cosa che rallentava di più il carico era il caricamento del pennino prima che ci fossero abbastanza celle da rimpicciolire dalla vista tabella. Se si utilizzano le visualizzazioni secondarie, assicurarsi di disporre di gerarchie efficienti e non è necessario utilizzare drawRect. – Accatyyc

+0

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

40
  1. Se si sottoclasse UITableViewCell, non utilizzare un pennino, scrivere in codice invece. È molto più veloce di rispetto al caricamento dei file di pennini.
  2. Se stai usando le immagini, assicurarsi che si sta caching loro in modo da non necessario caricare da file più di una volta per ogni (se avete la memoria - Sareste sorpresi di come molte immagini spaziali occupano).
  3. Rende possibile il numero di elementi opaco come . Allo stesso modo, prova a non usare le immagini con trasparenza.
+0

Due voti negativi? Ooookay ... –

+3

non preoccuparti ... erano troll. Bella risposta! – Steav

+0

grazie per il suggerimento sulla memorizzazione delle immagini – pepsi

33

Lo sviluppatore di Tweetie ha scritto ampiamente su questo e ha un codice che dimostra come è stato fatto per quell'app. Fondamentalmente, lui/lei sostiene una vista personalizzata per cella di tabella, e disegnandola manualmente (piuttosto che sottoporre a revisione con Interface Builder, tra le altre opzioni).

fast-scrolling-in-tweetie-with-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 al cellView? Viene disegnato nel metodo drawRect? –

+1

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

+2

L'articolo originale può essere letto qui: http://web.archive.org/web/20100922230053/http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/ – jverdi

1

# 1 killer di prestazioni per UITableView scorrimento è il disegno ombre su qualsiasi livello di visualizzazione della cella, quindi se le prestazioni di scorrimento sono importanti, non creare ombre a meno che, in sostanza, non rallenti il ​​thread principale.

pensato che questo doveva essere detto poiché nessuna delle risposte accettate ha fatto menzione di ombre e strati. : +)

+3

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; –

0

Qualsiasi problema relativo alle prestazioni di scorrimento UITableView 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 il UITableView riutilizza le celle e il fatto che ogni cella abbia bisogno della propria immagine - insieme rende il bit della soluzione complesso. Da come viene risolto il problema generale, qui riepiloghiamo le cose che dovrebbero essere risolte:

  1. Caricare i dati nell'origine dati - da REST/database. Questo passaggio dovrebbe essere eseguito sullo sfondo, eventualmente utilizzando dispatch_async insieme alla coda GCD.
  2. creare e inizializzare pertinenti oggetti del modello dei dati che si infila un array
  3. [tableView reloaddata]
  4. All'interno cellForRowAtIndexPath, includono codice che imposterà dati (testo) da oggetto corretto modello di dati dell'array.
  5. Ora anche le immagini possono essere sotto forma di URL, quindi questo passaggio potrebbe essere poco eccentrico a causa del riutilizzo delle celle effettuato dalla visualizzazione tabella. Il nocciolo del fatto è caricare nuovamente un'immagine dalla cache/URL del dispositivo utilizzando la coda asincrona, quindi impostarla per correggere cell.image (qualunque sia la proprietà dell'immagine della cella).

Per evitare problemi, fare riferimento a questo tutorial su lazy loading of images nella vista tabella.