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.