Mostrar barra de búsqueda en la barra de navegación sin desplazarse en iOS 11

80

Estoy adjuntando un UISearchController a la navigationItem.searchControllerpropiedad de un UITableViewController en iOS 11. Esto funciona bien: puedo usar la bonita barra de búsqueda estilo iOS 11.

Sin embargo, me gustaría que la barra de búsqueda sea visible en el lanzamiento. De forma predeterminada, el usuario tiene que desplazarse hacia arriba en la vista de tabla para ver la barra de búsqueda. ¿Alguien sabe cómo es esto posible?

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Izquierda: situación predeterminada después del lanzamiento. Derecha: barra de búsqueda visible (desplazándose hacia arriba). Me gustaría tener la barra de búsqueda visible después del lanzamiento, como en la captura de pantalla de la derecha.

Ya descubrí que la barra de búsqueda se puede hacer visible estableciendo la propiedad hidesSearchBarWhenScrollingde mi elemento de navegación en falso. Sin embargo, esto hace que la barra de búsqueda esté siempre visible, incluso cuando se desplaza hacia abajo, que no es lo que quiero.

Jonathan
fuente
en donde agregó el códigohidesSearchBarWhenScrolling
Anbu.Karthik
1
¿qué hay de establecerlo como s firstResponder?
Milán Nosáľ
2
La respuesta seleccionada a continuación funciona para mí en la carga, pero también me gustaría volver a mostrar el controlador de búsqueda cuando me desplazo programáticamente hacia la parte superior con scrollView.setContentOffset(_:animated). ¿Alguien tiene una sugerencia?
Justin Vallely
@Jonathan hidesSearchBarWhenScrolling = falsecoloca la barra de búsqueda sobre un título grande en iOS 13. ¿Alguna idea de si puedo actualizar esto de alguna manera?
Bonnke

Respuestas:

187

Lo siguiente hace que la barra de búsqueda sea visible al principio, luego permite que se oculte al desplazarse:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = true
    }
}

El uso isActiveno hizo lo que quería, activa la barra de búsqueda (mostrando el botón de cancelar, etc.), cuando todo lo que quiero es que sea visible.

Jordan Wood
fuente
Gracias, funcionó para mí. Aunque una solución interesante :)
Mikrasya
9
Esta solución funciona, pero hay efectos secundarios si también está mostrando una barra de navegación si estaba previamente oculta (es decir, empujando esta vista con la barra de búsqueda en la pila de navegación) La barra de búsqueda aparecerá estática en su lugar mientras la barra de navegación se anima. Se ve horrible :(
Matthew Crenshaw
12
No si pones la primera parte en viewDidLoadlugar deviewWillAppear
Marc-Alexandre Bérubé
1
¿Alguien puede explicar por qué esto funciona y por qué searchController.searchBar.isHidden = falseen viewDidLoad no? Esto último me parece mucho más lógico
pho_pho
5
Esto causa un error visual en iOS 13 al volver de la pantalla secundaria.
nemissm
5

Puede establecer la propiedad isActiveen truedespués de agregar el controlador de búsqueda a navigationItem.

Así:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}
txaidw
fuente
Sin método de establecimiento 'setIsActive:'
Nikolay Krasnov
Tienes razón, @NikolayKrasnov. isActivees un booleano de solo lectura. En su lugar, querrá usar searchController.active = true.
Mark Jeschke
2

Para mí funcionó después de agregar las siguientes líneas en el viewDidLoad()método:

navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()
rohit
fuente
0

En iOS 13, la respuesta de @Jordan Wood no funcionó. En cambio lo hice:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIView.performWithoutAnimation {
        searchController.isActive = true
        searchController.isActive = false
    }
}
GaétanZ
fuente