Para iOS 13:
Usa la .shadowColor
propiedad
Si esta propiedad es nula o contiene el color claro, la barra no muestra sombras
Por ejemplo:
let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence
Para iOS 12 y versiones inferiores:
Para hacer esto, debe establecer una imagen de sombra personalizada. Pero para que se muestre la imagen sombreada, también debe establecer una imagen de fondo personalizada, cite la documentación de Apple:
Para que se muestre una imagen de sombra personalizada, también se debe establecer 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, necesita otro enfoque, parece un truco pero funciona bien. La sombra que estamos tratando de eliminar es una rayita en UIImageView
algún lugar debajo UINavigationBar
. Podemos encontrarlo y ocultarlo / mostrarlo cuando sea necesario.
Las instrucciones a continuación suponen que necesita una línea oculta solo en un controlador de su UINavigationController
jerarquía.
Declarar variable de instancia:
private var shadowImageView: UIImageView?
Agregue un 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
rayita y (casi) cualquier otra cosa que necesite ocultar :)
¡Muchas gracias a @Leo Natan por la idea original!