web-dev-qa-db-fra.com

iOS 7 La barre de recherche UISearchDisplayController chevauche la barre d'état pendant la recherche.

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

Il était relativement facile d'ajuster la barre d'état dans chaque vue, à l'exception d'un problème majeur rencontré avec un UISearchBar connecté à un UISearchDisplayController dans l'un de mes contrôleurs de vue.

La barre de recherche semble s'afficher normalement, comme indiqué ci-dessous:

barre de recherche http://imageshack.us/a/img163/9128/06vx.png

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

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

Cela ne semble pas fonctionner comme prévu, étant donné que l’obscurcissement de l’écran se produit 20 pixels au-dessous de la barre de recherche, où la barre de recherche doit se terminer.

Existe-t-il une solution intégrée à cela dans iOS 7? Je préférerais ne pas avoir à ajuster manuellement le cadre pour chaque vue à chaque fois que l'utilisateur commence et termine la recherche.

Merci!

66
desmondhume

Merci Hodade de m'avoir conduit sur la bonne voie! Votre solution a fonctionné, sauf qu'elle n'a déplacé que le cadre de la barre de recherche, laissant mes autres sous-vues au mauvais endroit. La seule chose que j'ai changée était de déplacer toutes les sous-vues de ma vue, 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;
        }];
    }
}
21
desmondhume

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

self.edgesForExtendedLayout = UIRectEdgeNone;
88
Deddiekoel

Vous ne pouvez utiliser 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;
}
13
tachiba

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

PDATE:

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

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

  1. Sous-classez votre SearchDisplayController ajouté à votre UIViewController/UITablewViewController,

  2. Ajouter quelque chose comme ceci à 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];
    
    }
    
6
Morkrom

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;
        }
}
6
Sabareesh

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

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

}
5
iphoner

ajoutez simplement

self.definesPresentationContext = YES;

vous pouvez en lire plus ici: ISearchController et definePresentationContext

et from Apple: documentation de UISearchController)

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

3
Emperio Superiority

Dans mon cas, les vues situées sous la barre de recherche étaient à leur place, seule la barre de recherche chevauchant 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

2
Aurelien Porte

Sous-classe votre SearchDisplayController qui a été ajouté à votre UIViewController/UITablewViewController et ajoutez ceci à sa mise en œuvre -

- (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];
    }
}
0
G.T.
-(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;
    }
}
0
hodade

Les réponses ci-dessus ne fonctionnent que si votre barre de navigation n'est pas masqué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: ISearchBar recouvre la barre d'état dans iOS

0
Andrew Schreiber