iphone - uitableviewcell - UITableView contentSize
table view cell auto height (4)
Tengo un problema con un par de vistas de tabla en mi aplicación.
El problema ocurre cuando el contenido de la tabla cambia (y, por lo tanto, el contenido de la vista de tabla aumenta).
Por alguna razón, contentSize de la UITableView mantiene el mismo significado, no puedo desplazarme para ver el nuevo contenido.
Esto sucede cuando una celda en particular se agranda (después de [tableView reloadData];) o cuando agrego nuevas celdas (usando los métodos de delegado NSFetchedResultsController).
¿Hay algo que deba hacer para que el tableView reajuste su contentSize?
Edite para mostrar el código, pero esto es solo el código delegado de NSFetchedResultsController ...
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller is about to start sending change notifications, so prepare the table view for updates.
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:(OJFPunchListCell*)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray
arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray
arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id )sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller has sent all current change notifications, so tell the table view to process all updates.
[self.tableView endUpdates];
}
He hecho este tipo de cosas antes en iOS5 y nunca tuve un problema con eso. Parece que esto es potencialmente un cambio de iOS6?
::EDITAR::
Lo estúpido de esto es que tengo varios otros UITableViewControllers en la misma aplicación y todos están funcionando bien. Puedo agregar nuevas celdas, agregar celdas de tamaño dinámico, cambiar el tamaño de las celdas, etc ... y las tablas se desplazan correctamente hacia arriba y hacia abajo en todo el contenido.
Este problema ahora está ocurriendo en un par de vistas de tabla que he agregado recientemente.
::EDITAR::
OK, solo haciendo un poco de depuración. Cuando entro por primera vez en la Vista de tabla, contentSize.height es 594.
Cuando luego agrego un nuevo elemento y vuelvo a la misma tableviewController, contentSize.height es 749.
Sin embargo, no puedo desplazarme para ver la celda recién agregada en la parte inferior de la vista de tabla. Simplemente no se desplazará allí. Rebota a la altura de contentSize antigua.
Me he estado encontrando en el mismo problema y terminé con esta solución. Estoy configurando contentSize
justo después de [self.tableView endUpdates];
[self.tableView endUpdates];
NSLog(@"%f", self.tableView.contentSize.height);
self.tableView.contentSize = [self.tableView sizeThatFits:CGSizeMake(CGRectGetWidth(self.tableView.bounds), CGFLOAT_MAX)];
NSLog(@"%f", self.tableView.contentSize.height);
[self.tableView setContentInset:UIEdgeInsetsMake(50, 0, -50, 0)];
Prueba esto:
Me he encontrado con un problema similar. En mi situación, arrastro una vista de tabla a un controlador de vista personalizado, que se presenta mediante un segmento de inserción. Si la cantidad de datos mostrados en la vista de tabla excede algún número, entonces no puedo tocar la celda. en la parte inferior de la tableview.
Se han intentado muchas formas: establezca el tamaño de marco / contenido de la vista de tabla, y ninguna funciona para mí. Finalmente, encuentro la causa raíz y la resuelvo de una manera simple (aunque no con gracia).
Primero, la causa raíz: la vista de tabla creada por IB tiene un ancho mayor que el controlador de su vista principal. Por lo tanto, no se tocará ninguna celda fuera del límite de la vista.
Entonces, la solución es simple: vaya a StoryBoard, ajuste el ancho de la vista de tabla, haciéndolo más pequeño que el ancho de la vista primaria. Parece que si StoryBoard crea una vista de tabla, no puede cambiar su cuadro por código. Eso es lo que he encontrado hasta ahora. Supongo que es un error de StoryBoard.
Espero que te sea de utilidad.
Tengo tableView dinámico con ''UITableViewAutomaticDimension''. Algo sucede y después de la recarga y su tamaño de contenido es igual a su tamaño de marco. Después de que puse manualmente el tamaño del contenido como tamaño de los límites de la tabla, todo funciona. Espero que esto ayude.
table.beginUpdates()
table.contentSize = CGSize(width: table.bounds.width, height: table.bounds.height)
table.endUpdates()
Y esto es después de que haya hecho table.reloadData ()
Tuve el mismo problema al usar un controlador de vista personalizado con dos VC secundarios, uno de ellos era un controlador de resultados de tableview + recuperados.
Llegaría al punto después de agregar el contenido de un vc y volver a mi tabla de que no podría desplazarme al contenido nuevo en la parte inferior.
Así que en mi tableview + controlador de resultados recuperados, ajusto el tamaño del contenido en función de la cantidad de objetos recuperados que tengo, sin importar de dónde vinieron.
El peor escenario es que no agregué ningún contenido al mostrar el VC, pero el costo es mínimo.
//In my tableview + fetched results controller class
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSUInteger objCount = self.fetchedResultsController.fetchedObjects.count;
//My custom cell has a height of 50.0f, yours may not!
CGFloat tableHeight = objCount * 50.0f;
NSLog(@"%i objects, total height: %f",objCount,tableHeight);
[self.tableView setContentSize:CGSizeMake(self.tableView.contentSize.width, tableHeight)];
}