2011-10-29 14 views
10

Tengo un registro de mensajes desplazable potencialmente largo dentro de un UITableView. El usuario podría navegar por la tabla desplazándose.iPhone UITableView Agregue contenido en la parte superior sin desplazarse

Lo que intento hacer es agregar contenido nuevo en la parte superior de la tabla. Si la parte superior de la tabla es visible, la nueva fila empujará el resto del contenido hacia abajo. Pero si la primera fila de la tabla es no visible, la tabla agregará silenciosamente otra fila en la parte superior sin desplazarse.

Estoy haciendo esto para evitar que la tabla que se desplaza hacia la parte superior interrumpa al usuario datos de navegación. Si le pido a la tabla que simplemente se desplace al nuevo punto de inserción, la posición del usuario dentro de la tabla se perderá, frustrando al usuario.

Una de las formas en que puedo tratar de implementar esto es mediante insertando datos en un NSMutableArray en el índice 0. ¿Funcionaría? Una pregunta adicional: qué tan caro es insertar datos al comienzo de un NSMutableArray. Esperaría que tal operación esté optimizada, pero me gustaría asegurarme. ¿Qué me estoy perdiendo con esta implementación?

¡Gracias!

+0

posible duplicado de [Mantener UITableView estática al insertar filas en la parte superior] (http: // stackoverflow.com/questions/4279730/keep-uitableview-static-when-inserting-rows-at-the-top) – BB9z

Respuesta

13

cómo insertar sin chocar con la vista:

  • Utilice los tableView 's (UIScrollView) contentOffset valores para encontrar donde el usuario se desplaza actualmente.
  • Agregar la nueva fila en la parte superior, con animated:NO
  • actualización de la tableView 's contentOffset a estar donde el usuario estaba en más lo que la altura de la fila es.

Cómo evitar causar problemas si esto ocurre cuando el usuario está arrastrando:

  • un seguimiento de cuándo el usuario está arrastrando, y si desea insertar filas durante un lastre/movimiento, añadirlos a una cola que se ejecuta después de que el usuario lance.
+1

Algo me dice que esto debe rodearse de [tableView beginUpdates] y [tableView endUpdates] para que funcionen a la perfección. ¿Estoy en lo correcto? –

+0

No lo creo, aunque ni siquiera he usado esos métodos. Pruébelo sin y vea qué pasa. – Tim

+1

En lugar de utilizar InsertCell, agrega la altura de la celda a su desplazamiento guardado. Al final, recarga los datos y actualiza a la compensación guardada. Ver también: http://stackoverflow.com/questions/4279730/keep-uitableview-static-when-inserting-rows-at-the-top/9121544#9121544 –

2

acaba de publicar una respuesta con fragmentos de código aquí

Keep uitableview static when inserting rows at the top

Básicamente:

  • Guardar el desplazamiento de desplazamiento en el que habría llamado BeginUpdate :.
  • En lugar de llamadas a InsertCell, agrega la altura de la celda al desplazamiento guardado.
  • Donde habría llamado endUpdate :, llame a reloadData, luego desplácese por el desplazamiento guardado sin animación.
6
CGSize beforeContentSize = self.tableView.contentSize; 
      [self.tableView reloadData]; 
      CGSize afterContentSize = self.tableView.contentSize; 

      CGPoint afterContentOffset = self.tableView.contentOffset; 
      CGPoint newContentOffset = CGPointMake(afterContentOffset.x, afterContentOffset.y + afterContentSize.height - beforeContentSize.height); 
      self.tableView.contentOffset = newContentOffset; 
Cuestiones relacionadas