Respuestas:
Si alguien se pregunta cómo lograr esto en iOS 7+, aquí hay una solución (también compatible con iOS 6)
En el objetivo-C
[self.navigationBar setBackgroundImage:[UIImage new]
forBarMetrics:UIBarMetricsDefault];
self.navigationBar.shadowImage = [UIImage new];
self.navigationBar.translucent = YES;
En Swift 3 (iOS 10)
self.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.isTranslucent = true
En swift 2
self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.translucent = true
Configuración translucent
de YES
la barra de navegación hace el truco, debido a un comportamiento descrito en la UINavigationBar
documentación. Informaré aquí el fragmento relevante:
Si establece esta propiedad
YES
en una barra de navegación con una imagen de fondo personalizada opaca, la barra de navegación aplicará una opacidad del sistema inferior a 1.0 a la imagen.
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
En iOS5 puede hacer esto para hacer que la barra de navegación sea 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]];
Desde 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 cualquiera que quiera hacer esto en Swift 2.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true
o Swift 3.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
Esto parece funcionar:
@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end
navigationController.navigationBar.backgroundColor = [UIColor clearColor];
-drawRect:
en una subclase propiamente dicha, no en una categoría, y luego usar esta subclase como barra de navegación.
Después de hacer lo que todos los demás dijeron anteriormente, es decir:
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true
... mi barra de navegación todavía estaba blanca . Entonces agregué esta línea:
navigationController?.navigationBar.backgroundColor = .clear
... et voila! Eso pareció hacer el truco.
Si compila con la última versión beta de iOS 13.4 y XCode 11.4, la respuesta aceptada ya no funcionará. He encontrado otra forma, tal vez es solo un error en el software beta, pero lo estoy escribiendo allí, por si acaso
(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
}
}
}
Sé que este tema es antiguo, pero si la gente quiere saber cómo se hace sin sobrecargar el método drawRect.
Esto es lo que necesitas:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
El siguiente código se expande sobre la respuesta superior elegida para este hilo, para deshacerse del borde inferior y establecer el color del texto:
Las dos últimas líneas codificadas de este código establecen la transparencia. ¡Tomé prestado ese código de este hilo y funcionó perfectamente!
La propiedad "clipsToBounds" fue el código que encontré que eliminó la línea del borde inferior con OR sin conjunto de transparencias (así que si decides ir con un fondo blanco / negro / etc. Sólido, todavía no habrá línea de borde).
La línea "tintColor" (segunda línea codificada) estableció mi botón de retroceso en gris claro
Mantuve barTintColor como respaldo. No sé por qué la transparencia no funcionaría, pero si no funciona, quiero mi bg blanco como solía tenerlo
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;
¡Otra forma que funcionó para mí es subclasificar UINavigationBar y dejar el método drawRect vacío!
@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
}}
En Swift 4.2
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
(en viewWillAppear), y luego en viewWillDisappear, para deshacerlo, coloque
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.isTranslucent = false
¿Te refieres a completamente transparente, o usando el estilo negro translúcido visto en la aplicación Fotos? Esto último se puede lograr estableciendo su barStyle
propiedad en UIBarStyleBlackTranslucent
. El primero ... no estoy seguro. Si desea que los elementos en él aún estén visibles, es posible que tenga que investigar un poco en la jerarquía de vistas de la barra y eliminar la vista que contiene su fondo.
Verifique RRViewControllerExtension , que se dedica a la gestión de la apariencia de la barra UINavigation.
con RRViewControllerExtension en su proyecto, solo necesita anular
-(BOOL)prefersNavigationBarTransparent;
en tu 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;