UISearchBar presentado por UISearchController en la vista de encabezado de tabla se anima demasiado cuando está activo

Estoy usando UISearchController para presentar una barra de búsqueda dentro de la vista de encabezado de una tabla vista:

... self.searchController.hidesNavigationBarDuringPresentation = NO; self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar; [self.searchController.searchBar sizeToFit]; self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar; 

(donde es necesario establecer la propiedad tableHeaderView dos veces, de lo contrario, la vista del encabezado se superpone a la primera fila, cf un par de respuestas en SO )

Así es como se ve, perfectamente en posición cuando está inactivo: Barra de búsqueda inactiva en la posición correcta

La barra de búsqueda debería permanecer en su lugar cuando esté activa: no quiero que se mueva hacia arriba para ocultar la barra de navegación. Pero inesperadamente se anima hacia abajo, dejando un espacio en blanco entre él y la barra de navegación:

Captura de pantalla que muestra la barra de búsqueda animada demasiado abajo

Aquí hay un video de la extraña barra de búsqueda de animación

Si utilizo una barra de búsqueda por separado de UISearchController, no muestra el mismo comportamiento cuando se activa.

En mi controlador de vista de presentación, tengo self.definesPresentationContext = YES; y self.navigationController.navigationBar.translucent = YES; , y en IB ninguno de los recuadros de “extender bordes” está activo (todos parecían ser cosas posibles que podían descartar la presentación de búsqueda, al leer).

¿Alguien sabe cómo puedo detener la animación de la barra de búsqueda?

Ok, así que finalmente descubrí una solución para mí. Aunque es más que probable que tengamos otras cosas en nuestro código / guión gráfico (es por eso que esta es una pregunta difícil de responder), la mayor parte seguí el tutorial de Apple en UISearchController: ( https://developer.apple.com/library/ ios / samplecode / TableSearch_UISearchController / Introduction / Intro.html )

Casi todo mi código es idéntico al suyo, pero no pude hacer que la barra de búsqueda no saltara al hacer clic dentro de él. Entonces, lo que hice fue verificar “debajo de barras opacas” tanto para la vista de tabla original como para la vista de tabla de resultados de búsqueda en mi guión gráfico. Eso hizo que la barra de búsqueda dejara de saltar.

Pero hubo un último problema, que fue el hecho de que la primera fila de la vista de tabla de resultados estaba oculta por la barra de búsqueda. Para arreglar eso, agregué self.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0); al método viewDidLoad de la vista de tabla de resultados. Voila!

Una pregunta anterior, pero pude resolver este problema estableciendo

self.extendedLayoutIncludesOpaqueBars = YES;

en mi controlador de vista. Creo que el problema se debe a que tiene una barra de navegación opaca pero establece hidesNavigationBarDuringPresentation en NO en su controlador de búsqueda, lo que hace que la barra de búsqueda se coloque incorrectamente cuando se enfoca.

Pude evitar que UISearchBar hacia abajo eliminando la siguiente línea de mi ViewController: self.definesPresentationContext = YES;

definePresentationContext = true

 override func viewDidLoad() { super.viewDidLoad() searchController = UISearchController(searchResultsController: nil) searchController.searchResultsUpdater = self searchController.hidesNavigationBarDuringPresentation = false searchController.dimsBackgroundDuringPresentation = true searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent self.tableView.tableHeaderView = searchController.searchBar definesPresentationContext = true 

Mi turno. También tuve este problema cuando seguí el código de muestra WWDC.

Me di cuenta de que si no establecía la propiedad scopeButtonTitles de searchBar, la barra de búsqueda no estaría visible. Tras una inspección más cercana, solo tenía un marco de CGRectZero. Esto significa que establecer el scopeButtonTitles establece el marco detrás de las escenas. Entonces, si no desea mostrar ningún scopeButtonTitles, pero aún desea no tener que codificar el UISearchBar a una altura específica, establezca los scopeButtonTitles en una matriz vacía.

 self.searchController = UISearchController(searchResultsController: nil) self.searchController.searchResultsUpdater = self self.searchController.searchBar.scopeButtonTitles = [] self.tableView.tableHeaderView = self.searchController.searchBar 

Al establecer scopeButtonTitles en una matriz de 1 cadena, no se mostrarán los títulos de los botones de scope, pero aún se tendrá lógica para manejar la vista, lo que esencialmente arruinará el diseño.

Apoyos para el equipo de QA de Apple (aplicable a iOS 8)

Corrí a este problema recientemente y ninguna de las soluciones funcionó para mí. Tal vez porque mi interfaz de usuario es más compleja (Mi vista de tabla con los soportes de búsqueda que figuran en UITabController dentro de un UiNavigationController) de todos modos, ninguno de los trabajadores anteriores. Simplemente pude resolver mi problema con esta pieza de código que encontré en: UISearchController, que no redistribuye la barra de navegación en rotación

 - (UIBarPosition)positionForBar:(id)bar { if (bar == searchController.searchBar) { return UIBarPositionTopAttached; } else { // Handle other cases return UIBarPositionAny; } } 

Una cosa más para agregar: después de configurar toda la jerarquía de mi controlador para que se extienda debajo de las barras opacas y superiores, mi barra de búsqueda comenzó a aparecer oculta debajo de la barra de navegación y habría aparecido justo después de que ocurriera una rotación. eso fue una señal para mí de que hay algún error de diseño y algo de información, pero mi diseño no era correcto. ¡Este método de delegado ayuda a mi controlador a comprender la situación de la barra de búsqueda de otro modo nómada!

¡Lo encontré! Esta parece ser la línea ofensiva en viewDidLoad de la presentación de vc:

 self.edgesForExtendedLayout = UIRectEdgeNone; 

Se eliminó eso y la barra de búsqueda se mantuvo en su lugar como se predijo.

desmarcar Ajustar Intributos de Vista de Desplazamiento

y

revisando debajo de las barras superiores

Solucionado mi problema enter image description here

para iOS 11 y swift 4, configure la línea siguiente en viewController resolvió mi problema (searchBar jump down):

 self.edgesForExtendedLayout = .bottom 

Supongo que estableces UISearchBar frame.original.y = 64

hay el código

 if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { [self setEdgesForExtendedLayout:UIRectEdgeNone]; } searchBar.frame = CGRectMake(0, 0, 376, 44); 

el lavado puede ayudarte

En mi caso, estableciendo la barra de navegación en self.navigationController.navigationBar.translucent = NO; arregló el problema Parece que la capa de presentación de la barra de búsqueda no tiene en cuenta la translucidez de la barra de navegación cuando se establece la barra de búsqueda.

Me doy cuenta de que esta no es una solución perfecta, porque la translucidez de la barra de navegación puede deshacerse del diseño en otra parte, pero al menos soluciona el problema en el caso de que una barra de navegación no translúcida sea una posibilidad.

Como se mencionó en la primera publicación, todos necesitaban una solución diferente. Entonces aquí está el mío. Tuve que combinar dos cosas mencionadas en esta página, a saber:

Swift 2:

  navigationController?.navigationBar.translucent = true edgesForExtendedLayout = .None 

es muy simple simplemente haz clipsToBounds = verdadero de la vista de encabezado de la vista de tabla en la barra de búsqueda de brujas.

 countryTableView.tableHeaderView?.clipsToBounds = true 

Si usa UINavigationController y TabBar no puede usar:

 self.extendedLayoutIncludesOpaqueBars = true 

Necesitaría esta solución: https://stackoverflow.com/a/46151063/3369381