tutorial searchcontroller bar ios uitableview uisearchbar uisearchdisplaycontroller uicontainerview

ios - searchcontroller - El contenido de UITableView se superpone a la barra de estado cuando UISearchBar está activo



uisearchcontroller tableview (8)

Básicamente, esto se debe a la traslucidez de la barra de navegación; por lo general, el controlador de vista repara esa superposición, corrigiendo las inserciones superiores de la vista o subvista propia si son (o heredan) de UIScrollView. Usted tiene 2 opciones, una es establecer la traslucidez de la barra de navegación a no, la otra está configurada como edgeForExtendedLayout para que nada o solo edgeForExtendedLayout abajo.

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

Estos consejos solo funcionan en iOS7, si está implementando en una comprobación de objetivo inferior antes de configurar esas propiedades.
Otra forma, pero no probé, podría leerse la longitud de " --topLayoutGuide y en " searchDisplayControllerWillBeginSearch intentar establecer un TopInset de la misma longitud. De esta forma, aún deberías preservar la translucidez.

Tengo un UITableViewController con UISearchBar y UISearchDisplayController. Eso existe dentro de una Vista de contenedor en un UIViewController que está en un UINavigationController. Hice esta imagen para ayudar a describir la estructura:

Esto es lo que realmente se ve:

Cuando toco la barra de búsqueda, tengo que ocultar la barra de navegación. Normalmente, esto sucedería por sí mismo, pero como mi UITableViewController está dentro de una Vista de Contenedor, tengo que encargarme yo mismo. Así es como se ve entonces, tenga en cuenta que la barra de estado es blanca porque la barra de navegación es blanca, aunque esté oculta en este momento.

Una vez que empiezo a escribir en algún texto de búsqueda, aparecen los resultados. Si desplazo esos resultados hacia arriba, pasan debajo de la barra de búsqueda, pero se superponen a la barra de estado, que es muy poco atractivo.

Si la Vista del contenedor no está involucrada, entonces todo esto funciona según lo previsto y el contenido de la tabla pasa por debajo de la Barra de estado, pero con el ContainerView involucrado, el texto de la tabla y la barra de estado colisionan.

¿Cómo hago para que el texto viaje bajo la barra de estado de forma normal?


El siguiente truco funcionó para mí:

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


En mi caso, no quiero ocultar el UINavigationBar, pero tuve problemas similares con los boquetes y otros efectos secundarios. Uno de ellos era una UISearchBar faltante 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 UISearchBar de repente se esconde detrás de 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 alcance y cambie mi UINavigationController. También subclasé este método en la clase "MyContainerTableViewController" y ahora uso esta clase para todo UITableViewController incorporado.

Todavía estoy usando UISearchDisplayController para soportar iOS 7.


Esto es lo que funcionó para mí:

HACER:

  • Use UISearchController (no UISearchBar colocado por separado)
  • Coloque su VC en un UINavigationController si aún no lo está. Configure el navegador como "Mostrar barra de navegación" si lo desea.
  • Utilice el ajuste automático para UITableView (no resortes ni puntales) y fije la parte superior de la tabla en la parte superior de la vista del CV.
  • Agrega este método delegado:

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

NO HACER:

  • Violín con bordes para ExtenderDisposición
  • Fiddle con extendedLayoutIncludesOpaqueBars
  • Fiddle con el contenido de la tablaInset

Intente configurar definesPresentationContext en viewDidLoad de su TableViewController

Rápido

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

C objetivo

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


Tengo UISearchBar y UISearchDisplayController.

En viewdidload:

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

método que obtiene la imagen 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 }


Lo busqué durante horas y mi resultado final fue poner esta línea en viewDidLoad: self.extendedLayoutIncludesOpaqueBars = YES;

Problema resuelto :)