No quiero animación en el bloque de actualizaciones de inicio, finalización de actualizaciones para uitableview.

89

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".

  1. Definitivamente no puedo usar reloadData ... ya que recargará las celdas nuevamente.
  2. Probé tableView.setNeedDisplay, setNeedsLayout, etc., ninguno de ellos puede reorganizar las celdas de la tabla
  3. 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?

mkto
fuente

Respuestas:

216
[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];
Evgeny Shurakov
fuente
1
¡Esto es genial! Creo que tiene algunas aplicaciones muy interesantes. Descubrí que el método de recargar secciones siempre se animará incluso si pasas UITableViewRowAnimationNone, ¡pero con esto la animación se puede omitir fácilmente!
Flying_Banana
65

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()   
}
Dmitriy
fuente
4

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
hstdt
fuente
3

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()
Neil Japhtha
fuente
Me ayudó. Gracias. Importante poner setAnimationsEnabled(true)dentro del bloque de terminación.
Lasse Bunk
Pero esto no actualiza el pie de página hasta que se desplaza por la vista de tabla.
Mr.Bean
@ Mr.Bean ¿cuál es el caso completo? (es decir, ¿su vista de tabla siempre tiene un pie de página, está tratando de insertar uno o eliminar uno?)
Neil Japhtha
Siempre tenga un pie de página, solo necesita actualizar el pie de página (es decir, hay 2 vistas dentro del pie de página, es necesario ocultar / mostrar las vistas según la condición).
Mr.Bean
@ Mr.Bean, ¿qué contiene su bloque de actualización? El método más extensible aquí sería volver a cargar la sección.
Neil Japhtha
1

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.

Jorge Arimany
fuente
0

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)
Aadi007
fuente