La barra de búsqueda de iOS 7 UISearchDisplayController se superpone a la barra de estado mientras se busca
uisearchbar ios7 (12)
¿No está utilizando una barra de navegación translúcida? Si es así, esto lo resolverá.
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
self.navigationController.navigationBar.translucent = YES;
}
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
self.navigationController.navigationBar.translucent = NO;
}
Estoy actualizando mi aplicación para iOS 7 y estoy en el proceso de ajustar todas mis vistas para dar cuenta de la nueva barra de estado transparente (mi aplicación aún usará barras de navegación opacas).
Fue relativamente fácil ajustar la barra de estado en cada vista, excepto uno de los principales problemas que estoy teniendo con UISearchBar conectado a UISearchDisplayController en uno de mis controladores de vista.
La barra de búsqueda parece mostrar normalmente, como se muestra a continuación:
Barra de búsqueda http://imageshack.us/a/img163/9128/06vx.png
El problema es que, tan pronto como comienzo a buscar, la barra de navegación desaparece (como debería), pero todo lo demás también se mueve para superponerse a la barra de estado:
Broken Search Bar http://imageshack.us/a/img11/8237/corh.png
Esto no parece funcionar como se esperaba, ya que el oscurecimiento de la pantalla ocurre 20 píxeles debajo de la barra de búsqueda, donde la barra de búsqueda debería finalizar.
¿Hay una solución integrada para esto en iOS 7? Prefiero no tener que ajustar manualmente el marco para cada vista cada vez que el usuario comienza y termina la búsqueda.
¡Gracias!
Creo que tal vez agregar esto a viewDidLoad ayudará:
if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
{
self.edgesForExtendedLayout = UIRectEdgeNone;
}
En mi caso, las vistas debajo de la barra de búsqueda estaban en su lugar correcto, solo la barra de búsqueda se superponía a la barra de estado. En este caso, esta paz de código funciona bien:
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frame = self.searchBar.frame;
frame.origin.y += statusBarFrame.size.height;
self.searchBar.frame = frame;
}
}
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frame = self.searchBar.frame;
frame.origin.y -= statusBarFrame.size.height;
self.searchBar.frame = frame;
}
}
Espero que sea útil para otros
Esto parece describir el problema que estaba teniendo; con suerte, ayudará a alguien en mi posición anterior.
Subclase su SearchDisplayController que se ha agregado a su UIViewController / UITablewViewController,
Agregue algo como esto a su implementación:
- (void)setActive:(BOOL)visible animated:(BOOL)animated { [super setActive:visible animated:animated]; [self.searchContentsController.navigationController setNavigationBarHidden: NO animated: NO]; CGRect frame = self.searchResultsTableView.frame; frame.origin.y = CGRectGetHeight(self.searchContentsController.navigationController.navigationBar.frame); frame.size.height = CGRectGetHeight(frame) - CGRectGetMinY(frame); self.searchResultsTableView.frame = frame; frame = self.searchBar.frame; self.searchBar.frame = frame; [self.searchContentsController.view insertSubview:self.searchBar aboveSubview:self.searchResultsTableView]; }
Gracias hodade por guiarme en el camino correcto! Su solución funcionó, excepto que solo movió el marco de la barra de búsqueda, dejando mis otras subvistas en el lugar equivocado. Lo único que cambié fue mover todas las subvistas en mi opinión, así como animarla.
¡Gracias!
-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
[UIView animateWithDuration:0.25 animations:^{
for (UIView *subview in self.view.subviews)
subview.transform = CGAffineTransformMakeTranslation(0, statusBarFrame.size.height);
}];
}
}
-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
[UIView animateWithDuration:0.25 animations:^{
for (UIView *subview in self.view.subviews)
subview.transform = CGAffineTransformIdentity;
}];
}
}
Las respuestas anteriores solo funcionan si tiene la barra de navegación oculta . Si tiene oculta su barra de navegación, intente esto:
-(void)viewDidAppear:(BOOL)animated{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
[self.tableView setFrame:CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y+statusBarFrame.size.height, self.tableView.frame.size.width, self.tableView.frame.size.height)];
}
}
Basado en esta publicación: UISearchBar se superpone a la barra de estado en iOS
Lo hice por debajo del código para resolver el problema.
- (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;
}
}
Poniendo la siguiente línea en el viewDidLoad lo solucionó por mí:
self.edgesForExtendedLayout = UIRectEdgeNone;
Simplemente coloque el siguiente código en - (void) ViewDidLoad . Funcionará para iOS 7 y versiones posteriores
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
ACTUALIZAR:
if(SYSTEM_VERSION_GREATER_THAN(@"6.1")) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
Subclase su SearchDisplayController
que se ha agregado a su UIViewController/UITablewViewController
y agréguelo a su implementación -
- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
if(self.active == visible) return;
[self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
[super setActive:visible animated:animated];
[self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
if (visible) {
[self.searchBar becomeFirstResponder];
} else {
[self.searchBar resignFirstResponder];
}
}
solo agrega
self.definesPresentationContext = YES;
Puede leer más desde aquí: UISearchController y definePresentationContext
y de la documentación de Apple: documentación de UISearchController
Nota: UISearchDispalyController está en desuso en iOS7, usa UISearchController en su lugar en iOS8, el método anterior usa UISearchController
-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frame = controller.searchBar.frame;
frame.origin.y += statusBarFrame.size.height;
controller.searchBar.frame = frame;
}
}
-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect frame = controller.searchBar.frame;
frame.origin.y -= statusBarFrame.size.height;
controller.searchBar.frame = frame;
}
}