2012-06-05 15 views
12

Me gustaría poder fijar la posición de ciertas filas en una UITableView mientras el usuario se desplaza.UITableView: cómo mantener fijas las filas de la tabla a medida que el usuario se desplaza

Específicamente, tengo una tabla en la que ciertas filas son "encabezados" para las filas que siguen, y me gustaría que el encabezado permanezca en la parte superior de la pantalla mientras el usuario se desplaza hacia arriba. Luego se movería fuera del camino cuando el usuario se desplaza lo suficiente como para que la siguiente fila de encabezado ocupe su lugar.

Un ejemplo similar sería la aplicación Any.DO. Las filas de la tabla "Hoy", "Momento" y "Más tarde" siempre están visibles en la pantalla.

¿Alguien tiene alguna sugerencia sobre cómo esto podría implementarse?

Actualmente estoy pensando en seguir al delegado TableDidScroll y ubicar mi propia celda en el lugar apropiado al frente de la vista de tabla. El problema es que en otras ocasiones realmente me gustaría que estas celdas sean celdas de tabla reales para que, por ejemplo, el usuario pueda reordenarlas.

Gracias,

Tim

+1

¿Por qué no utilizar encabezados UITableView? Puede poner texto allí o hacer una vista personalizada. Hay metodos de UITableViewDelegate para eso – Novarg

Respuesta

13

He estado jugando con esto y he encontrado una solución simple.

Primero, agregamos una sola propiedad UITableViewCell al controlador. Esto debe inicializarse de manera que se vea exactamente como las celdas de fila que usaremos para crear los encabezados de sección falsa.

A continuación, interceptar el desplazamiento de la vista de tabla

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    // Add some logic here to determine the section header. For example, use 
    // indexPathsForVisibleRows to get the visible index paths, from which you 
    // should be able to get the table view row that corresponds to the current 
    // section header. How this works will be implementation dependent. 
    // 
    // If the current section header has changed since the pervious scroll request 
    // (because a new one should now be at the top of the screen) then you should 
    // update the contents. 

    IndexPath *indexPathOfCurrentHeaderCell = ... // Depends on implementation 
    UITableViewCell *headerCell = [self.tableView cellForRowAtIndexPath:indexPathOfCurrentHeaderCell]; 

    // If it exists then it's on screen. Hide our false header 

    if (headerCell) 
     self.cellHeader.hidden = true; 

    // If it doesn't exist (not on screen) or if it's partially scrolled off the top, 
    // position our false header at the top of the screen 

    if (!headerCell || headerCell.frame.origin.y < self.tableView.contentOffset.y) 
    { 
     self.cellHeader.hidden = NO; 
     self.cellHeader.frame = CGRectMake(0, self.tableView.contentOffset.y, self.cellHeader.frame.size.width, self.cellHeader.frame.size.height); 
    } 

    // Make sure it's on top of all other cells 

    [self.tableView bringSubviewToFront:self.cellHeader]; 
} 

Por último, tenemos que interceptar acciones en esa celda y hacer lo correcto ...

+0

Muchas gracias, tarmes. Estoy buscando algo similar y también necesito implementar tu lógica en mi aplicación. Sin embargo, no pude entender ¿a qué se refiere el título? ¿Y cuando quieres decir que el headerCell está en la pantalla? – Hai

+0

El headerCell es la celda en la vista de tabla que desea permanecer en la parte superior de la tabla a medida que se desplaza. – tarmes

+0

Pregunta: Usted dice que usa esto para poder reordenar los encabezados. ¿Colapsa las celdas de contenido para facilitar el reordenamiento del encabezado?Estaba pensando en ello, pero no estoy seguro si es posible, ya que 'reloadData' u otro tipo de actualización de vista de tabla probablemente interrumpiría/revertiría la celda del encabezado flotante. – Ixx

2

Ese es el comportamiento por defecto para los encabezados de sección en la llanura UITableView casos. Si desea crear un encabezado personalizado, implemente el método tableView:viewForHeaderInSection: en su delegado de la vista de tabla y devuelva la vista para su encabezado.

Aunque tendrá que administrar secciones y filas en lugar de solo filas.

+0

El problema es que me gustaría poder grabar los encabezados de las secciones. Por lo que puedo decir, no hay una interfaz de usuario que le permita al usuario hacer eso de la misma manera en que pueden arrastrar las filas de la sección sobre ... – tarmes

+0

Veo, usted tendrá que manejar eso usted mismo. Parece un poco complicado, pero estoy seguro de que se puede hacer. Parece que no hay nada implementado por ahí. Quizás pueda ayudarte con eso y podamos ponerlo en Github o algo así. –

+0

Curiosamente, ahora hay un moveSection: toSection: llame en iOS5, pero no creo que haya una forma de iniciar este movimiento desde la interfaz de usuario ... – tarmes

Cuestiones relacionadas