¿Cómo cambiar el color del borde debajo de la barra de navigation?

¿Alguien me puede aconsejar sobre cómo se puede cambiar el borde debajo de la barra de navigation?

introduzca la descripción de la imagen aquí

Me gustaría cambiarlo de la luz negra actual a un color más suave. Aprecie cualquier ayuda aquí

No creo que exista un método para cambiar el color del borde del color de navigation, que no sea la propiedad tintColor del UINavigationBar .

Sugiero que cree una UIView de ese tamaño de borde y la coloque debajo de la barra de navigation / añádala como una subView .

 UIView *navBorder = [[UIView alloc] initWithFrame:CGRectMake(0,navigationBar.frame.size.height-1,navigationBar.frame.size.width, 1)]; // Change the frame size to suit yours // [navBorder setBackgroundColor:[UIColor colorWithWhite:200.0f/255.f alpha:0.8f]]; [navBorder setOpaque:YES]; [navigationBar addSubview:navBorder]; [navBorder release]; 

En Swift como la respuesta de @Legolas:

 if let navigationController = self.navigationController { let navigationBar = navigationController.navigationBar let navBorder: UIView = UIView(frame: CGRectMake(0, navigationBar.frame.size.height - 1, navigationBar.frame.size.width, 1)) // Set the color you want here navBorder.backgroundColor = UIColor(networking: 0.19, green: 0.19, blue: 0.2, alpha: 1) navBorder.opaque = true self.navigationController?.navigationBar.addSubview(navBorder) } 

Puede poner en viewDidLoad() de su UIViewController .

Para iOS 7 puedes usar esto:

 [self.navigationController.navigationBar setShadowImage:[UIImage new]]; 

También puede agregar una vista secundaria a su barra de navigation.

El siguiente código agregará un borde azul profundo de 4 píxeles debajo de su barra de navigation

 UINavigationBar* navBar = self.navigationController.navigationBar; int borderSize = 4; UIView *navBorder = [[UIView alloc] initWithFrame:CGRectMake(0,navBar.frame.size.height-borderSize,navBar.frame.size.width, borderSize)]; [navBorder setBackgroundColor:[UIColor blueColor]]; [self.navigationController.navigationBar addSubview:navBorder]; 

Encontré un par de problemas con las respuestas anteriores:

  • si agrega una subvista: al girar el dispositivo, el borde ya no tendrá el marco correcto
  • si configura shadowImage en nil, no puede personalizar la sombra de la barra de navigation.

Una forma de resolver esto sería usar autolayout:

 extension UINavigationBar { func setBottomBorderColor(color: UIColor, height: CGFloat) -> UIView { let bottomBorderView = UIView(frame: CGRectZero) bottomBorderView.translatesAutoresizingMaskIntoConstraints = false bottomBorderView.backgroundColor = color self.addSubview(bottomBorderView) let views = ["border": bottomBorderView] self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[border]|", options: [], metrics: nil, views: views)) self.addConstraint(NSLayoutConstraint(item: bottomBorderView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: height)) self.addConstraint(NSLayoutConstraint(item: bottomBorderView, attribute: .Bottom, relatedBy: .Equal, toItem: self, attribute: .Bottom, multiplier: 1.0, constant: height)) return bottomBorderView } } 

La razón por la que devuelvo el borde es que durante la rotation lo ves en el centro de la navigation bar , así que lo oculto durante la rotation.

A pesar de que navigationBar es una propiedad de solo lectura para UINavigationController, puede evitar esta restricción mediante "setValue: forKey:". Este método fue aprobado en 5 aplicaciones enviadas con éxito a AppStore.

Puede subclass UINavigationBar y cambiar drawRect: método como desee. Por ejemplo,

 @implementation CustomNavigationBar - (void) drawRect:(CGRect)rect { [super drawRect:rect]; UIImage *backgroundImage = ImageFromColor(WANTED_COLOR); [backgroundImage drawInRect:rect]; } 

Después de que puede subclass UINavigationController y cambiar initWithRootViewController:

 - (id) initWithRootViewController:(UIViewController *)rootViewController { self = [super initWithRootViewController:rootViewController]; if (self) { CustomNavigationBar *navBar = [CustomNavigationBar new]; [self setValue:navBar forKey:@"navigationBar"]; } return self; } 

También puede variar este enfoque haciendo que Category for UINavigationController e implementando el método swizzling para initWithRootViewController:

PS Ayer apareció mi nueva aplicación en AppStore sin ningún problema con este enfoque.