solid color bar ios iphone swift uinavigationbar

ios - swift navigation bar solid color



Eliminar borde en la barra de navegación rápida (23)

Actualizado para Swift 4 en caso de que alguien se pregunte

navigationBar.shadowImage = UIImage() navigationBar.backIndicatorImage = UIImage()

Es aún menos detallado ahora.

He estado tratando de eliminar el borde de NavigationBars sin suerte. He investigado y la gente parece decirle que establezca shadowImage y BackgroundImage en nil, pero esto no funciona en mi caso.

Mi código

self.navigationController?.navigationBar.barTintColor = UIColor(rgba: "#4a5866") self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage(named: "")

ilustración:


Con Swift 2 puedes hacerlo de esta manera:

Archivo AppDelegate

Aplicación de funciones internas (..., didFinishLaunchingWithOptions launchOptions: ...)

UINavigationBar.appearance().shadowImage = UIImage() UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)

para Swift 3:

UINavigationBar.appearance().shadowImage = UIImage() UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)


Delegado de aplicaciones

UINavigationBar.appearance().setBackgroundImage(UIImage(), for: UIBarMetrics.default) UINavigationBar.appearance().shadowImage = UIImage()


Dentro de AppDelegate , esto ha cambiado globalmente el formato de la barra de navegación y elimina la línea inferior / borde:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default) UINavigationBar.appearance().shadowImage = UIImage() UINavigationBar.appearance().tintColor = UIColor.whiteColor() UINavigationBar.appearance().barTintColor = UIColor.redColor() UINavigationBar.appearance().translucent = false UINavigationBar.appearance().clipsToBounds = false //UINavigationBar.appearance().backgroundColor = UIColor.redColor() UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : (UIFont(name: "FONT NAME", size: 18))!, NSForegroundColorAttributeName: UIColor.whiteColor()] }

No he logrado implementar nada diferente en un VC específico, pero esto ayudará al 90% de las personas


El problema es con estas dos líneas:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage(named: "")

Como no tiene una imagen sin nombre, UIImage(named: "") devuelve nil , lo que significa que el comportamiento predeterminado entra en juego:

Cuando no es nulo, se muestra una imagen de sombra personalizada en lugar de la imagen de sombra predeterminada. Para que se muestre una sombra personalizada, también se debe establecer una imagen de fondo personalizada con -setBackgroundImage: forBarMetrics: (si se usa la imagen de fondo predeterminada, se usará la imagen de sombra predeterminada).

Necesita una imagen verdaderamente vacía, así que simplemente inicialice con UIImage() :

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


Esta es una versión simplificada de la respuesta de .

extension UINavigationBar { func hideShadow(_ value: Bool = true) { setValue(value, forKey: "hidesShadow") } }


Establezca barStyle en .Black antes de configurar el tinte:

self.navigationController?.navigationBar.translucent = false self.navigationController?.navigationBar.barStyle = .Black self.navigationController?.navigationBar.barTintColor = UIColor.blueColor()


Este es el camino si desea hacerlo sin cambiar el color de fondo:

// Remove the border ImageView from the NavigationBar background func hideBottomBorder() { for view in navigationBar.subviews.filter({ NSStringFromClass($0.dynamicType) == "_UINavigationBarBackground" }) as [UIView] { if let imageView = view.subviews.filter({ $0 is UIImageView }).first as? UIImageView { imageView.removeFromSuperview() } } }

NOTA: Esto podría bloquearse en una aplicación de producción. Aparentemente, a NavigationBar no le gusta que su vista desaparezca


La línea de borde es un UIImageView y al eliminar una subvista que es un imageView se eliminarán barButtonItems con UIImageView. El siguiente código lo ayudará a eliminarlo. Espero que esto ayude a alguien que se enfrentó a un problema como yo.

for parent in self.navigationController!.navigationBar.subviews { for childView in parent.subviews { if childView.frame.height == 0.5 { childView.removeFromSuperview() } } }

El borde UIImageView tiene solo 0.5 de altura, por lo que este código solo elimina eso.


La respuesta aceptada funcionó para mí, pero me di cuenta de cuándo quería que reapareciera la imagen de la sombra al aparecer hacia atrás o avanzar hacia otra vc. Hubo un parpadeo notable en la barra de navegación.

Usando este método navigationController?.navigationBar.setValue(true, forKey: "hidesShadow") en viewWillAppear la barra de sombra está oculta en el controlador de vista visible actual.

Usando estos 2 métodos

navigationController?.navigationBar.setBackgroundImage(nil, for: .default) navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")

En viewWillDisappear, el parpadeo todavía ocurre, pero solo cuando reaparece la imagen de sombra y no la barra de navegación en sí.

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 1. hide the shadow image in the current view controller you want it hidden in navigationController?.navigationBar.setValue(true, forKey: "hidesShadow") navigationController?.navigationBar.layoutIfNeeded() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(true) // 2. show the shadow image when pushing or popping in the next view controller. Only the shadow image will blink navigationController?.navigationBar.setBackgroundImage(nil, for: .default) navigationController?.navigationBar.setValue(false, forKey: "hidesShadow") navigationController?.navigationBar.layoutIfNeeded() }


La respuesta de Luca Davanzo es excelente, pero no funciona en iOS 10. La modifiqué para que funcione en iOS 10 y versiones posteriores.

for parent in navigationController!.view.subviews { for child in parent.subviews { for view in child.subviews { if view is UIImageView && view.frame.height == 0.5 { view.alpha = 0 } } } }

También puede extender UINavigationController y cancelar esto. removeFromSuperview() en la línea no funcionará en iOS 10, así que configuré el alfa en 0 para que esta llamada sea compatible en todas partes.


Para eliminar el borde de UINavigationBar en Swift 3+, use:

UINavigationBar.appearance().shadowImage = UIImage() UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default) UINavigationBar.appearance().isTranslucent = false


Si desea eliminar solo la línea inferior y mantener el color sólido de la barra de navegación, agregue estas líneas de código en viewDidLoad: Swift 3, 4:

navigationController?.navigationBar.shadowImage = UIImage() navigationController?.navigationBar.isTranslucent = false

¡Paz!


Simplemente escriba esto en la extensión de UINavigationBar

extension UINavigationBar { func shouldRemoveShadow(_ value: Bool) -> Void { if value { self.setValue(true, forKey: "hidesShadow") } else { self.setValue(false, forKey: "hidesShadow") } } }

Y en tu opinión, Controlador ...

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.navigationBar.shouldRemoveShadow(true) }

Y para deshacer esto para cualquier viewController, simplemente pase falso.


Solo esto funcionó para mí

self.navigationController?.navigationBar.shadowImage = UIImage()

Ref


en su NavigationController personalizado, agregue estas líneas:

self.navigationBar.setBackgroundImage(UIImage(), for:.default) self.navigationBar.shadowImage = UIImage() self.navigationBar.layoutIfNeeded()

Nota IMPORTANTE

la última línea es importante si usa el método viewDidLoad () de la primera línea porque navigationController debería volver a dibujar la barra de navegación, pero puede usarlo fácilmente sin layoutIfNeeded () en el método viewWillAppear () antes de dibujar la barra de navegación


esta es la respuesta en la base 3 rápida de la respuesta de Nate Cook

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


esto eliminará la imagen de la sombra por completo

for parent in self.navigationController!.navigationBar.subviews { for childView in parent.subviews { if(childView is UIImageView) { childView.removeFromSuperview() } } }


para el swift3 deberías escribir de manera ligeramente diferente:

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


para swift 3

en el método viewDidLoad

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


Swift 4 y Swift 5

Eliminar borde:

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

Restaurando borde:

self.navigationController?.navigationBar.setBackgroundImage(nil, for:.default) self.navigationController?.navigationBar.shadowImage = nil self.navigationController?.navigationBar.layoutIfNeeded()


Swift 5

Cuando se usa setBackgroundImage / shadowImage para ocultar la rayita, hay un ligero retraso. Este método elimina el retraso. Crédito a Chameleon Framework . Este es el método que usan (en ObjC)

extension UINavigationController { func hideHairline() { if let hairline = findHairlineImageViewUnder(navigationBar) { hairline.isHidden = true } } func restoreHairline() { if let hairline = findHairlineImageViewUnder(navigationBar) { hairline.isHidden = false } } func findHairlineImageViewUnder(_ view: UIView) -> UIImageView? { if view is UIImageView && view.bounds.size.height <= 1.0 { return view as? UIImageView } for subview in view.subviews { if let imageView = self.findHairlineImageViewUnder(subview) { return imageView } } return nil } }


iOS 11 y Swift 4 Debe intentar seguir si desea eliminar el borde pero no hacer que la barra de navegación sea translúcida
self.navigationBar.shadowImage = UIImage()