2012-02-16 14 views
65

Tengo un UITableView. Está utilizando una celda de tabla personalizada y cada celda tiene una vista de usuario. Bcoz UIWebView tomó mucho tiempo para cargar, quiero evitar recargarlos a toda costa. En algunas situaciones, tengo todas las celdas cargadas, pero sus alturas están en mal estado. Por lo tanto, necesito "retransmitir" la tabla sin activar la función "cellForRow".No quiero animación en las actualizaciones de inicio, bloque de actualizaciones finales para uitableview?

  1. Definitivamente no puedo usar reloadData ... ya que volverá a cargar las células.
  2. me trataron tableView.setNeedDisplay, setNeedsLayout etc., ninguno de ellos es capaz de reorganizar las celdas de la tabla
  3. La única manera en que funcionaba, es llamar beginupdates/endupdates bloque, este bloque es capaz de la redistribución mi mesa 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 resolver mi problema?

Respuesta

182
[UIView setAnimationsEnabled:NO]; 
[tableView beginUpdates]; 
[tableView endUpdates]; 
[UIView setAnimationsEnabled:YES]; 
+1

Ese es un truco ingenioso e inteligente. ¡Lo agregaré a mi caja de herramientas! –

+1

¡Esto es genial! Me parece que tiene algunas aplicaciones más interesantes. Descubrí que el método de las secciones de recarga siempre se animará incluso si pasa '' 'UITableViewRowAnimationNone''', pero con esto la animación se puede pasar fácilmente. –

+1

¡Woow! Eres el jefe, hombre! – debiasej

2

Swifties que tenía 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() 
+0

me ayudó. Gracias. Importante poner 'setAnimationsEnabled (true)' dentro del bloque de finalización. –

+0

Pero esto no actualiza el pie de página hasta que se desplaza por la vista de tabla. –

+0

@ Mr.Bean ¿cuál es el caso completo? (es decir, ¿la tabla siempre tiene un pie de página, está intentando insertar uno o eliminar uno?) – NeilJaff

37

una forma más de hacerlo utilizando bloques

Obj-C

[UIView performWithoutAnimation:^{ 
    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 
}]; 

Swift

UIView.performWithoutAnimation { 
    tableView.beginUpdates() 
    tableView.endUpdates() 
} 
0

quería actualizada la altura de la celda de la sección 5 y el siguiente código que 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) 
1

Yo 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]; 

dar Es un intento.

Cuestiones relacionadas