Haga que UINavigationBar sea transparente

¿Cómo se hace transparente una UINavigationBar ? Aunque quiero que sus elementos de barra permanezcan visibles.

Si alguien se pregunta cómo lograr esto en iOS 7+, aquí hay una solución (iOS 6 también)

En Objective-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 

Discusión

Establecer translucent a YES en la barra de navegación hace el truco, debido a un comportamiento discutido en la documentación de UINavigationBar . Informaré aquí el fragmento relevante:

Si establece esta propiedad en YES en una barra de navegación con una imagen de fondo personalizada opaca, la barra de navegación aplicará una opacidad del sistema menor que 1.0 a la imagen.

En iOS5 puedes hacer esto para 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]; 

De 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]; 

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 . Así que agregué esta línea:

 navigationController?.navigationBar.backgroundColor = .clear 

… et voila! Eso pareció hacer el truco.

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 con la respuesta principal elegida para este subproceso, para eliminar el borde inferior y establecer el color del texto:

  1. Las últimas dos líneas codificadas de este código establecen la transparencia. ¡Tomé prestado ese código de este hilo y funcionó perfectamente!

  2. La propiedad “clipsToBounds” fue el código que encontré que eliminó la línea del borde inferior con O sin transparencia establecida (por lo que si decide ir con un fondo blanco / negro / etc. sólido, todavía no habrá línea de borde).

  3. La línea “tintColor” (segunda línea codificada) establece mi botón Atrás en un gris claro

  4. Mantuve barTintColor como respaldo. No sé por qué la transparencia no funcionaría, pero si no funciona, quiero que mi bg sea blanca, 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() 

Pruebe la siguiente pieza de código:

 self.navigationController.navigationBar.translucent = YES; 

para Swift 3.0:

 override func viewDidLoad() { super.viewDidLoad() navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) navigationController?.navigationBar.shadowImage = UIImage() navigationController?.navigationBar.isTranslucent = true } 

Solución C # / Xamarin

 NavigationController.NavigationBar.SetBackgroundImage(new UIImage(), UIBarMetrics.Default); NavigationController.NavigationBar.ShadowImage = new UIImage(); NavigationController.NavigationBar.Translucent = true; 

Otra forma que funcionó para mí es la subclase 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 }} 

¿Quiere decir completamente transparente, o usando el estilo negro translúcido visto en la aplicación Fotos? Lo último lo puede lograr estableciendo su propiedad UIBarStyleBlackTranslucent en UIBarStyleBlackTranslucent . Lo primero … no estoy seguro. Si desea que los elementos aún estén visibles, puede que tenga que buscar en la jerarquía de vistas de la barra y eliminar la vista que contiene su fondo.

Esto funciona para Swift 2.0.

 navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) navigationController!.navigationBar.shadowImage = UIImage() navigationController!.navigationBar.translucent = true