2011-02-06 18 views
21

Quando si utilizza UITableView, è possibile riutilizzarne le celle utilizzando i metodi [[ UITableViewCell alloc] initWithStyle: reuseIdentifier:] e [uiTableViewInstance dequeueReusableCellWithIdentifier:]. Ciò aiuta a mantenere la memoria sotto controllo per le tabelle enormi in quanto solo poche celle sono presenti nella vista in un determinato istante.Come riutilizzare/riciclare elementi personalizzati come fa uitableviewcell?

Voglio creare un UIScrollView che ha molte sotto-visualizzazioni. L'inserimento di tutte le sottoview richiede molta memoria e tempo iniziale che voglio evitare. L'API di Apple offre il modo di riutilizzare tali componenti personalizzati (un UIView o una sottoclasse di esso qui) proprio come le viste di cella usando un identificatore?

Creerò uno se non ci sono API, ma ho qualche dubbio in merito. Ad esempio, per ogni nuova sottoview, sto impostando la sua posizione frame, dopo le visualizzazioni precedenti. Come dovrei andare sull'aggiornamento della cornice per ogni sottoview durante il riciclaggio? Devo cancellare e ricaricare il contenuto di ogni sottomenu quando viene riciclato? Devo fare tutti questi calcoli in un altro thread per evitare lo scroll? In tutto, mi piacerebbe avere un'esperienza scorrevole come in UITableView con tutte le cose che riutilizzano.

Ecco un esempio di codice che ho scritto finora:

int numberOfPages = 0; 
int pageWidth = 100; 
int pageHeight = 100 

UIScrollView *myScrollView = //allocate and initialize a scrollview 
//set its size to 100 by 100 (width equal to pageWidth) 
//set paging enabled for myScrollView 

Aggiunta subviews ad esso da un metodo, che si chiama più volte

- (void) appendSubViewToScrollView { 
    UIView *view = //allocate and initialize a view and dump data in it. 

    CGRect rect = view.frame; 
    rect.size.height = pageHeight; 
    rect.size.width = pageWidth; 
    rect.origin = CGPointMake(pageHeight * numberOfPages, 0); 
    view.frame = rect; 

    [myScrollView addSubview:view]; 

    numberOfPages++; 

    [scrollView setContentSize:CGSizeMake(pageHeight * numberOfPages, pageWidth)]; 

    [view release]; 
} 

Edit:
Qualche intuizione nel modo in cui tableview e le sue celle ottengono questo dietro le quinte sarebbe utile.

risposta

19

Sì, è necessario ripristinare ogni contenuto di sottoview ogni volta, esattamente come nella vista tabella. Il vantaggio del riciclaggio delle visualizzazioni secondarie è il risparmio di memoria per l'archiviazione delle viste e il risparmio di tempo per l'allocazione delle viste, ma ovviamente la gestione dei dati dei contenuti dipende da voi.

Quindi l'approccio di riciclaggio standard richiede l'utilizzo di un numero di celle uguale al numero di visualizzazioni visibili contemporaneamente sullo schermo + il numero di celle aggiuntive che si possono ottenere quando si avvia lo scorrimento. Diciamo per esempio che stai mostrando 5 visioni complete alla volta (scroll view stable) e poi durante lo scroll avrai bisogno di una vista aggiuntiva che è parzialmente mostrata, quindi alla fine hai bisogno di 5 + 1 = 6 visualizzazioni. In teoria, si consiglia di utilizzare altre 2 visualizzazioni. Quindi è necessario scrivere due pool: uno chiamato "visibleViews" che è composto da tutte le viste aggiunte come subview allo scrollview e un altro chiamato "availableViews" che è composto da tutte le viste disponibili per il riutilizzo. Quindi si creano tutte queste viste e le si aggiunge alla vista di scorrimento (sì: è necessario regolare la cornice in base alla loro posizione nella vista a scorrimento e sì, è necessario impostare nuovamente il contenuto). Infine, è necessario tenere traccia del movimento della vista scorrevole impostando un delegato. Lo scopo di questo monitoraggio è calcolare quale delle viste visibili non è più visibile, quindi rimuoverla dal pool visibile e spostarsi nel pool utilizzabile. Inoltre il delegato deve capire quando una nuova cella sta per apparire ma non è ancora visibile, quindi ottenerla dal pool disponibile (o allocarla/inizializzarla se il pool è vuoto) e aggiungerla sia al pool visibile che come subview di la scrollview. Ovviamente se vuoi aumentare le prestazioni puoi posizionare più sottoview nella vista di scorrimento per evitare di spostare le celle esattamente quando iniziano a comparire sullo schermo, ecco perché ho consigliato di usare un paio di viste extra ai lati della pergamena vista.

C'è un grande video del WWDC 2010 (puoi accedervi se sei uno sviluppatore registrato) sull'utilizzo delle visualizzazioni di scorrimento in iOS: spiega questa tecnica.

Il codice di esempio PhotoScroller di Apple nella documentazione XCode fa essenzialmente ciò che è indicato nel video WWDC e spiega questa tecnica.

+0

Grazie per la risposta Viggio. C'è qualche codice relativo a questo? Potrei usare qualche riferimento. E sì, sono uno sviluppatore registrato. Puoi indicare il video pertinente per questo caso? ("Quadro delle applicazioni"? Vedrò il resto a piacimento). Scaricherò anche il codice di esempio. Sembra interessante e utile. – Sailesh

+0

Si prega di contrassegnare questa risposta come accettato con il segno di spunta (sotto le frecce di voto su/giù.) – JoePasq

+1

Purtroppo non ricordo quale sia il video che spiega questa tecnica, ma ricordo che è stato spiegato con una demo. C'è un video chiamato "Progettare le app con Scroll Views", ma non sono sicuro che sia il video giusto, comunque vale la pena guardarlo in ogni caso (spiega alcune belle tecniche). la home page dei video del WWDC inizia qui: http://developer.apple.com/videos/wwdc/2010/ da dove si effettua l'accesso con il proprio account sviluppatore, quindi sarà possibile aprire iTunes e scaricare o solo visualizzare i video. Quello a cui mi riferisco è il 104 ("Designing Apps with Scroll Views"). – viggio24

Problemi correlati