2010-04-03 18 views
7

Tengo un UIScrollView que contiene imágenes de gran tamaño y estoy usando paginación para desplazarme entre las imágenes. Para ahorrar memoria, estoy cargando solo una imagen antes y después de la imagen visible y cargando/liberando nuevas imágenes después de que se haya completado un desplazamiento.Páginas de carga diferida en UIScrollView

El problema ocurre cuando uno se desplaza rápidamente y no se llama a scrollViewDidEndDecelerating.

¿Cómo puedo detectar el desplazamiento continuo?

yo pueda comprobar la ubicación del artículo en cada scrollViewDidScroll pero esto parece un poco pesado ...

+0

es la solución de la aplicación de una desaceleración del código relacionado scrollViewDidEndDragging: willDecelerate está trabajando para usted? – spd

Respuesta

0

Mi solución temporal es cancelar desplazamiento continuo mediante la desactivación de desplazamiento de cuando el usuario levanta el dedo hasta que haya terminado de desplazamiento.

-(void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 
{ 
    [scrollView setScrollEnabled:NO]; 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [scrollView setScrollEnabled:YES]; 
} 
0

Usted puede hacer algo como esto

-(void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    CGFloat pageWidth = scrollView.frame.size.width; 
    int page = floor((scrollView.contentOffset.x - pageWidth/1.5)/pageWidth) + 1; 
} 

este método se llama cada vez que el contentoffset cambió mediante programación si o no.

Desde este método puede verificar si 'página' es la misma que su página actual, si no, usted sabe que necesita cargar algo. El truco aquí es hacer que las imágenes se carguen sin detener el desplazamiento de la vista de desplazamiento. Ahí es donde estoy atrapado.

el cálculo página cambiará a la siguiente/anterior cuando se está a mitad de camino a la siguiente página

0

si todavía está buscando una solución ... esto lo que hago, funciona muy bien tener un buen desempeño , también.

- (void)scrollViewDidEndDragging:(UIScrollView *)sv willDecelerate:(BOOL)decelerate 
{ 
    if (!decelerate) 
    { 
     // load images and unload the ones that are not needed anymore 
     [self someMethod] 
    } 
} 


- (void)scrollViewDidEndDecelerating:(UIScrollView *)sv 
{ 
    // load images and unload the ones that are not needed anymore 
    [self someMethod] 
} 
+0

Incluso tengo el mismo problema que Jean.Probé el método scrollViewDidEndDragging: willDecelerate: Pero, siempre que no se llame a scrollViewDidEndDecelerating, scrollViewDidEndDragging: willDecelerate: tampoco se invocará. ¿Cómo resuelvo este problema? – spd

2

Tal vez una vista de tabla con el contenido de celdas personalizadas funcionaría mejor para usted, ya que tiene una gran cantidad de lógica construida en sólo la carga de las células que son visibles en lugar de todo a la vez. Hay muchos tutoriales sobre cómo administrar las vistas de tabla de varias maneras.

0

Debe verificar tanto scrollViewDidEndDecelerating como scrollViewDidScroll. Cuándo usar los deslizamientos y soltarlo para tener el desplazamiento de "momento", se llamará al primero en y. Si el usuario decide detener el desplazamiento con su dedo tocando en la vista de tabla (o si el desplazamiento es más profundo, pero no estoy seguro de eso), se dispara el segundo evento.

0

Según mi experiencia, @ jd291 es correcto; Estoy utilizando siguientes devoluciones de llamada con éxito para la mayoría de los lugares

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 

pero, el único caso en el que un callback no se conoce es que es posible que no habían establecido el delegate correctamente.

Cuestiones relacionadas