Для iOS 13:
Використовуйте .shadowColor
майно
Якщо ця властивість є нульовою або містить чіткий колір, на панелі не відображається тіні
Наприклад:
let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence
Для iOS 12 і нижче:
Для цього слід встановити власне тіньове зображення. Але для показу тіньового зображення вам також потрібно встановити спеціальне фонове зображення, цитуючи документацію Apple:
Для відображення власного тіньового зображення також слід встановити спеціальне фонове зображення за допомогою методу setBackgroundImage (_: для :). Якщо використовується фонове зображення за замовчуванням, то тіньове зображення за замовчуванням буде використовуватися незалежно від значення цього властивості.
Тому:
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 за оригінальну ідею!