ios - example - UISearchController searchBar en la tablaHeaderView animando fuera de la pantalla
searchcontroller tutorial (8)
¿Has intentado establecer el hideNavigationBarDuringPresentation en falso? Resolvió mi dolor de cabeza ...
self.searchController.hidesNavigationBarDuringPresentation = false;
Poner la barra de búsqueda en la barra de navegación da una experiencia de usuario más sólida en mi opinión (para el iphone)
self.navigationItem.titleView = self.searchController.searchBar;
Tengo un UISearchController
con un UITableViewController
como UITableViewController
, el UISearchBar
de este searchController
está configurado para estar en el tableHeaderView
de mi tableView
actual que se muestra en mi raíz ViewController. Casi todo está funcionando bien, como se esperaba. Pero en la animación de UISearchBar
(cuando UISearchBar
clic en searchBar y UINavigationBar
oculta y la barra de búsqueda va hacia arriba, como en UISearchDisplayController
) tengo un comportamiento extraño. En lugar de moverse a la posición de UINavigationBar
(y: 0), salta de la pantalla y comienza la animación que muestra el botón cancelar. Traté de mover mi código de instancia a viewDidLoad
lugar de init
, y las cosas son las mismas. Creo que el centro del problema está en el marco de la vista searchResultsController
, pero no estoy seguro de eso (intenté establecer el marco, sin éxito). Todo lo que hago es en código puro.
Aquí está la parte relevante del código:
- (void) viewDidLoad {
[super viewDidLoad];
// search controller setup
self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsController];
self.searchController.delegate = self;
self.searchController.searchResultsUpdater = self;
self.searchController.searchBar.delegate = self;
[self.searchController.searchBar sizeToFit];
self.tableView.tableHeaderView = self.searchController.searchBar;
self.searchController.definesPresentationContext = YES;
}
Y tengo una carga searchResultsController
para searchResultsController
:
- (UITableViewController *)searchResultsController {
if (_searchResultsController == nil) {
_searchResultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
_searchResultsController.tableView.delegate = self;
_searchResultsController.tableView.dataSource = self;
}
return _searchResultsController;
}
He descargado el código de ejemplo de apple, pero usan storyBoards y un xib para UITableViewCell, SearchController funciona perfectamente en el proyecto. ¿Alguien tiene el mismo problema? ¿Cómo puedo arreglar esto? Cualquier solución o sugerencia sería apreciada.
Gracias por la atención.
Añadir
self.extendedLayoutIncludesOpaqueBars = YES;
en el método viewDidLoad
En Swift, prueba:
override func viewDidLoad() {
edgesForExtendedLayout = []
searchController.hidesNavigationBarDuringPresentation = false
// ...
}
En mi caso, searchBar estaba en la tabla HeaderView y no había NavigationBar en la pantalla. Pero SearchBar sigue animando hacia arriba superponiéndose a la barra de estado cuando se activa. La solución para evitar esto fue establecer:
searchController.hidesNavigationBarDuringPresentation = false
Lo cual es extraño porque como dije, el controlador de vista no estaba usando una barra de navegación.
Noté que UISearchController funciona perfectamente en uno de mis puntos de vista, pero no en el otro. El problema fue con UITableViewController y no con UIViewController. Si cambia a un UIViewController con una UITableView dentro y correctamente restringido, no hay problemas. Implementé el mío con un XIB y funcionó perfectamente.
Para aclarar esto, la respuesta de Lorenzo funcionó para mí.
self.definesPresentationContext = YES;
Probar esto:
Primero necesitas delegar el
UISearchControllerDelegate
Para Swift
func willPresentSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.translucent = true
}
func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.translucent = false
}
SWIFT 3.01
func willPresentSearchController(searchController: UISearchController){
self.navigationController?.navigationBar.isTranslucent = true
}
func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.isTranslucent = false
}