2011-12-15 13 views
11

Mam kilka kontrolerów widoku z jednym lub wieloma widokami przewijania. Chociaż ustawiłem wyraźnie flagi scrollsToTop w widokach z więcej niż jednym widokiem przewijania, niektóre widoki przewijania nie pozwalają przewijać w górę po dotknięciu paska stanu.Jak dowiedzieć się, który inny UIScrollView przeszkadza scrollsToTop?

Po naciśnięciu innego kontrolera widoku i jego kliknięciu gest czasami działa w widoku, w którym poprzednio go nie ma.

To bardzo zagmatwane i po prostu nie wiem, jaki jest problem. W jaki sposób można skutecznie debugować ten problem? Czy istnieje globalne (prywatne) powiadomienie dla paska stanu, aby móc ręcznie przewijać widoki?

Odpowiedz

22

Użyłem kodu jak poniżej debugować ten scenariusz, zanim:

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

W zależności od tego, ile UIScrollViews znaleźć można zmodyfikować ten kod, aby pomóc debugowania konkretnej sytuacji.

Kilka pomysłów:

  • zmienić kolory tła o różnych scrollviews zidentyfikować je na ekranie.
  • Wydrukuj hierarchię widoków tych przewiń, aby zidentyfikować wszystkie swoje superopinie.

Najlepiej byłoby, gdyby pojedyncza pozycja UIScrollView w hierarchii okna, która ma wartość ScrollsToTop, ustawiona na TAK.

+0

Chociaż nie mogę przetestować to rozwiązanie ATM, rozumowanie jest dźwięk. –

+0

Prosty, ale piękny fragment! – nobre

1

Zmieniłem przyjętych do szybkich odpowiedzi dla wygody:

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) 
    } 
} 
Powiązane problemy