Cómo ocultar la línea inferior de UINavigationBar 1px
Tengo una aplicación que a veces necesita que su barra de navegación se mezcle con el contenido.
¿Alguien sabe cómo deshacerse o cambiar el color de esta pequeña y molesta barra?
En la imagen de abajo, tengo la situación que tengo: estoy hablando de esta línea de altura de 1 px debajo de "Controlador de vista raíz".
Para iOS 13:
Usa la .shadowColor
propiedad
Si esta propiedad es nula o contiene el color claro, la barra no muestra sombra
Por ejemplo:
let navigationBar = navigationController?.navigationBar
let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearance
Para iOS 12 y versiones anteriores:
Para hacer esto, debes configurar una imagen de sombra personalizada. Pero para que se muestre la imagen de la sombra también es necesario configurar una imagen de fondo personalizada, cita de la documentación de Apple:
Para que se muestre una imagen de sombra personalizada, también se debe configurar una imagen de fondo personalizada con el método setBackgroundImage(_:for:). Si se utiliza la imagen de fondo predeterminada, se utilizará la imagen de sombra predeterminada independientemente del valor de esta propiedad.
Entonces:
let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
for: .default)
navigationBar.shadowImage = UIImage()
Arriba está la única forma "oficial" de ocultarlo. Desafortunadamente, elimina la translucidez de la barra.
No quiero imagen de fondo, solo color.
Tienes esas opciones:
Color sólido, sin translucidez:
navigationBar.barTintColor = UIColor.redColor() navigationBar.isTranslucent = false navigationBar.setBackgroundImage(UIImage(), for: .default) navigationBar.shadowImage = UIImage()
Crea una pequeña imagen de fondo llena de color y úsala.
Utilice el método 'hacky' que se describe a continuación. También mantendrá la barra translúcida.
¿Cómo mantener la barra translúcida?
Para mantener la translucidez necesitas otro enfoque, parece un truco pero funciona bien. La sombra que intentamos eliminar es una línea de cabello UIImageView
en algún lugar debajo UINavigationBar
. Podemos encontrarlo y ocultarlo/mostrarlo cuando sea necesario.
Las instrucciones a continuación suponen que necesita una línea fina oculta solo en un controlador de su UINavigationController
jerarquía.
Declarar variable de instancia:
private var shadowImageView: UIImageView?
Agregar método que encuentre esta sombra (rayita)
UIImageView:
private func findShadowImage(under view: UIView) -> UIImageView? { if view is UIImageView && view.bounds.size.height <= 1 { return (view as! UIImageView) } for subview in view.subviews { if let imageView = findShadowImage(under: subview) { return imageView } } return nil }
Agregar/editar
viewWillAppear/viewWillDisappear
métodos:override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if shadowImageView == nil { shadowImageView = findShadowImage(under: navigationController!.navigationBar) } shadowImageView?.isHidden = true } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) shadowImageView?.isHidden = false }
El mismo método también debería funcionar para UISearchBar
la línea del cabello y (casi) cualquier otra cosa que necesites ocultar :)
¡Muchas gracias a @Leo Natan por la idea original!
Aquí está el truco. Dado que funciona en rutas clave, podría romperse en el futuro. Pero por ahora funciona como se esperaba.
Rápido:
self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
C objetivo:
[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];
Si solo desea usar un color sólido en la barra de navegación y lo ha configurado en su guión gráfico, use este código en su AppDelegate
clase para eliminar el borde de 1 píxel a través del proxy de apariencia:
[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init]
forBarPosition:UIBarPositionAny
barMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
Prueba esto:
[[UINavigationBar appearance] setBackgroundImage: [UIImage new]
forBarMetrics: UIBarMetricsDefault];
[UINavigationBar appearance].shadowImage = [UIImage new];
La imagen de abajo tiene la explicación (barra de navegación de iOS7):
Y consulte esta pregunta SO: iOS7: cambie el color del borde de UINavigationBar