ios uitableview uiscrollviewdelegate

ios - Detectando el "rebote" inferior de UITableView



uiscrollviewdelegate (2)

Tengo una vista de tabla que realiza una animación cuando el usuario se desplaza hacia abajo en una UITableView (pulgar hacia arriba) y una animación diferente cuando el usuario se desplaza hacia arriba (pulgar hacia abajo) en una UITableView.

El problema es cuando el usuario alcanza la parte inferior de una UITableView y rebota, la tabla registra un movimiento hacia arriba y hacia abajo, realizando la animación cuando no debería.

Este mismo comportamiento exacto ocurre cuando se desplaza hacia la parte superior; sin embargo, soy capaz de detectarlo así:

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

Esto funciona perfectamente, pero por mi vida no puedo encontrar una condición para detectar el fondo también. Estoy seguro de que es simple y no puedo entenderlo.


Qué tal algo como esto:

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


En los tiempos actuales (Xcode 7), el siguiente código debería resolver la mayoría de los casos de uso dado que representa las inserciones UIScrollView (y sus subclases UITableView y UICollectionView), solo guión gráfico para múltiples dispositivos (es decir, clases de tamaño) -

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) } } }

PD: Aviso Int () y == es importante para activar el evento una vez.