ios - and - UISearchController no funciona correctamente con una barra UINavigation no translĂșcida
uisearchcontroller ios (4)
Actualmente estoy intentando incrustar un UISearchController en mi aplicación. Pero el UISearchBar, que es una propiedad del UISearchController, no se muestra correctamente, si el UINavigationBar no es translúcido. Generalmente, después de tocar la propiedad UISearchBar, UINavigationBar se mueve hacia arriba para dejar espacio para la UISearchBar. Puedes ver el resultado en la siguiente captura de pantalla:
https://www.dropbox.com/s/172k63zr2bhj84t/Normal_behaviour.png?dl=0
Pero si la propiedad "translúcida" de UINavigationBar se establece en "NO", la barra UISearchBar no se muestra correctamente, porque el fondo de la barra de estado permanece transparente, como puede ver en la siguiente captura de pantalla:
https://www.dropbox.com/s/v5cnxoj9ms6976r/Wrong_behaviour.png?dl=0
Para demostrar este comportamiento extraño, he modificado el proyecto de ejemplo proporcionado por Apple:
https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html
Aquí puedes descargar la versión modificada:
https://www.dropbox.com/s/7icfe6kap98g1e8/TableSearchwithUISearchControllerObj-CandSwift_MODIFIED.zip?dl=0
La modificación está en el archivo "APLMainTableViewController.m" línea 33.
Es claramente un error ( rdar://20942583 ).
Mi solución es establecer
self.edgesForExtendedLayout = UIRectEdgeAll;
self.extendedLayoutIncludesOpaqueBars = YES;
Esto le permite mantener la barra de navegación opaca. El inconveniente es que el contenido fluye por debajo de la barra, incluso si no se puede ver, creando algo de sobrecarga.
Si alguien tiene un problema como el oculto no translúcido, la barra de búsqueda puede tener esto:
self.definesPresentationContext = true
Saludos
Todo lo que necesitaba era:
func viewDidLoad() {
extendedLayoutIncludesOpaqueBars = true
}
Una solución para esto es hacer que la barra de estado sea translúcida justo antes de que la búsqueda se active , y eliminar la translucidez cuando la búsqueda se encuentre inactiva .
Puede hacerlo registrando su controlador de vista como un delegado de UISearchController
e implementando los métodos willPresentSearchController
y willDismissSearchController
. Por ejemplo (en Swift
):
Declare su controlador de vista como delegado de UISearchController
:
class MyViewController: UITableViewController, UISearchControllerDelegate
No olvide establecerlo como el delegado, por ejemplo, en viewDidLoad
add:
searchController.delegate = self
Y finalmente:
func willPresentSearchController(searchController: UISearchController) {
navigationController?.navigationBar.translucent = true
}
func willDismissSearchController(searchController: UISearchController) {
navigationController?.navigationBar.translucent = false
}