delegate bar uisearchbar ios7 overlap uistatusbar

uisearchbar - bar - search controller ios



UISearchBar se superpone a la barra de estado en iOS (6)

Luchó alrededor con este problema también. Debe poner esto en el método ViewDidLoad de ViewControllers.

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { self.edgesForExtendedLayout = UIRectEdgeNone; }

Esto debería arreglarlo. También se indica en la Guía de transición de iOS 7. https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1

Yo (como todos los demás aquí) me encuentro con el mismo problema de superposición de la barra de estado que todos los demás, con un pequeño giro, y es por eso que abro una nueva pregunta sobre esto.

Parece que hay algún mecanismo que le permite a UISearchBar saber dónde ubicarse, que está totalmente fuera de control.

La respuesta de Jaredsinclair aquí (¿la barra de estado de iOS 7 vuelve al estilo predeterminado de iOS 6 en la aplicación de iPhone? ), explica con gran detalle cómo los ingenieros de Apple nos permiten introducir la lógica en nuestra aplicación para mezclarnos tanto como sea posible con el entorno del usuario.

Pasé por el proceso de examinar cuidadosamente cada controlador UIViewController en mi aplicación y hacer la menor modificación posible.

En la mayoría de los casos, pude resolver el problema utilizando el código a continuación que encontré en varias respuestas SO

// Do any additional setup after loading the view. if ([self respondsToSelector:@selector(edgesForExtendedLayout)]){ self.edgesForExtendedLayout = UIRectEdgeNone; }

Sin embargo, esto no funcionaría sin importar lo que haga en una vista particular donde la barra UINavigation está oculta.

Basándome en la solución encontrada en SO, pude resolver este problema agregando la siguiente lógica a este UIViewController particular

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; viewFrame.origin.y = viewFrame.origin.y+statusBarFrame.size.height; }

Esto empuja el UIViewController n píxeles hacia abajo "dependiendo" de la altura de la barra de estado.

El efecto de esto se muestra aquí.

El problema es que cuando ingreso al campo de búsqueda, UISearchBar agrega por sí mismo un relleno de 20px en la parte superior, que compensa la IU completa.

Esto me lleva a la conclusión de que UISearchBar intenta ajustarse y, por coincidencia, se ajusta exactamente la misma cantidad que la altura de la barra de estado.

Si no hackeo la posición, una vez que entro en el campo de búsqueda, este ajuste automático alinea la Barra de UIS por debajo de la barra de estado.

Espero haber detallado mi confusión, me pregunto si alguien tiene alguna idea para una solución.


No tengo muy claro en qué parte la barra de búsqueda ajusta su propia altura. ¿Mis barras de búsqueda no hacen eso? Pero.

Puede agregar una restricción a la Guía de diseño superior en IB, para la barra de búsqueda. Esto hará que se pegue a la parte inferior de la barra de estado tanto en ios 6 como en ios 7. Si luego elimina el código en el que ajusta manualmente la altura de la barra de estado. Eso debería cuidar de él. Puede ver un ejemplo de cómo hacerlo aquí: https://developer.apple.com/library/ios/qa/qa1797/_index.html


Obtuve exactamente el mismo problema y en base a sugerencias como @ Ben''s y here terminé agregando el siguiente código que me ayudó:

- (void) viewDidLayoutSubviews { if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { CGRect viewBounds = self.view.bounds; CGFloat topBarOffset = self.topLayoutGuide.length; viewBounds.origin.y = topBarOffset * -1; self.view.bounds = viewBounds; self.edgesForExtendedLayout = UIRectEdgeNone; } }

alternativamente este código también funciona

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { self.automaticallyAdjustsScrollViewInsets=YES; self.edgesForExtendedLayout = UIRectEdgeNone; self.navigationController.view.backgroundColor = [UIColor whiteColor]; self.navigationController.navigationBar.translucent = YES; }


Si alguien quiere resolver este problema a través de AutoLayout, en lugar de agregar una restricción searchBar.top = self.view.top agregue una restricción a topLayoutGuide, así:

searchBar.top = topLayoutGuide.bottom


Si la barra de navegación está visible, haga lo siguiente en ViewDidLoad:

self.edgesForExtendedLayout = UIRectEdgeNone;

Si la barra de navegación está oculta, haga lo siguiente en ViewDidLoad:

Ajusta todos los elementos UIView moviéndolos 20 puntos


UISearchBar tiene un método de delegado para lo que desea. Solo colócalo 20px de arriba.

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar { return UIBarPositionTopAttached; }

Desafortunadamente, no funciona junto con un UISearchDisplayController.