Pour iOS 13:
Utilisez la .shadowColor
propriété
Si cette propriété est nulle ou contient la couleur claire, la barre n'affiche aucune ombre
Par exemple:
let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence
Pour iOS 12 et versions antérieures:
Pour ce faire, vous devez définir une image d'ombre personnalisée. Mais pour que l'image d'ombre soit affichée, vous devez également définir une image d'arrière-plan personnalisée, citant la documentation d'Apple:
Pour qu'une image d'ombre personnalisée soit affichée, une image d'arrière-plan personnalisée doit également être définie avec la méthode setBackgroundImage (_: for :). Si l'image d'arrière-plan par défaut est utilisée, l'image d'ombre par défaut sera utilisée quelle que soit la valeur de cette propriété.
Donc:
let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
for: .default)
navigationBar.shadowImage = UIImage()
Ci-dessus est le seul moyen "officiel" de le cacher. Malheureusement, il supprime la translucidité de la barre.
Je ne veux pas d'image d'arrière-plan, juste de la couleur
Vous avez ces options:
Couleur unie, pas de translucidité:
navigationBar.barTintColor = UIColor.redColor()
navigationBar.isTranslucent = false
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()
Créez une petite image d'arrière-plan remplie de couleurs et utilisez-la.
Utilisez la méthode «hacky» décrite ci-dessous. Il gardera également la barre translucide.
Comment garder la barre translucide?
Pour conserver la translucidité, vous avez besoin d'une autre approche, cela ressemble à un hack mais fonctionne bien. L'ombre que nous essayons de supprimer est une racine des cheveux UIImageView
quelque part en dessous UINavigationBar
. Nous pouvons le trouver et le masquer / afficher en cas de besoin.
Les instructions ci-dessous supposent que vous devez masquer les cheveux dans un seul contrôleur de votre UINavigationController
hiérarchie.
Déclarez la variable d'instance:
private var shadowImageView: UIImageView?
Ajouter une méthode qui trouve cette ombre (délié) 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
}
Ajouter / modifier des viewWillAppear/viewWillDisappear
méthodes:
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
}
La même méthode devrait également fonctionner pour les UISearchBar
cheveux et (presque) tout ce que vous devez cacher :)
Un grand merci à @Leo Natan pour l'idée originale!