Für iOS 13:
Verwenden Sie die .shadowColor
Eigenschaft
Wenn diese Eigenschaft nil ist oder die klare Farbe enthält, zeigt die Leiste keinen Schatten an
Zum Beispiel:
let navigationBar = navigationController?.navigationBar
let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearance
Für iOS 12 und früher:
Um dies zu tun, sollten Sie ein benutzerdefiniertes Schattenbild festlegen. Aber damit das Schattenbild angezeigt wird, müssen Sie auch ein benutzerdefiniertes Hintergrundbild festlegen, Zitat aus der Apple-Dokumentation:
Um ein benutzerdefiniertes Schattenbild anzuzeigen, muss auch ein benutzerdefiniertes Hintergrundbild mit der Methode setBackgroundImage(_:for:)
festgelegt werden. Wenn das Standardhintergrundbild verwendet wird, wird unabhängig vom Wert dieser Eigenschaft das Standard-Schattenbild verwendet.
Also:
let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
for: .default)
navigationBar.shadowImage = UIImage()
Oben ist der einzige "offizielle" Weg, um es zu verbergen. Leider entfernt es die Transparenz der Leiste.
Ich möchte kein Hintergrundbild, nur Farbe.
Sie haben diese Optionen:
-
Einfarbige Farbe, keine Transparenz:
navigationBar.barTintColor = UIColor.redColor()
navigationBar.isTranslucent = false
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()
-
Kleines Hintergrundbild in Farbe erstellen und verwenden.
-
Verwenden Sie die unten beschriebene 'hacky' Methode. Sie wird die Leiste auch transparent halten.
Wie bleibt die Leiste transparent?
Um die Transparenz beizubehalten, benötigen Sie einen anderen Ansatz, der wie ein Hack aussieht, aber gut funktioniert. Der Schatten, den wir entfernen möchten, ist ein Haarlinien-UIImageView
irgendwo unter UINavigationBar
. Wir können es finden und bei Bedarf ausblenden/einblenden.
Die nachfolgenden Anweisungen gehen davon aus, dass Sie die Haarlinie nur in einem Controller Ihrer UINavigationController
-Hierarchie ausblenden müssen.
-
Deklarieren Sie eine Instanzvariable:
private var shadowImageView: UIImageView?
-
Fügen Sie eine Methode hinzu, die dieses Schatten (Haarlinien) UIImageView
findet:
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
}
-
Fügen Sie viewWillAppear/viewWillDisappear
Methoden hinzu/bearbeiten Sie diese:
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
}
Dieselbe Methode sollte auch für die Haarlinie der UISearchBar
, und (fast) alles andere, was Sie ausblenden müssen, funktionieren :)
Vielen Dank an @Leo Natan für die ursprüngliche Idee!