Ombre sombre dans la barre de navigation pendant la transition de segue après la mise à niveau vers Xcode 5.1 et iOS 7.1

Lorsque je navigue entre les contrôleurs parents et enfants dans un contrôleur de navigation principal, je vois une ombre sombre sur le côté droit de la barre de navigation en haut. Cela a commencé après la mise à niveau vers Xcode 5.1. Cela me semble rude et distrayant. Comment puis-je m’en débarrasser?

 self.navigationController.navigationBar.translucent = NO; 

réparé

la réponse de nonamelive est parfaite. Pour obtenir la même chose dans Interface Builder et conserver encore TRANSLUCENCY , sélectionnez le contrôleur de navigation et définissez un atsortingbut d’exécution défini par l’utilisateur, view.backgroundColor comme indiqué dans la capture d’écran (dans l’inspecteur d’identité). Répétez l’opération pour tous les contrôleurs de navigation présentant ce problème.

Il semble que tout ce problème se produit parce que la couleur noire (ou, en fait, aucune couleur) de UINavigationController ne passe pas au moment où les instantanés de CoreGraphics au début de l’animation commencent. Donc, le mettre en blanc empêchera cela.

Inspecteur d'identité -/> Atsortingbuts d’exécution définis par l’utilisateur”> </p>
</div>
</li><!-- #comment-## -->
<div class=

Cela semble être un bug introduit dans iOS 7.1. Dans mon cas, il est causé par une barre UIToolbar placée directement sous la barre de navigation. L’ombre sombre apparaît également dans la barre d’tabs translucide.

L’ombre semble être causée par la vue en arrière-plan de la barre UITool. J’utilise maintenant cette solution de contournement dans le contrôleur de vue avec la barre d’outils qui masque la vue en arrière-plan de la barre d’outils pendant la transition:

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) { BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]] && [NSSsortingngFromClass(subview.class) isEqualToSsortingng:@"_UIToolbarBackground"]); if (isToolbarBackgroundView) { *stop = YES; } return (! isToolbarBackgroundView); }]; if (toolbarBackgroundView) { // fade toolbar background view back in [UIView animateWithDuration:0.1f animations:^{ toolbarBackgroundView.alpha = 1.0f; }]; } } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) { BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]] && [NSSsortingngFromClass(subview.class) isEqualToSsortingng:@"_UIToolbarBackground"]); if (isToolbarBackgroundView) { *stop = YES; } return (! isToolbarBackgroundView); }]; if (toolbarBackgroundView) { // hide toolbar background view toolbarBackgroundView.alpha = 0.0f; } } 

Ceci est le code pour [UIView findViewRecursively:]

 @interface UIView (FindSubview) - (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse; @end @implementation UIView (FindSubview) - (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse { for (UIView* subview in self.subviews) { BOOL stop = NO; if (recurse(subview, &stop)) { UIView* view = [subview findViewRecursively:recurse]; if (view) return view; } else if (stop) { return subview; } } return nil; } @end 

J’ai déposé ce radar: http://openradar.appspot.com/16418845

Cela semble se produire avec n’importe quelle barre (TabBar ou ToolBar) qui est translucide.
Donc, une façon de le réparer est de définir _tabBar.translucent = NO; (dans mon cas). Cela évite l’ombre indésirable sous la barre de navigation supérieure tout en laissant la barre de navigation translucide. Malheureusement, la barre inférieure n’est plus translucide.

Il peut être ramené à translucide, mais tout cela doit se produire une fois l’animation complète terminée, ce qui permet de changer cette propriété.

Dans le cas, cependant, la barre inférieure doit également être translucide et je ne veux pas que l’utilisateur voit le changement, j’ai résolu le problème avec les éléments suivants:

 /* create a simple quick animation of the bottom bar just before pushing the new controller */ [UIView animateWithDuration:0.1 animations:^{ _tabBar.barTintColor = [UIColor colorWithWhite:0.97254901960784 alpha:1.0]; // this is the closest color for my case _tabBar.translucent = NO; } completion:^(BOOL finished) { /* now when the animation that makes the bar not translucent is finished we can push the new controller the controller is instantiated before the animation code */ [self.navigationController pushViewController:controller animated:YES]; }]; 

Ensuite, dans le viewDidAppear: je retourne simplement cela en arrière:

 [UIView animateWithDuration:0.1 animations:^{ _tabBar.barTintColor = nil; _tabBar.translucent = YES; }]; 

Il y a juste un petit changement d’apparence en particulier mais c’est à peine perceptible et c’est bien mieux que d’avoir l’ombre sous la barre de navigation.

J’espère que cela aidera les autres à garder les barres translucides jusqu’à ce qu’Apple corrige ce comportement car les barres sont censées être cachées dans certains cas, contrairement à ce qui a été suggéré dans d’autres articles, spécialement pour UITabBar

Voici ma variante … elle nécessite beaucoup moins de code que la réponse de tom et est plus efficace. C’est SI vous voulez une barre de navigation translucide et que vous souhaitez également résoudre ce problème d’ombre.

Dans le ViewController source (intégré au contrôleur de navigation) …

 - (void)viewDidAppear:(BOOL)animated { self.navigationController.navigationBar.translucent = YES; } 

et

  - (void)viewWillDisappear:(BOOL)animated { self.navigationController.navigationBar.translucent = NO; } 

Le résultat est identique à celui de Tom (visuellement, pour l’utilisateur final) et est plus facile à mettre en œuvre. J’espère que cela t’aides…

 self.navigationController!.navigationBar.translucent = false; 

Cela fonctionne pour moi placez-le dans la fonction où vous poussez le nouveau ViewController

Bien que ce ne soit pas la même chose que l’implémentation iOS stockée, c’est un bon moyen de résoudre le problème:

 - (void)viewWillAppear:(BOOL)animated { [UIView animateWithDuration:0.35f animations:^{ self.tabBarController.tabBar.alpha = 1.0f; }]; } - (void)viewWillDisappear:(BOOL)animated { [UIView animateWithDuration:0.35f animations:^{ self.tabBarController.tabBar.alpha = 0.0f; }]; } 

Vous obtiendrez une belle animation de fondu entrant / sortant de la barre d’tabs. Ajoutez le code dans la racine UIViewController .

Ce qui suit fonctionne également et laisse la barre de navigation transparente:

[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor whiteColor];

Ou, si vous utilisez le générateur d’interface, vous pouvez simplement sélectionner la barre de navigation dans votre contrôleur de navigation et décocher la case Translucide entre style et barre de teinte dans l’inspecteur des atsortingbuts pour supprimer cet effet étrange.

Inspecteur