Cómo hacer una barra de navegación completamente transparente en iOS 7

Quiero que UINavigationBar en mi aplicación sea completamente transparente y esté alineado con viewcontroller directamente debajo de él. Sin embargo, el único código que pude encontrar lo hace translúcido pero no transparente. Sé que esto se puede hacer en iOS 7 porque se usa en la aplicación de notas. Mi pregunta es, ¿cuál es el código que solían usar?

De esta respuesta

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = [UIImage new]; self.navigationController.navigationBar.translucent = YES; self.navigationController.view.backgroundColor = [UIColor clearColor]; self.navigationController.navigationBar.backgroundColor = [UIColor clearColor]; 

Además, como lo sugirió Josh en los comentarios, para volver a poner la barra en default:

 [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; 

Para Swift3 y Swift4

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.isTranslucent = true 

Para Swift2.2

  self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true 

Para Objective-C

 [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = [UIImage new]; self.navigationController.navigationBar.translucent = YES; 

Solución autónoma como categoría Objective-C:

UINavigationController + TransparentNavigationController.h

 @interface UINavigationController (TransparentNavigationController) - (void)presentTransparentNavigationBar; - (void)hideTransparentNavigationBar; @end 

UINavigationController + TransparentNavigationController.m

 #import "UINavigationController+TransparentNavigationController.h" @implementation UINavigationController (TransparentNavigationController) - (void)presentTransparentNavigationBar { [self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; [self.navigationBar setTranslucent:YES]; [self.navigationBar setShadowImage:[UIImage new]]; [self setNavigationBarHidden:NO animated:YES]; } - (void)hideTransparentNavigationBar { [self setNavigationBarHidden:YES animated:NO]; [self.navigationBar setBackgroundImage:[[UINavigationBar appearance] backgroundImageForBarMetrics:UIBarMetricsDefault] forBarMetrics:UIBarMetricsDefault]; [self.navigationBar setTranslucent:[[UINavigationBar appearance] isTranslucent]]; [self.navigationBar setShadowImage:[[UINavigationBar appearance] shadowImage]]; } @end 

Ahora puede importar la categoría en su UIViewController y llamar a los métodos en su controlador de navegación, por ejemplo:

 #import "UINavigationController+TransparentNavigationController.h" - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController presentTransparentNavigationBar]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController hideTransparentNavigationBar]; } 

Y una solución similar en Swift :

 import Foundation import UIKit extension UINavigationController { public func presentTransparentNavigationBar() { navigationBar.setBackgroundImage(UIImage(), forBarMetrics:UIBarMetrics.Default) navigationBar.translucent = true navigationBar.shadowImage = UIImage() setNavigationBarHidden(false, animated:true) } public func hideTransparentNavigationBar() { setNavigationBarHidden(true, animated:false) navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImageForBarMetrics(UIBarMetrics.Default), forBarMetrics:UIBarMetrics.Default) navigationBar.translucent = UINavigationBar.appearance().translucent navigationBar.shadowImage = UINavigationBar.appearance().shadowImage } } 

Alan olvidó una línea

 self.navigationController.navigationBar.backgroundColor = [UIColor clearColor]; 

Así que tengo:

 [self.navigationController.navigationBar setTranslucent:YES]; self.navigationController.view.backgroundColor = [UIColor clearColor]; [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init]; self.navigationController.navigationBar.backgroundColor = [UIColor clearColor]; 

La gran respuesta de @Zorayr revisada para Swift 3:

 import Foundation import UIKit extension UINavigationController { public func presentTransparentNavigationBar() { navigationBar.setBackgroundImage(UIImage(), for:.default) navigationBar.isTranslucent = true navigationBar.shadowImage = UIImage() setNavigationBarHidden(false, animated:true) } public func hideTransparentNavigationBar() { setNavigationBarHidden(true, animated:false) navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImage(for: UIBarMetrics.default), for:.default) navigationBar.isTranslucent = UINavigationBar.appearance().isTranslucent navigationBar.shadowImage = UINavigationBar.appearance().shadowImage } } 

Use UINavigationBar + Add pod, luego simplemente llame a:

 UINavigationBar *navigationBar = self.navigationController.navigationBar; [navigationBar makeTransparent]; 

[(UIView *) [self.navigationController.navigationBar.subviews objectAtIndex: 0] setAlpha: 0.0f];

Esa línea parecía funcionar perfectamente para mí