Tengo un UITableView que usa una celda de tabla personalizada y cada celda tiene un UIWebView.
Debido a que UIWebView tardó mucho en cargarse, quiero evitar volver a cargarlos a toda costa. En algunas situaciones, tengo todas las celdas cargadas, pero sus alturas están desordenadas. Por lo tanto, necesito "retransmitir" la tabla sin activar la función "cellForRow".
- Definitivamente no puedo usar reloadData ... ya que recargará las celdas nuevamente.
- Probé tableView.setNeedDisplay, setNeedsLayout, etc., ninguno de ellos puede reorganizar las celdas de la tabla
- La única forma en que funcionó, es llamar al bloque beginupdates / endupdates, ¡este bloque puede retransmitir mi tabla sin disparar cellForRow! PERO, ¡no quería la animación! Este bloque produce un efecto de animación pero no lo quiero ...
¿Cómo puedo solucionar mi problema?
objective-c
uitableview
mkto
fuente
fuente
UITableViewRowAnimationNone
, ¡pero con esto la animación se puede omitir fácilmente!Una forma más de hacerlo usando bloques
Obj-C
[UIView performWithoutAnimation:^{ [self.tableView beginUpdates]; [self.tableView endUpdates]; }];
Rápido
UIView.performWithoutAnimation { tableView.beginUpdates() tableView.endUpdates() }
fuente
trabajando en mi proyecto, pero no una solución común.
let loc = tableView.contentOffset UIView.performWithoutAnimation { tableView.reloadData() tableView.layoutIfNeeded() tableView.beginUpdates() tableView.endUpdates() tableView.layer.removeAllAnimations() } tableView.setContentOffset(loc, animated: true)//animation true may perform better
fuente
Swifties tuve que hacer lo siguiente para que esto funcione:
// Sadly, this is not as simple as calling: // UIView.setAnimationsEnabled(false) // self.tableView.beginUpdates() // self.tableView.endUpdates() // UIView.setAnimationsEnabled(true) // We need to disable the animations. UIView.setAnimationsEnabled(false) CATransaction.begin() // And we also need to set the completion block, CATransaction.setCompletionBlock { () -> Void in // of the animation. UIView.setAnimationsEnabled(true) } // Call the stuff we need to. self.tableView.beginUpdates() self.tableView.endUpdates() // Commit the animation. CATransaction.commit()
fuente
setAnimationsEnabled(true)
dentro del bloque de terminación.Prefiero tener una transición suave:
CGPoint offset = self.tableView.contentOffset; [UIView transitionWithView:self.tableView duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [self.tableView reloadData]; self.tableView.contentOffset = offset; } completion:nil];
darle una oportunidad.
fuente
Quería actualizar la altura de la celda para la sección 5 y el siguiente código funcionó para mí:
UiView.setAnimationsEnabled(False) self.productTableView.reloadSections(NSIndexSet(index: SectionType.ProductDescription.hashValue), withRowAnimation: UITableViewRowAnimation.None) self.productTableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 5), atScrollPosition: UITableViewScrollPosition.Bottom, animated: false) UIView.setAnimationsEnabled(true)
fuente