Question iOS 7: désactivation de la translucidité de barre d'outils UINavigation pour l'ensemble de l'application


Existe-t-il un moyen de désactiver UINavigationBar Translucency pour une application entière?

Je suis conscient que l'utilisation [self.navigationController.navigationBar setTranslucent:NO] peut résoudre ce problème pour un seul contrôleur, mais j'ai beaucoup de UINavigationBars dans mon application et c'est une solution assez fastidieuse.

J'ai essayé [[UINavigationBar appearance] setTranslucent:NO], mais cette fonctionnalité n'est étonnamment pas prise en charge. Cela aboutit à Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** Illegal property type, c for appearance setter, _installAppearanceSwizzlesForSetter:'

Si je dois le faire, je peux passer en revue l'intégralité du paramètre d'application UINavigationBars pour désactiver la translucidité une par une, mais il doit y avoir une solution plus élégante à ce problème ...


52
2017-09-18 22:19


origine


Réponses:


si vous définissez la translucidité de la première barre de navigation dans la pile pour false  [self.navigationController.navigationBar setTranslucent:NO], il se reflétera dans tous les NavigationViewController suivants qui sont poussés vers cette pile.


33
2017-10-24 14:48



Voici une solution Swift si vous souhaitez appliquer ce style à l'ensemble de l'application.

dans le AppDelegate classe ajouter cela à la didFinishLaunchingWithOptions:

Pour Swift 2:

UINavigationBar.appearance().translucent = false

Pour Swift 3: 

UINavigationBar.appearance().isTranslucent = false

14
2017-07-25 10:52



Cela semble très simple avec ce code dans appDelegate  didFinishLaunchingWithOptions (fonctionne bien avec iOS 8 et versions supérieures)

[[UINavigationBar appearance] setTranslucent:NO];

6
2017-08-12 04:29



Je pense que vous avez raison de dire qu'aucun proxy d'apparence n'est disponible pour cette propriété. Utilisez-vous des objets UINavigationControllers ou UINavigationBar? Si vous utilisez UINavigationBars, vous pouvez le sous-classer et créer une barre de navigation non-translucide.

En tête de fichier:

#import <UIKit/UIKit.h>

@interface ABCNonTranslucentNavBar : UINavigationBar

@end

Fichier d'implémentation:

#import "ABCNonTranslucentNavBar.h"

@implementation ABCNonTranslucentNavBar

- (void)drawRect:(CGRect)rect
{
  [self setTranslucent:NO];
}

Ensuite, remplacez simplement les UINavigationBars par votre sous-classe. Vous pouvez également faire quelque chose de similaire avec un UINavigationController sous-classé.


3
2017-09-19 00:03



Ajout de ceci dans le cas où des personnes luttent encore contre cela.

Vous pouvez le tromper en spécifiant une image non existante, ce qui rendra la barre d'outils de la barre de navigation

[[UIToolbar appearance] setBackgroundColor:[UIColor colorWithRed:219.0/255.0 green:67.0/255.0 blue:67.0/255.0 alpha:1.0]];

[[UIToolbar appearance] setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];

3
2017-11-05 17:20



Je sais que c'est vieux, mais cela pourrait être utile pour quelqu'un;

Vous pouvez utiliser une catégorie et y définir la propriété [translucent][1]

@implementation UINavigationBar (MakeTranslucent)

-(void)willMoveToWindow:(UIWindow *)newWindow {
    [super willMoveToWindow:newWindow];


    self.translucent = NO;
}
@end
  • J'ai utilisé willMoveToWindow, je ne sais pas si c'est une bonne idée alors UAYOR.

2
2017-10-04 20:08



Je pense que l'apparence api ne supporte pas la propriété translucide de la barre de navigation. Mais vous pouvez le faire pour toute l'application comme celle-ci, s'il vous plaît jeter un oeil à ce code -

ici L'écran de menu est un contrôleur de vue racine.

MenuScreen *ms = [[MenuScreen alloc]initWithNibName:@"MenuScreen" bundle:nil];

UINavigationController *nv = [[UINavigationController alloc]initWithRootViewController:ms];

//This will set property for whole App.
[nv.navigationBar setTranslucent:NO];

self.window.rootViewController = nv ;

0
2017-12-19 06:24



Si vous n'utilisez pas le storyboard, mais IB, définissez le style de la barre de navigation de MainWindows.xib sur NOT translucent et définissez-le comme couleur et non comme couleur claire.


-3
2017-11-10 16:19