Uso de UISearchController con UISearchBar en tableHeaderView en iOS11
¿Alguien ha retenido con éxito unUISearchBar
en untableHeaderView
de unUITableView
en ios11? Por lo general, surgen problemas con el iPhone X en horizontal:
Apple recomienda usar el nuevosearchController
propiedad:
if (@available(iOS 11.0, *)) {
self.navigationItem.searchController = self.searchController;
self.navigationItem.hidesSearchBarWhenScrolling = NO;
} else {
self.tableView.tableHeaderView = self.searchController.searchBar;
}
Sin embargo, esto no siempre funciona. Aquí hay un ejemplo con código:
Falta iOS11 UISearchBar en UINavigationBar cuando está incrustado en UISplitViewController
Así que tratando de mantener elsearchBar
entableHeaderView
- un primer paso práctico es aplicar las restricciones de diseño automático apropiadas:
if (@available(iOS 11.0, *)) {
UILayoutGuide *guide = self.tableView.safeAreaLayoutGuide;
searchBar.translatesAutoresizingMaskIntoConstraints = NO;
[searchBar.leftAnchor constraintEqualToAnchor:guide.leftAnchor].active = YES;
[searchBar.rightAnchor constraintEqualToAnchor:guide.rightAnchor].active = YES;
}
lossearchBar
se dimensiona correctamente cuando se muestra:
Sin embargo, el problema surge cuando elUISearchBar
Está activado:
Esto parece ser un viejo problema. Existen numerosas preguntas y respuestas de stackoverflow relacionadas con temas como este. En este caso, al inspeccionar la jerarquía de vistas, aparece el ancho delUISearchBar
está configurado incorrectamente Entonces esto se puede corregir:
- (void)didPresentSearchController:(UISearchController *)searchController NS_AVAILABLE_IOS(11_0)
{
if (@available(iOS 11.0, *)) {
CGRect frame = self.searchController.searchBar.frame;
frame.size.width = [self safeWidthAvailable];
self.searchController.searchBar.frame = frame;
}
}
- (CGFloat)safeWidthAvailable
{
CGRect frame = ((AppDelegate *)MyApplication.sharedApplication.delegate).window.frame;
CGFloat width = frame.size.width;
if (@available(iOS 11.0, *)) {
UIEdgeInsets insets = ((AppDelegate *)MyApplication.sharedApplication.delegate).window.safeAreaInsets;
width -= insets.left;
width -= insets.right;
}
return width;
}
Entonces esto funciona:
Hasta que rotas conUISearchController
activo:
Así que de nuevoUISearchController
ha perdidoUISearchBar
.
¿Por qué es tan difícil?
Una solución es guardar la búsqueda, deshabilitarUISearchController
después de una rotación y vuelva a habilitarlo con la búsqueda guardada. Esto funciona, pero no debería ser tan complicado.
¿Alguna sugerencia?