2011-02-06 13 views
21

Al usar UITableView, podemos reutilizar sus celdas usando los métodos [[ UITableViewCell alloc] initWithStyle: reuseIdentifier:] y [uiTableViewInstance dequeueReusableCellWithIdentifier:]. Esto ayuda a mantener la memoria bajo control en mesas enormes, ya que solo hay unas pocas celdas en la vista en un instante dado.¿Cómo reutilizar/reciclar elementos personalizados como lo hace uitableviewcell?

Quiero crear un UIScrollView que tenga muchas subvistas. Insertar todas las subvistas toma mucha memoria y tiempo inicial que quiero evitar. ¿Apple API proporciona formas de reutilizar tales componentes personalizados (una UIView o una subclase de ella aquí) al igual que las vistas de celda con un identificador?

Crearé uno si no hay API, pero tengo algunas dudas con respecto a esto. Por ejemplo, para cada nueva subvista, estoy configurando su posición de marco, después de las vistas previas. ¿Cómo debo actualizar el marco para cada subvista mientras reciclo? ¿Debo eliminar y volver a cargar el contenido de cada subvista a medida que se recicla? ¿Debo hacer todos estos cálculos en otro hilo para evitar el desplazamiento irregular? En general, me gustaría tener una experiencia de desplazamiento suave como en UITableView con todas las cosas de reutilización.

Este es un ejemplo de código que he escrito hasta ahora:

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 

Adición subvistas a ella desde un método, que se llama varias veces

- (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]; 
} 

Editar:
Algunos visión en cómo TableView y sus células logran esto detrás de las escenas sería útil.

Respuesta

19

Sí, debe restaurar cada contenido de subvista cada vez, exactamente como en la vista de tabla. La ventaja de reciclar subvistas es el ahorro de memoria para ver el almacenamiento y el ahorro de tiempo para la asignación de vistas, pero, por supuesto, la gestión de datos de contenido depende de usted.

Por lo tanto, el método de reciclado estándar requiere que use un número de celdas que es igual al número de vistas visibles al mismo tiempo en la pantalla + la cantidad de celdas adicionales que puede obtener al comenzar a desplazarse. Digamos, por ejemplo, que está mostrando 5 vistas completas a la vez (la vista de desplazamiento es estable) y luego mientras se desplaza necesitará una vista adicional que se muestra parcialmente, por lo que al final necesita 5 + 1 = 6 vistas. Esto es en teoría, se recomienda usar 2 vistas más. Por lo tanto, debe escribir dos conjuntos: uno llamado "visibleViews" que se compone de todas las vistas agregadas como subvistas a la vista de desplazamiento, y otro llamado "availableViews" que está compuesto de todas las vistas disponibles para su reutilización. Luego crea todas estas vistas y las agrega a la vista de desplazamiento (sí: necesita ajustar su marco de acuerdo con su posición en la vista de desplazamiento, y sí, necesita configurar el contenido de nuevo). Finalmente, necesita seguir el movimiento de la vista de desplazamiento configurando un delegado. El objetivo de este seguimiento es calcular cuál de las vistas visibles no es más visible, luego eliminarla del grupo visible y pasar al grupo utilizable. Además, el delegado debe comprender cuándo va a aparecer una nueva celda pero aún no está visible, y luego obtenerla del grupo disponible (o alloc/init it si el grupo está vacío) y agregar tanto al grupo visible como a la subvista de la vista de desplazamiento Por supuesto, si desea aumentar el rendimiento, puede colocar más subvistas en la vista de desplazamiento para evitar mover las celdas exactamente cuando comienzan a aparecer en la pantalla, es por eso que recomendó usar un par de vistas adicionales a los lados del desplazamiento ver.

Hay un gran video de WWDC 2010 (puede acceder si es un desarrollador registrado) sobre el uso de las vistas de desplazamiento en iOS: explica esta técnica.

El código de ejemplo PhotoScroller de Apple en la documentación de XCode hace básicamente lo que se indica en el video de WWDC y explica esta técnica.

+0

Gracias por la respuesta Viggio. ¿Hay algún código relacionado con esto? Podría usar alguna referencia. Y sí, soy un desarrollador registrado. ¿Puedes señalar el video relevante para este caso? ("Frameworks de aplicaciones"? Voy a ver el resto en el ocio). También descargaré el código de muestra. Parece interesante y útil. – Sailesh

+0

Marque esta respuesta como aceptada con la marca de verificación (debajo de las flechas de voto arriba/abajo). – JoePasq

+1

Lamentablemente, no recuerdo cuál es el video que explica esta técnica, pero recuerdo que se explicó con una demostración. Hay un video llamado "Diseño de aplicaciones con vistas de desplazamiento", pero no estoy seguro de si es el video correcto, de todos modos vale la pena mirarlo en cualquier caso (explica algunas técnicas hermosas). la página de inicio de videos de WWDC comienza aquí: http://developer.apple.com/videos/wwdc/2010/ desde donde inicia sesión con su cuenta de desarrollador, y luego podrá abrir iTunes y descargar o simplemente ver los videos. El que me refiero es el 104 ("Diseño de aplicaciones con vistas de desplazamiento"). – viggio24

Cuestiones relacionadas