La barre de search iOS 7 UISearchDisplayController chevauche la barre d'état lors de la search

Je suis en train de mettre à jour mon application pour iOS 7 et je suis en train d'ajuster toutes mes vues pour tenir count de la nouvelle barre d'état transparente (mon application utilisera toujours des barres de navigation opaques).

Il était relativement facile d'ajuster pour la barre d'état dans chaque vue, sauf un problème majeur que j'ai avec un UISearchBar connecté à un UISearchDisplayController dans un de mes controllers de vue.

La barre de search semble afficher normalement, comme indiqué ci-dessous:

Barre de search http://imagizer.imageshack.us/a/img163/9128/06vx.png

Le problème est, dès que je commence à chercher, la barre de navigation disparaît (comme il se doit), mais tout le rest se déplace également pour chevaucher la barre d'état:

Barre de search brisée http://imagizer.imageshack.us/a/img11/8237/corh.png

Cela ne semble pas fonctionner comme prévu, car l'obscurcissement de l'écran se produit 20 pixels au-dessous de la barre de search, où la barre de search devrait se terminer.

Existe-t-il une solution embeddede pour iOS 7? Je préfère ne pas avoir à ajuster manuellement le cadre pour chaque vue chaque fois que l'user commence et finit la search.

Merci!

    Mettre la ligne suivante dans viewDidLoad l'a corrigé pour moi:

    self.edgesForExtendedLayout = UIRectEdgeNone; 

    Merci hodade de m'avoir conduit sur la bonne voie! Votre solution a fonctionné, sauf qu'elle n'a fait que déplacer le cadre de la barre de search, laissant mes autres sous-vues au mauvais endroit. La seule chose que j'ai changé était de déplacer toutes les sous-vues à mon avis, ainsi que de l'animer.

    Merci!

     -(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; }]; } } 

    Vous êtes peut-être en utilisant aucune barre de navigation translucide? Si oui, cela va le résoudre.

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

    Il suffit de placer le code suivant dans – (void) ViewDidLoad . Cela fonctionnera pour iOS 7 et version ultérieure

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

    METTRE À JOUR:

     if(SYSTEM_VERSION_GREATER_THAN(@"6.1")) { self.edgesForExtendedLayout = UIRectEdgeNone; } 

    J'ai fait ci-dessous le code pour résoudre le problème.

      - (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; } } 

    Cela semble décrire le problème que j'avais; J'espère que cela aidera quelqu'un dans mon ancienne position.

    1. Sous-class votre SearchDisplayController qui a été ajouté à votre UIViewController / UITablewViewController,

    2. Ajoutez quelque chose comme ça à sa mise en œuvre:

        - (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]; } 

    Je pense que peut-être append ceci à viewDidLoad aidera:

     if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { self.edgesForExtendedLayout = UIRectEdgeNone; } 

    Ajoutez simplement

     self.definesPresentationContext = YES; 

    vous pouvez en lire plus à partir d'ici: UISearchController et definesPresentationContext

    et à partir de la documentation Apple: documentation UISearchController

    Remarque: UISearchDispalyController est obsolète dans iOS7, utilisez plutôt UISearchController dans iOS8, méthode ci-dessus utilisez UISearchController

    Dans mon cas, les vues sous la barre de search étaient à leur place, seule la barre de search chevauchait la barre d'état. Dans ce cas, cette paix de code fonctionne 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; } } 

    J'espère que cela sera utile aux autres

     -(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; } } 

    Les réponses ci-dessus ne fonctionnent que si vous avez votre barre de navigation non affichée . Si votre barre de navigation est masquée, essayez ceci:

     -(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)]; } } 

    Basé sur ce post: UISearchBar chevauche la barre d'état dans iOS

    Sous-class votre SearchDisplayController qui a été ajouté à votre UIViewController/UITablewViewController et ajoutez ceci à son implémentation –

     - (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]; } }