2014-04-01 9 views
5

Also die meisten Probleme, die Menschen mit diesem bestimmten Ereignis haben, ist scrollViewDidScroll Feuer, wenn es Animation passiert. Mein Fall ist genau das Gegenteil. Ich glaube, dass scrollViewDidScroll in meinem Fall nicht feuern sollte.UITableView scrollViewDidScroll gefeuert auf Animation

Lassen Sie mich weiter erklären.

Ich bin Dinge in ScrollViewDidScroll animieren und das funktionierte einwandfrei, bis ich UITableView in eine UIView-Klasse verschoben.

- (void) scrollViewDidScroll:(UIScrollView *)scrollView { 
    // Animation code here. 
    NSLog(@"scrollViewDidScroll"); 
} 

- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    NSLog(@"scrollViewDidEndDecelerating"); 
    NSArray *indexPaths = [_myTableView indexPathsForVisibleRows]; 
    [_myTableView scrollToRowAtIndexPath:[indexPaths objectAtIndex:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} 


Was bietet eine gleichmäßige Scrollen Erfahrung, die zu einer vorherigen Tabellenzeile einrastet. Die Konsole kann verifizieren, dass das Ereignis scrollViewDidScroll wegen scrollToRowAtIndexPath ausgelöst wird.

Console:

2014-03-31 22:21:43.346 Project[45843:a0b] scrollViewDidScroll 
2014-03-31 22:21:43.379 Project[45843:a0b] scrollViewDidScroll 
2014-03-31 22:21:43.429 Project[45843:a0b] scrollViewDidScroll 
2014-03-31 22:21:43.462 Project[45843:a0b] scrollViewDidScroll 
2014-03-31 22:21:43.479 Project[45843:a0b] scrollViewDidEndDecelerating 
2014-03-31 22:21:43.496 Project[45843:a0b] scrollViewDidScroll 
2014-03-31 22:21:43.513 Project[45843:a0b] scrollViewDidScroll 
2014-03-31 22:21:43.529 Project[45843:a0b] scrollViewDidScroll 

auf die Fragen:

1. Wie kann ich sicherstellen, dass die Veranstaltung scrollViewDidScroll nur Brände aufgrund Interaktion des Benutzers und nicht von Code Automatisierung?

2. Gibt es eine andere Methode, die die gleiche Funktionalität wie scrollToRowAtIndexPath ohne Triggerung scrollViewDidScroll bietet?

+1

Wie pro meines Wissens progammatically wollen unterscheiden Scrollen, können Sie nicht ohne Delegatmethode blättern aufgerufen wird . Eine Sache, die Sie tun können, ist, indem Sie programmgesteuert scrollen, können Sie eine Markierung setzen und sie in der Delegiertenmethode verwenden. Wenn Sie programmgesteuert scrollen, setzen Sie das Flag zurück. Ich hoffe, dass dir das weiterhilft .. –

Antwort

13

Ich weiß, das ist eine sehr alte Frage. Ich war gerade in einer ähnlichen Situation, in der ich Code nur ausführen muss, wenn der Benutzer scrollt, aber nicht, wenn ich scrollToRowAtIndexPath rufe. Mit den scrollView-Variablen dragging und decelerating habe ich eine einfachere Lösung gefunden.

wir haben 3 Fälle von Scrollen hier.

  1. Benutzer schleppt
  2. Benutzer gerade zu Ende gegangen ziehen und die Tableview wird decelrating
  3. programmatisch scrollForRowAtIndexPath: genannt

Alle oben genannten Fällen löst scrollViewDidScroll:aber

  1. Benutzer zieht dragging ist Wahre und deceleratingFalsch ist
  2. Benutzer gerade zu Ende gegangen ziehen und die Tableview ist decelrating dragging ist Falsch und decelerating ist Wahre
  3. programmatisch scrollForRowAtIndexPath: genannt dragging ist Falsch und decelerating ist Falsch

So wird Ihr Code wie so etwas wie dieses:

- (void) scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (scrollView.dragging) 
    { 
     // Do what you want when user is dragging 
    } else if (scrollView.decelerating) 
    { 
     // Do what you want when table is decelerating after finished dragging 
    } else 
    { 
     // Do what you want when table is scrolling programmatically. 
    } 
} 

Oder wenn Sie nur die

- (void) scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (scrollView.dragging || scrollView.decelerating) 
    { 
     // Scrolling by the user 
    } else 
    { 
     // Scrolling by the code 
    } 
} 
+2

Dies ist eine viel elegantere Lösung, als meine eigene zu rollen! Ändern Sie dies als die angenommene Antwort. –

1

Bald nachdem ich die Frage gestellt hatte, nahm ich eine kleine Pause, kam zu dem Problem zurück und fand es heraus. Sollte dies früher getan werden, anstatt ein paar Stunden zu verschwenden. blah!

Die Lösung ist einfach, setzen Sie ein bool Flag, das vor jedem programmatischen Scrollen gesetzt wird und ändern Sie das nach der Animation mit dem Event scrollViewDidEndScrollingAnimation.

bool performingAutomatedScroll = false; 

- (void) scrollViewDidScroll:(UIScrollView *)scrollView { 

    // If we are scrolling because of code, don't use any animations. 
    if (performingAutomatedScroll) return; 

    // Animation code here. 
} 

- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 

    performingAutomatedScroll = true; 
    NSArray *indexPaths = [_myTableView indexPathsForVisibleRows]; 
    [_myTableView scrollToRowAtIndexPath:[indexPaths objectAtIndex:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
    [_myTableView reloadRowsAtIndexPaths:[_timeCarousel indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone]; 

} 

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

    if (!decelerate) { 
    performingAutomatedScroll = true; 
    NSArray *indexPaths = [_myTableView indexPathsForVisibleRows]; 
    [_myTableView scrollToRowAtIndexPath:[indexPaths objectAtIndex:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
    [_myTableView reloadRowsAtIndexPaths:[_timeCarousel indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone]; 
    } 

} 

-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { 
    performingAutomatedScroll = false; 
} 
Verwandte Themen