Respostas:
Se alguém está se perguntando como conseguir isso no iOS 7+, aqui está uma solução (compatível com iOS 6 também)
No Objetivo-C
[self.navigationBar setBackgroundImage:[UIImage new]
forBarMetrics:UIBarMetricsDefault];
self.navigationBar.shadowImage = [UIImage new];
self.navigationBar.translucent = YES;
No Swift 3 (iOS 10)
self.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.isTranslucent = true
Em rápido 2
self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.translucent = true
Definir translucent
como YES
na barra de navegação faz o truque, devido a um comportamento discutido na UINavigationBar
documentação. Vou relatar aqui o fragmento relevante:
Se você definir essa propriedade
YES
em uma barra de navegação com uma imagem de plano de fundo personalizada opaca, a barra de navegação aplicará uma opacidade do sistema menor que 1,0 à imagem.
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
No iOS5, você pode fazer isso para tornar a barra de navegação transparente:
nav.navigationBar.translucent = YES; // Setting this slides the view up, underneath the nav bar (otherwise it'll appear black)
const float colorMask[6] = {222, 255, 222, 255, 222, 255};
UIImage *img = [[UIImage alloc] init];
UIImage *maskedImage = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(img.CGImage, colorMask)];
[nav.navigationBar setBackgroundImage:maskedImage forBarMetrics:UIBarMetricsDefault];
[img release];
[[UINavigationBar appearance] setShadowImage: [[UIImage alloc] init]];
Do IOS7:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.view.backgroundColor = [UIColor clearColor];
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
Para quem quiser fazer isso no Swift 2.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true
ou Swift 3.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
Isso parece funcionar:
@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end
navigationController.navigationBar.backgroundColor = [UIColor clearColor];
-drawRect:
uma subclasse apropriada, não em uma categoria, e depois usá-la como sua barra de navegação.
Depois de fazer o que todo mundo disse acima, ou seja:
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true
... minha barra de navegação ainda estava branca . Então eu adicionei esta linha:
navigationController?.navigationBar.backgroundColor = .clear
... e pronto! Isso pareceu funcionar.
Se você criar com a versão beta mais recente do iOS 13.4 e XCode 11.4, a resposta aceita não funcionará mais. Eu encontrei outra maneira, talvez seja apenas um bug no software beta, mas estou escrevendo lá em baixo, apenas no caso
(rápido 5)
import UIKit
class TransparentNavBar :UINavigationBar {
override func awakeFromNib() {
super.awakeFromNib()
self.setBackgroundImage(UIImage(), for: .default)
self.shadowImage = UIImage()
self.isTranslucent = true
self.backgroundColor = .clear
if #available(iOS 13.0, *) {
self.standardAppearance.backgroundColor = .clear
self.standardAppearance.backgroundEffect = .none
self.standardAppearance.shadowColor = .clear
}
}
}
Eu sei que este tópico é antigo, mas se as pessoas quiserem saber como é feito sem sobrecarregar o método drawRect.
Isto é o que você precisa:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
O código abaixo se expande na resposta superior escolhida para este segmento, para se livrar da borda inferior e definir a cor do texto:
As duas últimas linhas codificadas desse código definem a transparência. Peguei emprestado esse código desse segmento e funcionou perfeitamente!
A propriedade "clipsToBounds" foi o código que encontrei que eliminou a linha de borda inferior com OR sem transparência definida (por isso, se você optar por usar um fundo branco / preto / etc. Sólido, ainda não haverá linha de borda).
A linha "tintColor" (segunda linha codificada) definiu meu botão de retorno para cinza claro
Eu mantive o barTintColor como um backup. Não sei por que a transparência não funcionaria, mas se não funcionar, quero minha BG branca como costumava tê-la.
let navigationBarAppearace = UINavigationBar.appearance()
navigationBarAppearace.tintColor = UIColor.lightGray
navigationBarAppearace.barTintColor = UIColor.white
navigationBarAppearace.clipsToBounds = true
navigationBarAppearace.isTranslucent = true
navigationBarAppearace.setBackgroundImage(UIImage(), for: .default)
navigationBarAppearace.shadowImage = UIImage()
NavigationController.NavigationBar.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
NavigationController.NavigationBar.ShadowImage = new UIImage();
NavigationController.NavigationBar.Translucent = true;
Outra maneira que funcionou para mim é subclassificar UINavigationBar e deixar o método drawRect vazio !!
@IBDesignable class MONavigationBar: UINavigationBar {
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
}}
No Swift 4.2
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
(em viewWillAppear) e, em seguida, em viewWillDisappear, para desfazê-lo, coloque
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.isTranslucent = false
Você quer dizer totalmente transparente ou usar o estilo preto translúcido visto no aplicativo Fotos? O último que você pode realizar definindo sua barStyle
propriedade para UIBarStyleBlackTranslucent
. O primeiro ... não tenho certeza. Se você quiser que os itens ainda estejam visíveis, talvez seja necessário pesquisar na hierarquia de visualizações da barra e remover a visualização que contém seu plano de fundo.
Verifique RRViewControllerExtension , que é dedicado ao gerenciamento de aparência da barra de navegação do UIN.
com RRViewControllerExtension em seu projeto, você só precisa substituir
-(BOOL)prefersNavigationBarTransparent;
em você viewcontroller.
extension UINavigationBar {
var isTransperent: Bool {
get {
return false // Just to satisfy property
}
set {
if newValue == true {
self.shadowImage = UIImage()
self.isTranslucent = true
self.setBackgroundImage(UIImage(), for: .default)
}else{
self.shadowImage = UIImage()
self.isTranslucent = false
self.setBackgroundImage(nil, for: .default)
}
}
}
}
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = nil; self.navigationController.navigationBar.translucent = NO;