2009-08-23 21 views
5

Tengo una subclase de UITableViewController. Tengo un código que puede agregar/eliminar un UISearchBar a/desde el tableHeaderView de mi tableView. Aquí está el código que tengo para llevar a cabo estas tareas:Animación de agregar/quitar UISearchBar a/desde UITableView tableViewHeader

self.tableView.tableHeaderView = uiSearchBar; //Make the search bar appear 
self.tableView.tableHeaderView = nil; //Make the search bar disappear 

El problema es que quiero que la adición/eliminación de la UISearchBar ser animado; deslízate hacia la vista desde la parte superior cuando lo agregue, luego deslízate hacia arriba y fuera de la vista cuando lo elimine en lugar de simplemente aparecer y desaparecer. ¿Alguna sugerencia?

Gracias.

Respuesta

7

Finalmente pude resolver esto. Resultó ser bastante simple. En lugar de agregar UISearchBar al encabezado de la tabla, lo inserto en la primera celda de la tabla con la animación UITableViewRowAnimationTop y lo elimino usando el mismo método. Esto hace que la barra se deslice hacia adentro y hacia afuera desde la parte superior. Aquí está el código que hace que la barra aparezca:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
[self.baseUiTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop]; 
[self.baseUiTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

Y aquí está el código que elimina la barra de búsqueda:

[uiSearchBar resignFirstResponder]; 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
[self.baseUiTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop]; 
+0

¿Este enfoque tendrá algún impacto en el índice de fila seleccionado al manejar interacciones de celda? –

0

Intente hacer que su vista de tabla se mueva en espiral, para que solo la fila debajo de la barra de búsqueda esté visible, luego quite la barra de búsqueda y desplácese a la misma fila sin animación.

4

Una manera mucho más simple que también es adecuado para UITableViewStyleGrouped (más no lo hace requerir cambiar el número de filas) se para animar la contentInset de la tabla:

CGFloat h = uiSearchBar.bounds.size.height; 
UITableView *tv = self.tableView; 
if (tv.tableHeaderView) 
{ // hide bar 
    [UIView animateWithDuration:0.3 animations:^{ 
     tv.contentInset = UIEdgeInsetsMake(-h, 0, 0, 0); 
    } completion:^(BOOL finished) { 
     tv.contentInset = UIEdgeInsetsZero; 
     tv.tableHeaderView = nil; 
     [tv scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
    }]; 
} 
else 
{ // show bar 
    uiSearchBar.frame = CGRectMake(0, -h, tv.frame.size.width, h); 
    [UIView animateWithDuration:0.3 animations:^{ 
     [tv scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
     tv.tableHeaderView = uiSearchBar; 
    }]; 
} 

sé que esto es tres años después de la OP hizo la pregunta, pero ya que este es ag Una buena alternativa para lograr el efecto deseado, pensé que podría ser útil para otros que enfrentan el mismo problema.

+1

detectar un error ... ¿O estoy equivocado? 'tv.size.width' tiene que ser' tv.frame.size.width' y tal vez 'tv.size.height' necesite una reducción a, por ejemplo, 44.0f o simplemente h. – microspino

+0

¡De hecho! +1 para detectar esto. Gracias. Lo he arreglado en el código de arriba. –

+0

Esto funciona perfectamente para mí, sin embargo, estoy tratando de entender cómo funciona la parte "mostrar" de esto ... ¿por qué hace que el cuadro sea animado? ¿Se debe a que cuando agrega la barra a la vista de tabla, establece el origen del marco de la barra y en 0, lo que hace que se anime desde -h? – Marcin

Cuestiones relacionadas