2011-12-15 11 views
11

Tengo varios controladores de visualización con una o varias vistas de desplazamiento. Aunque establecí explícitamente los indicadores scrollsToTop en los controladores de vista con más de una vista de desplazamiento, algunas vistas de desplazamiento se niegan a desplazarse hacia arriba cuando toco la barra de estado.¿Cómo saber qué otro UIScrollView interfiere con scrollsToTop?

Después de presionar otro controlador de vista y soltarlo, el gesto a veces funciona en la vista que anteriormente no tenía.

Es muy confuso y simplemente no sé cuál es el problema. ¿Cómo se puede depurar este problema de manera efectiva? ¿Hay una notificación global (privada) para la barra de estado para poder desplazar las vistas manualmente?

Respuesta

22

he utilizado un código como el siguiente para depurar este escenario, antes de:

- (void)findMisbehavingScrollViews 
{ 
    UIView *view = [[UIApplication sharedApplication] keyWindow]; 
    [self findMisbehavingScrollViewsIn:view]; 
} 

- (void)findMisbehavingScrollViewsIn:(UIView *)view 
{ 
    if ([view isKindOfClass:[UIScrollView class]]) 
    { 
     NSLog(@"Found UIScrollView: %@", view); 
     if ([(UIScrollView *)view scrollsToTop]) 
     { 
      NSLog(@"scrollsToTop = YES!"); 
     } 
    } 
    for (UIView *subview in [view subviews]) 
    { 
     [self findMisbehavingScrollViewsIn:subview]; 
    } 
} 

Dependiendo del número de UIScrollViews a encontrar, puede modificar el código para ayudar a depurar su situación particular.

Algunas ideas:

  • Cambiar los colores de fondo de los diversos scrollviews para identificarlos en la pantalla.
  • Imprime la jerarquía de vistas de esas scrollviews para identificar todas sus supervistas.

Idealmente, solo debería encontrar un UIScrollView único en la jerarquía de ventanas que tenga scrollsToTop establecido en YES.

+0

Aunque no puedo probar esta solución atm, el razonamiento es sólido. –

+0

fragmento simple pero hermoso! – nobre

1

Me cambiaron las respuestas aceptadas en veloz por conveniencia:

func findMisbehavingScrollViews() { 
    var aview = UIApplication.sharedApplication().keyWindow 
    findMisbehavingScrollViewsIn(aview!) 
} 

func findMisbehavingScrollViewsIn(aview: UIView) { 
    if aview.isKindOfClass(UIScrollView) { 
     if (aview as! UIScrollView).scrollsToTop { 
      print("found uiscrollview \(aview)") 
     } 
    } 
    for bview in aview.subviews { 
     findMisbehavingScrollViewsIn(bview) 
    } 
} 
Cuestiones relacionadas