2013-08-12 18 views
5

Mam widok tabeli, który wykonuje animację, gdy użytkownik przewija w dół na UITableView (push thumb up) i inną animację, gdy użytkownik przewija w górę (Push thumb down) na UITableView .Wykrywanie dolnego "odbicia" z UITableView

Problem polega na tym, że użytkownik osiąga dno UITableView i odskakuje, stół rejestruje ruch w górę, a następnie w dół, wykonując w ten sposób animację, gdy nie powinna.

To samo zachowanie się dzieje podczas przewijania do góry; Jednak jestem w stanie wykryć tak:

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

    self.lastContentOffset = scrollView.contentOffset; 

} 


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

    // Check if we are at the top of the table 
    // This will stop animation when tableview bounces 

    if(self.tableView.contentOffset.y < 0){ 
     // Dont animate, top of tableview bounce 


    } else { 

     CGPoint currentOffset = scrollView.contentOffset; 

     if (currentOffset.y > self.lastContentOffset.y) { 

      // Downward animation 
      [self animate:@"Down"]; 

     } else { 

      // Upward 
      [self animate:@"Up"]; 

     } 

     self.lastContentOffset = currentOffset; 

    } 

} 

Działa to doskonale, ale dla życia mnie nie mogę dowiedzieć się, if warunek wykryć dno, jak również. Jestem pewien, że to proste i po prostu nie mogę tego zrozumieć.

Odpowiedz

28

Jak o coś takiego:

if (self.tableView.contentOffset.y >= (self.tableView.contentSize.height - self.tableView.bounds.size.height)) 
{ 
    // Don't animate 
} 
+0

To wszystko! Mógłbym przysiąc, że próbowałem tego, ale bardzo możliwe, że zawiodłem moich operatorów. Wielkie dzięki! –

+5

Musisz uwzględnić contentInset. Jeśli ustawione na coś większego niż zero, to nie zadziała. Użyj tego zamiast: 'if (self.tableView.contentOffset.y - self.tableView.contentInset.bottom> = self.tableView.contentSize.height - self.tableView.bounds.size.height)'. Działa to również dla wszystkich podklas UIScrollView (UICollectionView i UITableView). –

+0

To NIE będzie działać w przypadku scenorysów i klas wielkości. Sprawdź moją odpowiedź tutaj. – Ashok

0

W dzisiejszych czasach (Xcode 7) poniżej kod powinien rozwiązać większość przypadków użycia, ponieważ odpowiada on za UIScrollView (i to podklasy UITableView i UICollectionView) wypustki, pojedynczy storyboard dla wiele urządzeń (tj. klasy wielkości) -

func scrollViewDidScroll(scrollView: UIScrollView) { 
    if (Int(scrollView.contentOffset.y + scrollView.frame.size.height) == Int(scrollView.contentSize.height + scrollView.contentInset.bottom)) { 
     if !isFetching { 
      isFetching = true 
      fetchAndReloadData(true) 
     } 
    } 
} 

PS: Uwaga: Int() i == są ważne, aby jednorazowo wywołać zdarzenie.

Powiązane problemy