UITableView pie de página de vista de pie de página después de updateUpdates

En ios8, estoy usando el controller de vista de la tabla de datos del núcleo y, después de eliminar filas, la vista del pie de página de mi sección de repente va hasta la parte inferior de UITableView . Cuando desploop la vista de la tabla, la vista del pie de página regresa a su lugar. ¿Cómo puede arreglar esto y por qué sucede esto?

Aquí está el código por si acaso.

 - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { if (!self.suspendAutomaticTrackingOfChangesInManagedObjectContext) { switch(type) { case NSFetchedResultsChangeInsert: [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; break; case NSFetchedResultsChangeDelete: [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; break; case NSFetchedResultsChangeUpdate: [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; break; case NSFetchedResultsChangeMove: [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; break; } } } - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { if (self.beganUpdates) { [self.tableView endUpdates]; } } 

Este es un cambio de animation iOS 8. Debes cambiar el estilo de vista de tabla a 'agrupado' para que el pie de página de la sección no se mueva al bootom de la vista útil

Acabo de encontrar el mismo problema. Cuando uso insertRowsAtIndexPaths … el pie de página va al final. También noté que si llamas a reloadData en la vista de tabla, se solucionará el problema, así que hice esto:

 [CATransaction begin]; [CATransaction setCompletionBlock: ^{ // Code to be executed upon completion [tableView reloadData]; }]; [tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationLeft]; [CATransaction commit]; 

Todo lo que hace es volver a cargar la tabla cuando la animation de inserción termina … No es una solución real, más como evitar el problema, pero oculta el problema hasta que alguien explica por qué sucede y cómo solucionarlo …

Me encontré con el mismo problema y dediqué mucho esfuerzo para tratar de solucionarlo. ¡Y ahora, por fin!

 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { NATask *task = sections[indexPath.section][indexPath.row]; [sections[indexPath.section] removeObjectAtIndex:indexPath.row]; [appDelegate.managedObjectContext deleteObject:task]; [CATransaction begin]; [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; UIView *footerView = [tableView footerViewForSection:indexPath.section]; CABasicAnimation *animation = [[footerView.layer animationForKey:@"position"] mutableCopy]; CGPoint fromValue = [(NSValue *)animation.fromValue CGPointValue]; animation.toValue = [NSValue valueWithCGPoint:CGPointMake(0, fromValue.y - 44)]; [footerView.layer removeAnimationForKey:@"position"]; [footerView.layer addAnimation:animation forKey:@"position"]; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, .4 * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [tableView reloadData]; }); [CATransaction commit]; } } 

Por supuesto, esta no es la solución más ideal, ¡pero funciona! Llevo casi dos semanas luchando con este problema, espero que, al less, sea útil para alguien.

Me he encontrado con el mismo problema. Ninguna de las respuestas hasta ahora me dio exactamente lo que estaba buscando. Configurar la vista de tabla para 'agrupar' no era el comportamiento que quería y las otras soluciones aún resultaban en que el pie de página se situara brevemente en la parte inferior de la vista de tabla hasta que se llamara a reloadData, que los devolvió bruscamente a la position correcta.

A continuación se muestra mi solución que lo anima sin problemas a donde debería estar.

 NSIndexPath* iPath = [NSIndexPath indexPathForRow:_lineItemArray.count-1 inSection:0]; // Calculate the Y position of the bottom of the footer within the table view frame. CGFloat footerBaseY = (_footer.y + _footer.height) - _sTableView.contentOffset.y; // Calculate the Y position of the bottom taking into account the bottom content inset. CGFloat tableViewContentBottomY = _sTableView.height - _sTableView.contentInset.bottom; if (footerBaseY < tableViewContentBottomY) { [_sTableView insertRowsAtIndexPaths:@[iPath] withRowAnimation:UITableViewRowAnimationBottom]; [UIView animateWithDuration:0.3 animations:^{ CGFloat y = _lineItemArray.count * [_sTableView rectForRowAtIndexPath:iPath].size.height; CGFloat newBaseY = (y + _footer.height) - _sTableView.contentOffset.y; if (newBaseY < tableViewContentBottomY) { _footer.y = y; } else { // The footer is within a cell's height away from the bottom. Subtract the diff from the new y. _footer.y = y - (newBaseY - tableViewContentBottomY); } } completion:^(BOOL finished) { // This ensures that the bottom row animates up if the footer was within a cell's height away from the bottom. [_sTableView scrollToRowAtIndexPath:iPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; }]; } else { // The footer was already at the bottom of the vew so I'm animating the added row up. [_sTableView insertRowsAtIndexPaths:@[iPath] withRowAnimation:UITableViewRowAnimationBottom]; [_sTableView scrollToRowAtIndexPath:iPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; } 

Todavía necesito que la vista del encabezado y pie de página sea pegajosa. Entonces, en lugar de cambiar el estilo de vista de tabla a Agrupado, simplemente realicé una sección de recarga después de eliminar las filas …