2013-08-12 20 views
5

Ho una vista tabella che esegue un'animazione quando l'utente scorre verso il basso su un UITableView (spingere il pollice su) e una diversa animazione quando l'utente scorre verso l'alto (Spingi il pollice verso il basso) su un UITableView .Rilevamento del "rimbalzo" in basso di UITableView

Il problema è quando l'utente raggiunge il fondo di un UITableView e rimbalza, la tabella registra un movimento verso l'alto e quindi verso il basso, esercitando così l'animazione quando non dovrebbe.

Questo stesso comportamento si verifica quando si scorre verso l'alto; tuttavia, sono in grado di rilevare in questo modo:

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

    } 

} 

Questo funziona perfettamente, ma per la vita di me non riesco a capire una condizione if per rilevare il fondo pure. Sono sicuro che sia semplice e non riesco a capirlo.

risposta

28

Che ne dite di qualcosa di simile:

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

Questo è tutto! Avrei giurato di averlo provato, ma è molto probabile che abbia incasinato i miei operatori. Molte grazie! –

+5

È necessario account per contentInset. Se impostato su qualcosa di maggiore di zero, questo non funzionerà. Usalo invece: 'if (self.tableView.contentOffset.y - self.tableView.contentInset.bottom> = self.tableView.contentSize.height - self.tableView.bounds.size.height)'. Inoltre, questo funziona per tutte le sottoclassi di UIScrollView (UICollectionView e UITableView). –

+0

Questo NON funzionerà con storyboard e classi di dimensioni. Controlla la mia risposta qui. – Ashok

0

Nell'odierna volte (Xcode 7), sotto il codice dovrebbe risolvere la maggior parte dei casi d'uso, poiché rappresenta UIScrollView (ed è sottoclassi UITableView e UICollectionView) inserti, storyboard unico per più dispositivi (ad esempio classi di dimensione) -

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: Avviso Int() e == è importante per innescare eventi una volta.