Удалить границу в навигацииБар в быстрой

Я пытаюсь удалить границу 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() до того, как он будет рисовать панель навигации