Для iOS 13:
Используйте .shadowColor
собственность
Если это свойство равно нулю или содержит чистый цвет, на панели не отображается тень
Например:
let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence
Для iOS 12 и ниже:
Для этого вам необходимо установить собственное теневое изображение. Но для отображения теневого изображения вам также необходимо установить собственное фоновое изображение, цитата из документации Apple:
Чтобы отображалось пользовательское теневое изображение, пользовательское фоновое изображение также должно быть установлено с помощью метода setBackgroundImage (_: for :). Если используется фоновое изображение по умолчанию, то теневое изображение по умолчанию будет использоваться независимо от значения этого свойства.
Так:
let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
for: .default)
navigationBar.shadowImage = UIImage()
Выше - единственный «официальный» способ скрыть это. К сожалению, это устраняет прозрачность бара.
Я не хочу фоновое изображение, просто цвет
У вас есть эти варианты:
Сплошной цвет, нет прозрачности:
navigationBar.barTintColor = UIColor.redColor()
navigationBar.isTranslucent = false
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()
Создайте небольшое фоновое изображение, заполненное цветом и используйте его.
Используйте «хакерский» метод, описанный ниже. Это также будет держать бар прозрачным.
Как сохранить бар прозрачным?
Чтобы сохранить прозрачность, вам нужен другой подход, он выглядит как хак, но работает хорошо. Тень, которую мы пытаемся удалить, это UIImageView
где-то линия волос UINavigationBar
. Мы можем найти его и спрятать / показать, когда это необходимо.
Инструкции ниже предполагают, что вам нужно скрыть волосковую линию только в одном контроллере вашего UINavigationController
иерархии.
Объявите переменную экземпляра:
private var shadowImageView: UIImageView?
Добавить метод, который находит эту тень (линия роста волос) 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
}
Добавить / редактировать viewWillAppear/viewWillDisappear
методы:
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
}
Тот же метод должен также работать для UISearchBar
волосяного покрова и (почти) всего, что вам нужно скрыть :)
Большое спасибо @Leo Natan за оригинальную идею!