Per iOS 13:
Usa la .shadowColor
proprietà
Se questa proprietà è nulla o contiene il colore chiaro, la barra non visualizza ombre
Per esempio:
let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence
Per iOS 12 e versioni precedenti:
Per fare ciò, è necessario impostare un'immagine ombra personalizzata. Ma per mostrare l'immagine ombra è necessario anche impostare un'immagine di sfondo personalizzata, citando la documentazione di Apple:
Per visualizzare un'immagine ombra personalizzata, è necessario impostare anche un'immagine di sfondo personalizzata con il metodo setBackgroundImage (_: for :). Se viene utilizzata l'immagine di sfondo predefinita, verrà utilizzata l'immagine ombra predefinita indipendentemente dal valore di questa proprietà.
Così:
let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
for: .default)
navigationBar.shadowImage = UIImage()
Sopra è l'unico modo "ufficiale" per nasconderlo. Sfortunatamente, rimuove la traslucenza della barra.
Non voglio un'immagine di sfondo, solo colore
Hai queste opzioni:
Tinta unita, nessuna traslucenza:
navigationBar.barTintColor = UIColor.redColor()
navigationBar.isTranslucent = false
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()
Crea una piccola immagine di sfondo piena di colore e usala.
Utilizzare il metodo "hacky" descritto di seguito. Manterrà anche la barra traslucida.
Come mantenere la barra traslucida?
Per mantenere la traslucenza hai bisogno di un altro approccio, sembra un hack ma funziona bene. L'ombra che stiamo cercando di rimuovere è un'attaccatura UIImageView
da qualche parte sotto UINavigationBar
. Possiamo trovarlo e nasconderlo / mostrarlo quando necessario.
Le istruzioni di seguito presuppongono che sia necessario nascondere l'attaccatura dei capelli solo in un controller della UINavigationController
gerarchia.
Dichiara variabile d'istanza:
private var shadowImageView: UIImageView?
Aggiungi metodo che trova questa ombra (attaccatura dei capelli) 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
}
Aggiungi / modifica viewWillAppear/viewWillDisappear
metodi:
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
}
Lo stesso metodo dovrebbe funzionare anche per l' UISearchBar
attaccatura dei capelli e (quasi) qualsiasi altra cosa che devi nascondere :)
Mille grazie a @Leo Natan per l'idea originale!