Cómo ocultar la línea inferior de UINavigationBar 1px

Resuelto Szymon Kuczur asked hace 54 años • 50 respuestas

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".

ingrese la descripción de la imagen aquí

Szymon Kuczur avatar Jan 01 '70 08:01 Szymon Kuczur
Aceptado

Para iOS 13:

Usa la .shadowColorpropiedad

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:

  1. Color sólido, sin translucidez:

     navigationBar.barTintColor = UIColor.redColor()
     navigationBar.isTranslucent = false
     navigationBar.setBackgroundImage(UIImage(), for: .default)
     navigationBar.shadowImage = UIImage()
    
  2. Crea una pequeña imagen de fondo llena de color y úsala.

  3. 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 UIImageViewen 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 UINavigationControllerjerarquía.

  1. Declarar variable de instancia:

    private var shadowImageView: UIImageView?
    
  2. 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
    }
    
  3. Agregar/editar viewWillAppear/viewWillDisappearmé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 UISearchBarla línea del cabello y (casi) cualquier otra cosa que necesites ocultar :)

¡Muchas gracias a @Leo Natan por la idea original!

Serhii Yakovenko avatar Oct 07 '2013 14:10 Serhii Yakovenko

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"];
Vishnuvardhan avatar Aug 03 '2016 13:08 Vishnuvardhan

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 AppDelegateclase 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]];
Rick Pastoor avatar Oct 27 '2013 09:10 Rick Pastoor

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

ingrese la descripción de la imagen aquí

Y consulte esta pregunta SO: iOS7: cambie el color del borde de UINavigationBar

Tarek Hallak avatar Oct 07 '2013 14:10 Tarek Hallak