El contenido de UITableView se solapa con la barra de estado cuando UISearchBar está activo

Tengo un UITableViewController con un UISearchBar y UISearchDisplayController. Eso existe dentro de una vista de contenedor en un UIViewController que se encuentra en un UINavigationController. Hice esta image para ayudar a describir la estructura:

introduzca la descripción de la imagen aquí

Esto es lo que realmente parece:

introduzca la descripción de la imagen aquí

Cuando toco la barra de búsqueda, tengo que ocultar la barra de navigation. Normalmente, esto sucedería por sí solo, pero como mi UITableViewController está dentro de una vista de contenedor, tengo que manejar ese cambio yo mismo. Así es como se ve entonces, tenga en count que la barra de estado es blanca porque la barra de navigation es blanca, aunque está oculta en este momento.

introduzca la descripción de la imagen aquí

Una vez que empiezo a escribir un text de búsqueda, aparecen los resultados. Si desploop esos resultados hacia arriba, pasan por debajo de la barra de búsqueda, pero superponen la barra de estado, que es muy poco atractiva.

introduzca la descripción de la imagen aquí

Si Container View no está involucrado, entonces todo funciona según lo previsto y el contenido de la tabla pasa por debajo de la barra de estado, pero con el ContainerView implicado, el text de la tabla y la barra de estado colisionan.

¿Cómo consigo que el text viaje bajo la barra de estado como es normal?

He buscado esto durante horas y mi resultado final fue poner esta línea en viewDidLoad: self.extendedLayoutIncludesOpaqueBars = YES;

Problema resuelto 🙂

Intente configurar definesPresentationContext en viewDidLoad de su TableViewController

Rápido

 override func viewDidLoad() { super.viewDidLoad() definesPresentationContext = true } 

C objective

 - (void)viewDidLoad { [super viewDidLoad]; self.definesPresentationContext = YES; } 

Esto es lo que funcionó para mí:

HACER:

  • Use UISearchController (no un UISearchBar colocado por separado)
  • Coloque su VC en un UINavigationController si aún no lo está. Establezca el browser no en "Mostrar barra de navigation" si lo desea.
  • Utilice la reproducción automática para UITableView (no resortes y puntales) y coloque la parte superior de la tabla en la parte superior de la vista del VC.
  • Agregue este método de delegado:

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

NO:

  • Violín con bordesForExtendedLayout
  • Violín con extendedLayoutIncludesOpaqueBars
  • Violín con el contenido de la tabla

Básicamente esto se debe a la traslucidez de la barra de navigation, por lo general el controller de vista soluciona esa superposition, corrigiendo las inserciones superiores de la vista o subview de propiedad si son (o henetworkingan) de UIScrollView. Tiene 2 opciones, una es establecer la traslucidez de la barra de navigation en no, la otra está configurada en edgeForExtendedLayout a ninguno, o dejar solo en la parte inferior.

 - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller { self.navigationController.navigationBar.translucent = YES; } - (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller { self.navigationController.navigationBar.translucent = NO; } 

Estos consejos funcionan solo en iOS7, si está implementando una verificación de destino inferior antes de configurar esas properties.
De otra manera, pero no probé, podía leerse la longitud --topLayoutGuide y en – searchDisplayControllerWillBeginSearch intente establecer un inicioInsets de la misma longitud. De esta forma, aún debe preservar la translucidez.

Tengo UISearchBar y UISearchDisplayController.

En viewdidload:

 self.edgesForExtendedLayout = UIRectEdgeNone; searchDisplayController.searchBar setBackgroundImage:[self imageWithColor:ETSBaseColor] forBarPosition:0 barMetrics:UIBarMetricsDefault]; 

método que obtiene image de UIColor:

 - (UIImage *)imageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [color CGColor]); CGContextFillRect(context, rect); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

Yo tuve el mismo problema:

 - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller { controller.searchBar.searchBarStyle = UISearchBarStyleDefault; // Used to cover UIStatusBar } - (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller { controller.searchBar.searchBarStyle = UISearchBarStyleMinimal; // Used not to show top and bottom separator lines } 

En mi caso, no quiero ocultar el UINavigationBar, pero tuve problemas similares con huecos y otros efectos secundarios. Uno de ellos era un UISearchBar perdido después de cambiar entre UIViewControllers mientras el UISearchDisplayController está visible (estoy usando SWRevealViewController para cambiar entre UIViewController). Este problema ocurre solo en iPads. Resultó que el UISearchBar se esconde de repente detrás del UINavigationBar. Ahora resolví todos mis problemas con las siguientes líneas de código en el UITableViewController que se presenta en un UIContainerView:

 - (UINavigationController *)navigationController { return nil; } 

Esas líneas evitan que UISearchDisplayController scope y cambie mi UINavigationController. También subclasé este método en la class "MyContainerTableViewController" y uso esta class ahora para todo UITableViewController integrado.

Todavía utilizo UISearchDisplayController para admitir iOS 7.

El siguiente truco me funcionó:

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return (self.searchController.isActive && section == 0) ? 22.0f : 0.0f; }