iphone objective-c uiscrollview reusability

iphone - ¿Cómo reutilizar/reciclar elementos personalizados como hace uitableviewcell?



objective-c uiscrollview (1)

Cuando usamos UITableView, podemos reutilizar sus celdas usando los [[ UITableViewCell alloc] initWithStyle: reuseIdentifier:] y los [uiTableViewInstance dequeueReusableCellWithIdentifier:] . Esto ayuda a mantener la memoria bajo control para tablas enormes, ya que solo hay unas pocas celdas en la vista en un instante dado.

Quiero crear un UIScrollView que tenga muchas subvistas. Insertar todas las subvistas requiere mucha memoria y la primera vez que quiero evitar. ¿La API de Apple proporciona formas de reutilizar dichos componentes personalizados (una vista UIV o una subclase de ella aquí) al igual que las vistas de celda con un identificador?

Crearé una si no hay API, pero tengo algunas dudas al respecto. Por ejemplo, para cada nueva subvista, estoy configurando su posición de marco, después de las vistas previos. ¿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 brusco? En general, me gustaría tener una experiencia de desplazamiento suave como en UITableView con todas las cosas reutilizables.

Aquí hay una muestra del 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

Agregar 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:
Sería útil tener una idea de cómo la vista de tabla y sus celdas logran esto detrás de escena.


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 el almacenamiento de vistas y el ahorro de tiempo para la asignación de vistas, pero, por supuesto, la gestión de los datos de contenido depende de usted.

Por lo tanto, el método de reciclaje estándar requiere que use un número de celdas que sea igual al número de vistas visibles al mismo tiempo en la pantalla + el número de celdas adicionales que puede obtener al comenzar el desplazamiento. Digamos, por ejemplo, que está mostrando 5 vistas completas a la vez (vista de desplazamiento 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 utilizar 2 vistas más. Por lo tanto, debe escribir dos grupos: uno llamado "Visitas visibles", que se compone de todas las vistas agregadas como subvistas a la vista de desplazamiento, y otro llamado "Visitas disponibles", que está hecho de todas las vistas disponibles para su reutilización. Luego, crea todas estas vistas y las agrega a la vista de desplazamiento (sí: debe ajustar su marco de acuerdo con su posición en la vista de desplazamiento, y sí, debe configurar el contenido nuevamente). Finalmente, debe realizar un seguimiento del movimiento de la vista de desplazamiento mediante la configuración de un delegado. El propósito de este seguimiento es calcular cuál de las vistas visibles no está más visible, luego eliminarlo del grupo visible y moverlo al grupo utilizable. Además, el delegado debe comprender cuándo aparecerá una nueva celda pero aún no está visible, luego obtenerla de la agrupación disponible (o asignarla / iniciarla si la agrupación está vacía) y agregarla a la agrupación visible y como subvista de el scrollview. 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, por eso recomendé usar un par de vistas adicionales a los lados de la vista de desplazamiento .

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

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