iphone - bar - uisearchcontroller ios
UISearchDisplayController cambiando altura de fila (8)
He configurado mi UITableView
fila UITableView
en Interface Builder a 54.0. Tengo un UISearchDisplayController
en esa vista. Cuando el usuario toca la barra de búsqueda en ella, la tabla cambia de tamaño correctamente. Sin embargo, cuando comienzan a escribir (y en realidad hacen la búsqueda), la altura de la fila disminuye. Permanece mal hasta que la búsqueda toca Cancelar .
No pude encontrar documentación sobre este comportamiento en el sitio de Apple.
He intentado establecer el alto de fila en UISearchDisplayDelegate
delegate calls. Este podría ser el enfoque correcto, pero no conozco los detalles y no pude hacerlo funcionar.
También he intentado implementar - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
. Esto funcionó, pero tengo miles de entradas en esta lista y no puedo soportar el impacto de rendimiento.
¿Cuál es la manera correcta de arreglar esto?
¡Lo encontré!
Suponiendo que la tabla se almacena en tableView
:
- (void)viewDidLoad;
{
[super viewDidLoad];
self.searchDisplayController.searchResultsTableView.rowHeight = tableView.rowHeight;
}
Nada más es necesario.
Edición: ver la respuesta de Netmikey para una mejor solución.
Anular el método didLoadSearchResultsTableView debería hacer el truco.
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView {
tableView.rowHeight = 82.0; // Change height of search result row
}
Más explicación de este blog.
En viewDidLoad:
puede configurar el delegado del controlador de visualización de búsqueda a sí mismo:
- (void)viewDidLoad
{
self.searchDisplayController.delegate = self;
}
Luego, implemente el delegado de vista de tabla en su controlador de vista:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (tableview == self.searchDisplayController.tableView) {
return 55;
} else if (tableView == self.tableView) {
return 44;
}
}
He estado usando ios 7.0 y Xcode 5.0. Creo que deberías cambiar la altura de tu fila en este método:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
if (tableView == self.searchDisplayController.searchResultsTableView)
{
tableView.rowHeight = ...;// change your row height here!
return [self.searchResults count];
}
else
{
...
return ...;
}
}
Debido a que cada vez que una vista de tabla intenta mostrar su diseño, se llama a este método, por lo que cada vez que escribe una letra en la barra de búsqueda, se llama a este método y la altura de la fila no tendrá oportunidad de cambiar.
La forma correcta de hacer esto es usar el siguiente delegado.
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
tableView.rowHeight = 54.0f; // or some other height
}
Se llama cuando se crea o muestra el UITableView
.
Si por casualidad llama a searchDisplayController.searchResultsTableView
en otro código cuando no se está realizando una búsqueda, se creará el UITableView por adelantado. Si usa el método de delegado willShow
para configurar rowHeight
, se perderá el tiempo (por algún motivo) para cambiar rowHeight si se ha creado tableView de antemano.
Necesitas configurar ambos
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 54.;
}
y
self.tableView.rowHeight = 54.;
también en su UISearchDisplayDelegate
- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
tableView.rowHeight = 54.;
}
De lo contrario, cuando se produjo "No Result" en la búsqueda, la altura de la celda volverá a su valor predeterminado.
Ninguna de las soluciones funcionó para mí ...
Hice mi propio éxito y prueba ... y lo hice funcionar ...
Si desea diferentes alturas de fila para vistas de tabla normales y de búsqueda ...
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
// for normal results
if (tableView==self.tableView) return 54;
// for search results
else return 54; }
Y si quieres altura común ...
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 54; }
PD: tenga en cuenta que, si tiene la misma altura de fila para cada fila, este método no es muy eficiente en cuanto al uso de recursos, ya que la altura de la fila se vuelve a calcular para cada celda ... Aunque esto no se nota en la mayoría de los casos, ¡Todavía estoy buscando una mejor solución!
Steve, tu solución no funcionó para mí: la primera vez que el resultado de la búsqueda se mostraría bien, pero cuando un usuario presionaba "Cancelar" (cerrando la barra de búsqueda) y luego lo volvía a abrir e ingresaba un término de búsqueda, el La altura estaría mal de nuevo.
La solución de DigDog de usar searchDisplayController:didShowSearchResultsTableView
estaba funcionando, pero los usuarios vieron la altura de la celda "saltando" cuando comenzó la búsqueda.
La solución que encontré, que solucionó ambos problemas, está usando:
- (void)searchDisplayController: (UISearchDisplayController *)controller
willShowSearchResultsTableView: (UITableView *)searchTableView {
searchTableView.rowHeight = myTableView.rowHeight;
}
... en el UISearchDisplayDelegate
.
Saludos, Netmikey