ATUALIZAÇÃO DO iOS 7.1 : Parece que a solução alternativa para modificar o canal alfa na UINavigationBar foi ignorada nesta atualização. No momento, a melhor solução parece ser apenas "lidar com isso" e esperar que qualquer cor escolhida possa gerar um efeito translúcido. Ainda estou procurando maneiras de contornar isso.
ATUALIZAÇÃO DO iOS 7.0.3 : A biblioteca do GitHub que criamos foi atualizada para solucionar um pouco esse problema ao usar o iOS 7.0.3. Infelizmente, não existe uma fórmula mágica para suportar as duas cores criadas no iOS 7.0.2 e anterior e iOS 7.0.3. Parece que a Apple melhorou a saturação, mas à custa da opacidade (já que a translucidez borrada depende do nível de opacidade). Eu, juntamente com alguns outros, estamos trabalhando para criar uma correção muito melhor para isso.
Tenho certeza que muitas pessoas já se depararam com o problema em que o iOS 7 tende a dessaturar a cor de uma UINavigationBar que é translúcida.
Meu objetivo é conseguir um UINavigationBar com essa cor de tonalidade, mas translúcido:
No entanto, com translucidez, estou entendendo isso. A vista de fundo é branca, o que eu entendo tornará essa vista um pouco mais clara:
Existe alguma maneira de obter a cor original enquanto ainda possui translucidez? Percebi que o Facebook conseguiu que a barra tivesse sua cor azul rica, como mostrado aqui:
.. então eu sei que tem que haver alguma maneira. As visualizações de plano de fundo obviamente fazem a diferença aqui, mas a maior parte do conteúdo também é cinza / branco. Parece que, independentemente da cor da tonalidade da barra, você é incapaz de obter cores vivas sob a translucidez.
Atualizado com solução.
Aqui está a solução que acabei encontrando. Tomei aprato solução 's e depois abrangeu o costume UINavigationBar
dentro de uma UINavigationController
subclasse. Eu criei um repositório que tem essa implementação listada abaixo, juntamente com um aplicativo de exemplo .
////////////////////////////
// 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
melhor forma possível quando expostos a translucidez iOS 7.
UINAvigationBar
opaco?