Para iOS 13:
Use a .shadowColor
propriedade
Se essa propriedade for nula ou contiver a cor clara, a barra não exibirá sombra
Por exemplo:
let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence
Para iOS 12 e abaixo:
Para fazer isso, você deve definir uma imagem de sombra personalizada. Mas para que a imagem de sombra seja mostrada, você também precisa definir uma imagem de fundo personalizada, cite a documentação da Apple:
Para que uma imagem de sombra personalizada seja mostrada, uma imagem de plano de fundo personalizada também deve ser definida com o método setBackgroundImage (_: for :). Se a imagem de plano de fundo padrão for usada, a imagem de sombra padrão será usada, independentemente do valor dessa propriedade.
Assim:
let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
for: .default)
navigationBar.shadowImage = UIImage()
Acima está a única maneira "oficial" de escondê-lo. Infelizmente, remove a translucidez da barra.
Não quero imagem de fundo, apenas cor
Você tem essas opções:
Cor sólida, sem translucidez:
navigationBar.barTintColor = UIColor.redColor()
navigationBar.isTranslucent = false
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()
Crie uma pequena imagem de fundo cheia de cor e use-a.
Use o método 'hacky' descrito abaixo. Também manterá a barra translúcida.
Como manter a barra translúcida?
Para manter a translucidez, você precisa de outra abordagem, parece um hack, mas funciona bem. A sombra que estamos tentando remover é uma linha fina em UIImageView
algum lugar abaixo UINavigationBar
. Podemos encontrá-lo e ocultar / mostrar quando necessário.
As instruções abaixo assumem que você precisa de uma linha fina escondida em apenas um controlador de sua UINavigationController
hierarquia.
Declarar variável de instância:
private var shadowImageView: UIImageView?
Adicione um método que encontre essa sombra (linha fina) 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
}
Adicionar / 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
}
O mesmo método também deve funcionar para o UISearchBar
couro cabeludo e (quase) qualquer outra coisa que você precise ocultar :)
Muito obrigado a @Leo Natan pela ideia original!