Удалить границу в навигацииБар в быстрой
Я пытаюсь удалить границу navigationBars без везения. Я исследовал, и люди, кажется, говорят, чтобы установить shadowImage и BackgroundImage в ноль, но это не работает в моем случае.
Мой код
self.navigationController?.navigationBar.barTintColor = UIColor(rgba: "#4a5866")
self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
self.navigationController?.navigationBar.shadowImage = UIImage(named: "")
иллюстрации:
![enter image description here]()
Ответы
Ответ 1
Проблема с этими двумя строками:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
self.navigationController?.navigationBar.shadowImage = UIImage(named: "")
Поскольку у вас нет изображения без имени, UIImage(named: "")
возвращает nil
, что означает, что поведение по умолчанию срабатывает в:
Когда не-ниль, настраивается теневое изображение вместо теневого изображения по умолчанию. Для того, чтобы пользовательский тень отображалась, пользовательское фоновое изображение также должно быть установлено с -setBackgroundImage: forBarMetrics: (если используется фоновое изображение по умолчанию, будет использоваться теневое изображение по умолчанию).
Вам нужно действительно пустое изображение, поэтому просто выполните инициализацию с помощью UIImage()
:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
Ответ 2
это полностью удалит теневое изображение
for parent in self.navigationController!.navigationBar.subviews {
for childView in parent.subviews {
if(childView is UIImageView) {
childView.removeFromSuperview()
}
}
}
Ответ 3
С Swift 2 вы можете сделать это следующим образом:
Файл AppDelegate
Внутри приложения func (..., didFinishLaunchingWithOptions launchOptions:...)
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
для Swift 3:
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
Ответ 4
Просто напишите это в расширении UINavigationBar
extension UINavigationBar {
func shouldRemoveShadow(_ value: Bool) -> Void {
if value {
self.setValue(true, forKey: "hidesShadow")
} else {
self.setValue(false, forKey: "hidesShadow")
}
}
}
И, по вашему мнению, контроллер...
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.shouldRemoveShadow(true)
}
И чтобы отменить это для любого viewController, просто передайте false.
Ответ 5
Swift 4 & Swift 5
Удаление границы:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for:.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.layoutIfNeeded()
Восстановление границы:
self.navigationController?.navigationBar.setBackgroundImage(nil, for:.default)
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.layoutIfNeeded()
Ответ 6
Задайте barStyle
- .Black
перед установкой оттенка:
self.navigationController?.navigationBar.translucent = false
self.navigationController?.navigationBar.barStyle = .Black
self.navigationController?.navigationBar.barTintColor = UIColor.blueColor()
Ответ 7
Ответ Luca Davanzo замечательный, но он не работает в iOS 10. Я изменил его для работы в iOS 10 и ниже.
for parent in navigationController!.view.subviews {
for child in parent.subviews {
for view in child.subviews {
if view is UIImageView && view.frame.height == 0.5 {
view.alpha = 0
}
}
}
}
Вы также можете расширить UINavigationController и вызывать это. removeFromSuperview()
в строке не будет работать на iOS 10, поэтому я просто устанавливаю альфа на 0, чтобы этот один вызов был совместим везде.
Ответ 8
Чтобы удалить границу с UINavigationBar в Swift 3+, используйте:
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().isTranslucent = false
Ответ 9
для быстрого 3
в viewDidLoad
метод
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
Ответ 10
Обновлен для Swift 4, если кому-то интересно
navigationBar.shadowImage = UIImage()
navigationBar.backIndicatorImage = UIImage()
Это еще менее многословно сейчас.
Ответ 11
Это так, если вы хотите сделать это, не меняя цвет фона:
// Remove the border ImageView from the NavigationBar background
func hideBottomBorder() {
for view in navigationBar.subviews.filter({ NSStringFromClass($0.dynamicType) == "_UINavigationBarBackground" }) as [UIView] {
if let imageView = view.subviews.filter({ $0 is UIImageView }).first as? UIImageView {
imageView.removeFromSuperview()
}
}
}
Примечание:
Это может привести к сбою в производственном приложении. По-видимому, NavigationBar не любит, чтобы его вид исчезал
Ответ 12
Только это сработало для меня,
self.navigationController?.navigationBar.shadowImage = UIImage()
Ссылка
Ответ 13
для swift3 вы должны написать несколько иначе:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(),
for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
Ответ 14
Это упрощенная версия ответа Гаурава Чандарана.
extension UINavigationBar {
func hideShadow(_ value: Bool = true) {
setValue(value, forKey: "hidesShadow")
}
}
Ответ 15
Принятый ответ сработал для меня, но я заметил, что когда я хотел, чтобы теневое изображение появлялось снова при возврате назад или нажатии на другой виртуальный канал, на навигационной панели было заметное мигание.
Используя этот метод navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
в viewWillAppear, теневая панель скрыта в текущем видимом контроллере представления.
Используя эти 2 метода
navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")
в viewWillDisappear мигание все еще происходит, но только когда появляется теневое изображение, а не сама панель навигации.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// 1. hide the shadow image in the current view controller you want it hidden in
navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
navigationController?.navigationBar.layoutIfNeeded()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
// 2. show the shadow image when pushing or popping in the next view controller. Only the shadow image will blink
navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")
navigationController?.navigationBar.layoutIfNeeded()
}
Ответ 16
Если вы хотите удалить только нижнюю строку и сохранить сплошной цвет панели навигации, добавьте эти строки кода в viewDidLoad: Swift 3, 4:
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = false
Мир!
Ответ 17
Swift 5
При использовании setBackgroundImage/shadowImage, чтобы скрыть линию волос, возникает небольшая задержка. Этот метод удаляет задержку. Благодарим Chameleon Framework. Это метод, который они используют (в ObjC)
extension UINavigationController {
func hideHairline() {
if let hairline = findHairlineImageViewUnder(navigationBar) {
hairline.isHidden = true
}
}
func restoreHairline() {
if let hairline = findHairlineImageViewUnder(navigationBar) {
hairline.isHidden = false
}
}
func findHairlineImageViewUnder(_ view: UIView) -> UIImageView? {
if view is UIImageView && view.bounds.size.height <= 1.0 {
return view as? UIImageView
}
for subview in view.subviews {
if let imageView = self.findHairlineImageViewUnder(subview) {
return imageView
}
}
return nil
}
}
Ответ 18
Граница - это UIImageView и удаление поднабора, которое является imageView, удалит barButtonItems с помощью UIImageView. Ниже код поможет вам удалить его. Надеюсь, это поможет кому-то, кто столкнулся с такой проблемой, как я.
for parent in self.navigationController!.navigationBar.subviews {
for childView in parent.subviews {
if childView.frame.height == 0.5 {
childView.removeFromSuperview()
}
}
}
Граница UIImageView имеет только 0,5 высоты, поэтому этот код удаляет только это.
Ответ 19
Внутри AppDelegate это глобально изменило формат NavBar и удалит нижнюю строку/границу:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().tintColor = UIColor.whiteColor()
UINavigationBar.appearance().barTintColor = UIColor.redColor()
UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().clipsToBounds = false
//UINavigationBar.appearance().backgroundColor = UIColor.redColor()
UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : (UIFont(name: "FONT NAME", size: 18))!, NSForegroundColorAttributeName: UIColor.whiteColor()] }
Не удалось реализовать что-то другое на конкретном VC, но это поможет 90% людей
Ответ 20
это ответ в быстрой 3-й базе ответа Nate Cook
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
Ответ 21
iOS 11 и Swift 4 Вам следует попробовать следовать, если вы хотите убрать границу, но не делаете навигационную панель полупрозрачной
self.navigationBar.shadowImage = UIImage()
Ответ 22
Приложение делегат
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: UIBarMetrics.default)
UINavigationBar.appearance().shadowImage = UIImage()
Ответ 23
в вашем пользовательском навигационном контроллере добавьте следующие строки:
self.navigationBar.setBackgroundImage(UIImage(), for:.default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.layoutIfNeeded()
Важное примечание
последняя строка важна, если вы используете метод первой строки viewDidLoad(), потому что navigationController должен перерисовать панель навигации, но вы легко можете использовать это без layoutIfNeeded() в методе viewWillAppear() до того, как он будет рисовать панель навигации