W systemie iOS 13:
Użyj .shadowColor
nieruchomości
Jeśli ta właściwość jest równa zero lub zawiera czysty kolor, pasek nie wyświetla cienia
Na przykład:
let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence
Dla iOS 12 i niższych:
Aby to zrobić, należy ustawić niestandardowy obraz cienia. Ale aby pokazać obraz cienia, musisz również ustawić niestandardowy obraz tła, cytat z dokumentacji Apple:
Aby wyświetlić niestandardowy obraz cienia, niestandardowy obraz tła musi być również ustawiony za pomocą metody setBackgroundImage (_: for :). Jeśli zostanie użyty domyślny obraz tła, zostanie użyty domyślny obraz cienia, niezależnie od wartości tej właściwości.
Więc:
let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
for: .default)
navigationBar.shadowImage = UIImage()
Powyżej jest jedynym „oficjalnym” sposobem na ukrycie tego. Niestety usuwa przezroczystość paska.
Nie chcę obrazu tła, tylko kolor
Masz te opcje:
Jednolity kolor, bez półprzezroczystości:
navigationBar.barTintColor = UIColor.redColor()
navigationBar.isTranslucent = false
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()
Utwórz mały obraz tła wypełniony kolorem i użyj go.
Użyj metody „hacky” opisanej poniżej. Dzięki temu pasek będzie przezroczysty.
Jak zachować przejrzystość paska?
Aby zachować przejrzystość, potrzebujesz innego podejścia, wygląda to na hack, ale działa dobrze. Cień, który próbujemy usunąć, to linia włosów UIImageView
gdzieś pod UINavigationBar
. Możemy go znaleźć i ukryć / pokazać w razie potrzeby.
Poniższe instrukcje zakładają, że potrzebujesz linii włosów ukrytej tylko w jednym kontrolerze w Twojej UINavigationController
hierarchii.
Deklaracja zmiennej instancji:
private var shadowImageView: UIImageView?
Dodaj metodę, która znajdzie ten cień (linia włosów) 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
}
Dodaj / edytuj viewWillAppear/viewWillDisappear
metody:
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
}
Ta sama metoda powinna również działać w przypadku UISearchBar
linii włosów i (prawie) wszystkiego, co musisz ukryć :)
Ogromne podziękowania dla @Leo Natan za oryginalny pomysł!