2012-02-09 15 views
13

Tengo un método que agrega algunas subvistas (imágenes/botones) a mi ScrollView.La mejor manera de actualizar/cargar UIScrollView

El problema es que desde fuera de ScrollView el usuario puede tocar un botón que cambiará el contenido de ScrollView.

¿Hay alguna manera decente de "reset" del ScrollView mejor que:

for (UIView * view in myScrollView.subViews) { 
    [view removeFromSuperview]; 
} 

Tenga en cuenta que esta solución elimina la barra para indicar la posición en la ScrollView

Respuesta

19

Llamar setNeedsDisplay va a volver a dibujar su vista de desplazamiento, no a eliminar el contenido dentro de ella.

Como has descubierto, llamar al removeFromSuperview en todas las subvistas de la vista de desplazamiento provocará que algunas veces también se eliminen tus barras de desplazamiento (no muy buenas).

Hay un par de enfoques al respecto: el primero es mantener una matriz distinta que contenga todas las vistas que ha agregado a la vista de desplazamiento. A continuación, puede simplemente iterar a través de esta matriz en su lugar. En mi opinión, este es probablemente el mejor enfoque.

El otro, un poco hacky, forma de hacerlo es poner a prueba los puntos de vista como iterar a través de ellos:

for (UIView *view in self.contentView.subviews) 
{ 
    if (![view isKindOfClass:[UIImageView class]]) 
     [view removeFromSuperview]; 
} 

Debido a que las barras de desplazamiento son en sí mismos una subclase UIImageView esto no va a eliminarlos. Pero, de nuevo, si utiliza las vistas de imágenes usted mismo tampoco se eliminarán, y no hay garantía en futuras versiones de iOS de que seguirán siendo vistas de imágenes.

Mucho mejor para ir con mi primer enfoque y simplemente mantener una matriz con todas las vistas que ha agregado.

+0

De seguro es una idea mejor, nunca se pensó en eso antes ... Para que quede claro para otros con el mismo problema: Al agregar una subvista a su scrollView, también puede agregarla a una matriz. Cuando vea la necesidad de eliminarlos, itere en la matriz y simplemente envíeles un mensaje de removeFromSuperview. –

0

Tras la eliminación de los puntos de vista que no sean necesarios (que Supongo que no podrá evitar el problema) llame al [myScrollView setNeedsDisplay]; para actualizar UIScrollView en el siguiente ciclo de dibujo.

+0

y no se olvide de actualizar el tamaño del contenido de la UIScrollView llamando '[myScrollView setContentSize: tamaño];' 'antes de llamar [myScrollView setNeedsDisplay];' 'o [myScrollView setNeedsLayout];' –

+2

ven esto ASÍ pregunta: http://stackoverflow.com/questions/2156015/iphone-remove-all-subviews donde se sugiere utilizar '[[subvistas myScrollView] makeObjectsPerformSelector: @selector (removeFromSuperview)];' como una forma simplificada de eliminando todas las subvistas –

+0

* Me acabo de dar cuenta de esto: "Tenga en cuenta que esta solución elimina la barra para indicar la posición en el ScrollView" * ... ¿por qué no simplemente coloca el UIScrollView dentro de una UIView, y simplemente elimina UIScrollView y crea uno nuevo y repobla ¿eso? (Si planea eliminar todas las subvistas de todos modos) –

2

Por lo general, mantengo una matriz mutable de vistas que he puesto en la vista de desplazamiento, y repito sobre eso en lugar de subviews. De esa manera solo saco lo que pongo. Pero el enfoque básico es el mismo.

3

Esta es una especie de un viejo hilo, pero un método ligeramente más fácil podría ser añadir una etiqueta a la de su adición a la UIScrollView, digamos 15. Entonces

for (UIView * view in _scrollView.subviews) { 
    if (view.tag == 15) { 
     [view removeFromSuperview]; 
    } 
} 

esta forma puede ser la visión Asegúrese de eliminar solo la vista que ha agregado. Solo un pensamiento.

1

Esto es lo que hice para eliminar toda la subvista excepto la barra de desplazamiento, eliminé todas las subvistas que tienen frame.size.width mayor que 10, el ancho de la barra de desplazamiento es menor que 10, por lo que no se eliminará. Esto supone que todos los puntos de vista que se agregan a UIScollView tienen una anchura superior a 10.

for (UIView * view in view.subviews) { 
    if(view.frame.size.width > 10){ // removes all component except scrollbar 
     [view removeFromSuperview]; 
    } 
} 
0

Tienes que establecer estas líneas antes del método de desplazamiento de inicio, es simplemente eliminar todos los datos de ScrollView y según su ScrollView methodwillmuch Reiniciar.

 NSArray* subviews = [[NSArray alloc] initWithArray: Main_Scroll.subviews]; 
     for (UIView* view in subviews) 
     { 
      if ([view isKindOfClass:[UIView class]]) 
      { 
       [view removeFromSuperview]; 
      } 
      if ([view isKindOfClass:[UIImageView class]]) 
      { 
       [view removeFromSuperview]; 
      } 
      if ([view isKindOfClass:[UIButton class]]) 
      { 
       [view removeFromSuperview]; 
      } 
      if ([view isKindOfClass:[UILabel class]]) 
      { 
       [view removeFromSuperview]; 
      } 
     }