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()