custom - ¿Cómo uso UISearchController en iOS 8 donde UISearchBar está en mi barra de navegación y tiene botones de alcance?
search bar swift 4 example (1)
Te encuentras con un "problema de diseño" donde se espera que el scopeBar
esté oculto cuando searchController
no está activo.
Los botones de la barra de alcance aparecen detrás (debajo) de la barra de búsqueda, ya que esa es su ubicación cuando la barra de búsqueda se activa y se anima en la barra de navegación.
Cuando la búsqueda no está activa, una barra de alcance visible ocupará espacio en la pantalla, distraerá el contenido y confundirá al usuario (ya que los botones de alcance no tienen resultados para filtrar).
Dado que su searchBar
ya se encuentra en titleView, la animación de barra (de navegación y búsqueda) que revela la barra de alcance no se produce.
- La opción más fácil es ubicar la barra de búsqueda debajo de la barra de navegación, y dejar que la barra de búsqueda se
searchBar
en el área del título. La barra de navegación animará su altura, dejando espacio para incluir la barra de alcance que estaba oculta. Todo esto será manejado por el controlador de búsqueda. La segunda opción, casi tan fácil, es utilizar un ícono de botón de la barra de búsqueda , que animará la
searchBar
y elscopeBar
hacia abajo a la vista sobre la barra de navegación.- (IBAction)searchButtonClicked:(UIBarButtonItem *)__unused sender { self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; self.searchController.searchResultsUpdater = self; self.searchController.hidesNavigationBarDuringPresentation = NO; self.searchController.dimsBackgroundDuringPresentation = NO; self.definesPresentationContext = YES; self.searchController.searchBar.scopeButtonTitles = @[@"Posts", @"Users", @"Subreddits"]; [self presentViewController:self.searchController animated:YES completion:nil]; }
Si desea que la
searchBar
desearchBar
permanezca en titleView, no se incluye una animación para hacer lo que desea. Deberá desplegar su propio código para manejar el cambio de altura de la barra de navegación y mostrar su propia barra de alcance (o enganchar en el interior) y animar elscopeBar
y hacia la vista).Si es afortunado, alguien más ha escrito el código
willPresentSearchController:
para manejar la transición que desea.Si desea ver siempre una
searchBar
yscopeBar
, probablemente tendrá quescopeBar
usando elscopeBar
y reemplazarlo con unUISegmentedControl
que el usuario siempre verá, incluso cuando el controlador de búsqueda no esté activo.
Actualizar:
Esta respuesta sugirió la subclasificación de UISearchController
para cambiar la altura de la barra de búsqueda.
UISearchController
utilizar el nuevo UISearchController
de iOS 8 e incrustar su UISearchBar
en mi UINavigationBar
. Eso se hace fácilmente de la siguiente manera:
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.delegate = self
searchController.searchBar.delegate = self
searchController.dimsBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = false
navigationItem.titleView = searchController.searchBar
Pero cuando agrego los botones de alcance:
searchController.searchBar.showsScopeBar = true
searchController.searchBar.scopeButtonTitles = ["Posts, Users, Subreddits"]
Agrega los botones detrás de UISearchBar
y obviamente se ve muy extraño.
¿Cómo debería estar haciendo esto?