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!
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;
}];
}
}
Mettre la ligne suivante dans viewDidLoad l'a corrigée pour moi:
self.edgesForExtendedLayout = UIRectEdgeNone;
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;
}
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;
}
Cela semble décrire le problème que j'avais; J'espère que cela aidera quelqu'un dans mon ancienne position.
Sous-classez votre SearchDisplayController ajouté à votre UIViewController/UITablewViewController,
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];
}
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;
}
}
Je pense que peut-être ajouter ceci à viewDidLoad aidera:
if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
{
self.edgesForExtendedLayout = UIRectEdgeNone;
}
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.
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
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];
}
}
-(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 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