MISE À JOUR iOS 7.1 : Il semble que la solution de contournement pour modifier le canal alpha dans UINavigationBar a été ignorée dans cette mise à jour. À l'heure actuelle, la meilleure solution semble être de simplement `` y faire face '' et d'espérer que la couleur que vous choisissez peut rendre un effet translucide. Je cherche toujours des moyens de contourner ce problème.
MISE À JOUR iOS 7.0.3 : La bibliothèque GitHub que nous avons créée a été mise à jour pour contourner légèrement ce problème lors de l'utilisation d'iOS 7.0.3. Malheureusement, il n'existe pas de formule magique pour prendre en charge les deux couleurs créées dans iOS 7.0.2 et versions antérieures et iOS 7.0.3. On dirait qu'Apple a amélioré la saturation, mais au prix de l'opacité (puisque la translucidité floue dépend du niveau d'opacité). Je travaille, avec quelques autres, à créer une bien meilleure solution à ce problème.
Je suis sûr que beaucoup de gens ont déjà rencontré le problème où iOS 7 a tendance à désaturer la couleur d'un UINavigationBar qui est translucide.
Mon objectif est de réaliser un UINavigationBar avec cette teinte de couleur, mais translucide:
Cependant, avec la translucidité, je comprends cela. La vue d'arrière-plan est blanche, ce qui, je comprends, rendra cette vue un peu plus claire:
Existe-t-il un moyen d'obtenir la couleur d'origine tout en conservant la translucidité? J'ai remarqué que Facebook avait réussi à faire de sa barre sa couleur bleue riche, comme indiqué ici:
.. donc je sais qu'il doit y avoir un moyen. Les vues d'arrière-plan font évidemment une différence ici, mais la plupart de leur contenu est également gris / blanc. Il semble que quelle que soit la couleur de teinte de barre que vous mettez, vous ne pouvez pas obtenir des couleurs vives sous translucidité.
Mis à jour avec la solution.
Voici la solution que j'ai finalement trouvée. J'ai pris la solution d ' aprato et j'ai ensuite inclus la coutume UINavigationBar
dans une UINavigationController
sous - classe. J'ai créé un référentiel dont cette implémentation est répertoriée ci-dessous, avec un exemple d'application .
////////////////////////////
// CRNavigationBar.m
////////////////////////////
#import "CRNavigationBar.h"
@interface CRNavigationBar ()
@property (nonatomic, strong) CALayer *colorLayer;
@end
@implementation CRNavigationBar
static CGFloat const kDefaultColorLayerOpacity = 0.5f;
static CGFloat const kSpaceToCoverStatusBars = 20.0f;
- (void)setBarTintColor:(UIColor *)barTintColor {
[super setBarTintColor:barTintColor];
if (self.colorLayer == nil) {
self.colorLayer = [CALayer layer];
self.colorLayer.opacity = kDefaultColorLayerOpacity;
[self.layer addSublayer:self.colorLayer];
}
self.colorLayer.backgroundColor = barTintColor.CGColor;
}
- (void)layoutSubviews {
[super layoutSubviews];
if (self.colorLayer != nil) {
self.colorLayer.frame = CGRectMake(0, 0 - kSpaceToCoverStatusBars, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds) + kSpaceToCoverStatusBars);
[self.layer insertSublayer:self.colorLayer atIndex:1];
}
}
@end
////////////////////////////
// CRNavigationController.m
////////////////////////////
#import "CRNavigationController.h"
#import "CRNavigationBar.h"
@interface CRNavigationController ()
@end
@implementation CRNavigationController
- (id)init {
self = [super initWithNavigationBarClass:[CRNavigationBar class] toolbarClass:nil];
if(self) {
// Custom initialization here, if needed.
}
return self;
}
- (id)initWithRootViewController:(UIViewController *)rootViewController {
self = [super initWithNavigationBarClass:[CRNavigationBar class] toolbarClass:nil];
if(self) {
self.viewControllers = @[rootViewController];
}
return self;
}
@end
UINavigationBar
mieux possible lorsqu'elle est exposée à la translucidité sous iOS 7.
UINAvigationBar
opaque?