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
fonte
UINAvigationBar
opaco?UINavigationBar
melhor forma possível quando expostos a translucidez iOS 7.Respostas:
Atualização do iOS 7.0.3: Como você vê acima, o 7.0.3 mudou as coisas. Eu atualizei minha essência. Espero que isso acabe quando as pessoas atualizarem.
Resposta original: Acabei com um hack combinando as duas das outras respostas. Estou subclassificando UINavigationBar e adicionando uma camada à parte traseira com algum espaço extra para cobrir se alguma das várias barras de status de altura estiver ativa. A camada é ajustada nas subvisões de layout e a cor muda sempre que você define barTintColor.
Gist: https://gist.github.com/aprato/6631390
setBarTintColor
layoutSubviews
fonte
UINavigationController
subclasse. Aqui está uma essência para aqueles que estão interessados em ter um costumeUINavigationBar
dentro de umUINavigationController
.initWithRootViewController
uso. Eu atualizei a minha essênciaO comportamento do tintColor for bars mudou no iOS 7.0. Ele não afeta mais o fundo da barra e se comporta como descrito para a propriedade tintColor adicionada ao UIView. Para colorir o fundo da barra, use -barTintColor. Você pode usar o código a seguir para fazer o aplicativo funcionar com o ios6 e o ios7.
IS_IOS7 é uma macro que é definida no arquivo pch da seguinte maneira.
fonte
Não encontrei esta solução, mas parece funcionar bastante bem. Acabei de adicioná-lo ao viewDidLoad na minha subclasse de UINavigationController.
Fonte: https://gist.github.com/alanzeino/6619253
fonte
colourView
. I bifurcada a outra resposta e fixa algumas coisas em um novo drop-in class: github.com/alanzeino/AZColoredNavigationBarUma maneira de baixa fidelidade provavelmente seria fixar uma
UIView
que seja a altura da barra de navegação na parte superior da vista atrás da barra. Faça com que essa visualização tenha a mesma cor da barra de navegação, mas brinque com o alfa até obter os efeitos desejados:Veja atrás
(Cor alterada dos exemplos mais baixos para enfatizar a transparência. Transparência / desfoque é mais perceptível quando em movimento.)
Subclassificar
UINavigationBar
e colocar a mesma exibição acima do plano de fundo, mas por trás de todo o resto, provavelmente obterá resultados semelhantes, sendo menos invasivo.Outra solução que eu já vi é brincar com o alfa doUINavigationBar
:Edit: Na verdade, após o teste, parece que isso não fornece o comportamento pretendido (ou qualquer comportamento):.8 alfa
Alfa não ajustado
Obviamente, você só desejará fazer isso em dispositivos iOS 7. Portanto, adicione alguma verificação de versão antes de implementar qualquer uma delas.
fonte
[self.navigationController.view insertSubview:backgroundView belowSubview:self.navigationController.navigationBar];
Em vez de criar seu objeto UIColor no formato RGB , use HSB e aumente o parâmetro de saturação. (Créditos a Sam Soffes, que descreve este método aqui )
Nota: Esta solução é uma troca e não funciona bem para cores com alta saturação.
Para escolher a cor HSB do seu design, você pode usar uma ferramenta como o ColorSnapper, que permite copiar o formato UIColor HSB.
Você também pode tentar a Categoria UIColor ( Link do GitHub ) de David Keegan para modificar as cores existentes.
fonte
O problema foi corrigido pela Apple na nova versão 7.0.3.
fonte
I utilizado @ solução de aprato mas encontrados alguns casos de canto onde as novas camadas de novos VCs (por ex.
UINavigationItemButtonViews
,UINavigationItemViews
, Etc.) iria ser inseridos automaticamente para uma posição abaixo daextraColorLayer
(o que causaria essas título ou botão elementos de ser afectada peloextraColorLayer
e assim cores mais fracas do que normalmente seriam). Então ajustei a solução da @ aprato para forçar aextraColorLayer
permanecer na posição de índice 1. Na posição de índice 1, a posiçãoextraColorLayer
fica acima da_UINavigationBarBackground
, mas abaixo de todo o resto.Aqui está a minha implementação de classe:
fonte
Melhorei seu código no meu fork: https://github.com/allenhsu/CRNavigationController
Com a minha modificação, a cor do resultado na tela (escolhida em fundo branco) será exatamente o mesmo valor passado
setBarTintColor
. Eu acho que é uma solução incrível.fonte
Nenhum desses hacks é necessário :). Basta definir:
Para o iOS 7, a translucidez padrão foi mantida em TRUE.
fonte
Em uma nota relacionada, você pode definir facilmente a cor do texto do título (com sombra) através de:
fonte
Encontrei este Q / A ao tentar configurar uma barra de navegação uniformemente colorida com transparência DESATIVADA no iOS 7.
Depois de experimentar um pouco o barTintColor, descobri que uma maneira muito fácil de ter uma barra de navegação opaca é criar uma imagem de pixel único da cor desejada, criar uma imagem elástica e defini-la como plano de fundo. .
Três linhas de código, muito simples e funcionam AMBOS no iOS 6 e iOS 7 (barTintColor não é suportado no iOS 6).
fonte
Existe uma excelente substituição do Dropin UINavigationController disponível a partir de Simon Booth, disponível no GitHub Here GitHub - C360NavigationBar
Se você estiver com suporte ao iOS6 para trás, verifique o controlador de exibição raiz como:
PatientListTableViewController * frontViewController = [[PatientListTableViewController alocado] init];
fonte
Como o @bernhard mencionado acima , é possível saturar a cor da barra para obter a aparência desejada da barra de navegação.
Eu escrevi um utilitário BarTintColorOptimizer para esse tipo de ajuste. Ele otimiza a cor translúcida da tonalidade da barra para fazer com que a cor real da barra corresponda à cor desejada no iOS 7.xe posterior. Veja esta resposta para obter detalhes.
fonte
Francamente falando, as respostas acima podem estar certas, mas seguir o truque funcionou para mim com muita facilidade.
Aqui estão as imagens usadas para
self.imageRed
eself.imageBlack
.< > a imagem preta está entre parênteses, não será visível, pois é transparente :)
< > imagem vermelha está entre parênteses.
fonte
existe uma maneira de usar a solução @aprato sem subclassificar UINavigationBar.
No meu projeto, minha visão principal é um UIViewController.
o problema é que o navigationController é uma propriedade somente leitura, existe uma maneira de usar sua classe com meu projeto porque eu não posso usar:
[[UINavigationController alloc] initWithNavigationBarClass:
obrigado
fonte
UIViewController
interiorUINavigationController
com um[[[UINavigationController alloc] initWithRootViewController:<YourViewController>]
? Isso também pode ser melhor respondido como uma pergunta separada, em vez de postar aqui.Uma maneira fácil de obter a cor desejada é usando
Contanto que sua imagem tenha algum alfa, a translucidez funcionará e você poderá defini-lo alterando a imagem. Isso foi adicionado no iOS7. A largura e a altura da imagem são 640x88px na vertical (adicione 20 aos 88 se desejar que ela fique embaixo da barra de status).
fonte