web-dev-qa-db-fra.com

Comment désactiver l'ombre de la barre de navigation dans iOS 6 pour les barres de navigation avec des images d'arrière-plan personnalisées?

Il semble que dans iOS 6, une ombre portée est automatiquement ajoutée à la barre de navigation même lorsque vous définissez une image d'arrière-plan personnalisée. Je suis à peu près sûr que ce n'était pas le cas avec iOS 5, car lorsque je teste le même code dans iOS 5 et 6 sim, l'ombre apparaît dans iOS 6 mais pas dans 5.

Est-ce que quelqu'un sait quelque chose à ce sujet? Ou comment l'activer/le désactiver?

50
Dom Chapman

Placez ceci dans votre AppDelegate

[[UINavigationBar appearance] setShadowImage:[UIImage new]];
// is IOS 7 and later
[[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

C'est ce qui me l'a fait. J'espère que ça aide!

Version Swift avec mises à jour à partir de commentaires

    UINavigationBar.appearance().shadowImage = UIImage()
    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
141
Kevin Fernandes

Je sais que cela a été résolu avec des réponses plus complexes plus haut, mais c’est le moyen le plus rapide et le plus simple de cacher l’ombre sous la barre de navigation.

self.navigationController.navigationBar.clipsToBounds = YES;
57
Hank Brekke

Note des documents de développement Apple concernant la propriété shadowImage:

Discussion: La valeur par défaut est nil, ce qui correspond à la valeur par défaut image de l'ombre. Si non nil, cette propriété représente une ombre personnalisée image à afficher à la place de la valeur par défaut. Pour qu'une image d'ombre personnalisée soit montré, une image d’arrière-plan personnalisée doit également être définie avec le setBackgroundImage: forBarMetrics: méthode. Si le fond par défaut Si l’image est utilisée, l’ombre par défaut sera utilisée quelle que soit l’analyse de la valeur de cette propriété.

Donc, pour utiliser le piratage nil UIImage, vous devez également définir une image d'arrière-plan de barre de navigation personnalisée. Cela peut aussi être une image nulle, ce qui donne un bar de navigation agréable, propre et de style métro:

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
        [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
25
Lee Probert

Aussi, vous pouvez essayer ceci:

controller.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];

le contrôleur est un UINavigationController.

19
Dima Korbin

Réponse générale ne portant pas atteinte à la NDA:

Si vous ne voulez pas que quelque chose dépasse d'un calque, masquez le calque à ses limites.

[self.layer setMasksToBounds:YES];

Définissez explicitement la hauteur sur 44 (ou 32 pour le paysage sur iPhone) si cela ne fonctionne pas seul.

7
Steve Cotner

La définition de shadowImage en une image null fonctionne, toutefois, la manière dont la solution est présentée entraîne l'ajout d'une propriété si le système d'exploitation est antérieur à iOS 6.

Une meilleure façon de faire quelque chose qui dépend de l'existence d'une propriété ou d'une méthode est:

if ([self.navigationController.navigationBar
respondsToSelector:@selector(shadowImage)]) {
self.navigationController.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];
}
6
user1202579

Il existe deux solutions possibles, la seconde étant mentionnée dans d'autres réponses.

  1. Ajoutez un seul pixel transparent au bas de l’image d’arrière-plan de la barre de navigation, pour une hauteur de 45 pt Cela désactive les ombres dans iOS 6.
  2. Implémentez le code suivant:

    // Omit the conditional if minimum OS is iOS 6 or above
    if ([UINavigationBar instancesRespondToSelector:@selector(setShadowImage:)]) {
        [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
    }
    

Source: Personnalisation avancée des apparences sur iOS , @ 27: 15

3
eager

Puisque self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init]; ne fonctionne pas, j'ai trouvé un moyen simple et pratique de supprimer l'ombre de UINavigationBar dans iOS 6 ET iOS 5. J'espère que les personnes qui en ont besoin peuvent voir ce message.

Il vous suffit de préparer une image d'arrière-plan dont la hauteur est supérieure de 1 pixel à la hauteur de votre barre de navigation (par exemple, 320 × 45 pour UINavigationBar par défaut, 640 × 90 pour 2x bien sûr).

Ensuite, utilisez simplement [[UINavigationBar appearance] setBackgroundImage: ...], vous trouverez que l’ombre est remplacée par celle de 1 pixel. à votre santé!

BTW j'ai trouvé que Twitter a fait exactement la même chose, si vous décompressez Twitter.ipa et regardez dans bg_nav_bar_events_dark.png, la taille est de 320 × 47. Ils ont fait leur propre ombre pour 3 pixels :)

2
xiaobo

Je suis tombé sur cette question SO lorsque j'essayais de rendre les barres de navigation identiques entre iOS6 et iOS7.

La réponse que j'ai trouvée travaillée était simplement d'utiliser:

    NSMutableDictionary *titleBarAttributes = [NSMutableDictionary dictionaryWithDictionary: [[UINavigationBar appearance] titleTextAttributes]];
    [titleBarAttributes setValue:[NSNumber numberWithInt:0] forKey:UITextAttributeTextShadowOffset];
    [[UINavigationBar appearance] setTitleTextAttributes:titleBarAttributes];

c'est-à-dire: régler le décalage de l'ombre à zéro.

1
CharlesA

Je ne peux pas commenter, alors je vais ajouter mes informations ici.

Peut-être que les suggestions ci-dessus ont fonctionné dans la version bêta, mais cela ne semble pas être le cas maintenant.

self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];

Ce qui précède ne fonctionne pas, pas plus que les autres réponses similaires ci-dessus. Je les ai tous essayés.

Le découpage aux limites fonctionne, mais ne donne pas le résultat souhaité, car j'aimerais que d'autres vues soient suspendues en dehors de la barre de navigation.

1
Richard Williams

J'ai eu le même problème et je l'ai résolu en suivant:

CustomNavBar *navBar = (CustomNavBar *)self.navigationController.navigationBar;
        [navBar setBackgroundImage:[UIImage imageNamed:@"navigation_bar_gray.png"] forBarMetrics:UIBarMetricsDefault];
        navBar.shadowImage = [[UIImage alloc]init]; // this is what acctually removed the shadow under navigation bar 
0
Dejan Balaban

Dans Swift 3.0, cela ressemblerait à ceci

UINavigationBar.appearance().shadowImage = UIImage ()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
0
Kumar C