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?
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!
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
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;
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];
Aussi, vous pouvez essayer ceci:
controller.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];
le contrôleur est un UINavigationController.
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.
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];
}
Il existe deux solutions possibles, la seconde étant mentionnée dans d'autres réponses.
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
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 :)
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.
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.
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
Dans Swift 3.0, cela ressemblerait à ceci
UINavigationBar.appearance().shadowImage = UIImage ()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)