web-dev-qa-db-fra.com

Supprimer la bordure dans la barre de navigation dans swift

j'essaie de supprimer la bordure de navigationBars sans succès. J'ai fait des recherches et les gens semblent dire de mettre shadowImage et BackgroundImage sur nil, mais cela ne fonctionne pas dans mon cas.

Mon code

    self.navigationController?.navigationBar.barTintColor = UIColor(rgba: "#4a5866")
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
    self.navigationController?.navigationBar.shadowImage = UIImage(named: "")

illustration:

enter image description here

97
Peter Pik

Le problème est avec ces deux lignes:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
self.navigationController?.navigationBar.shadowImage = UIImage(named: "")

Puisque vous n'avez pas d'image sans nom, UIImage(named: "") retourne nil, ce qui signifie que le comportement par défaut est activé:

Si non nil, une image d'ombre personnalisée à afficher à la place de l'image d'ombre par défaut. Pour qu'une ombre personnalisée soit affichée, une image d'arrière-plan personnalisée doit également être définie avec -setBackgroundImage: forBarMetrics: (si l'image d'arrière-plan par défaut est utilisée, l'image d'ombre par défaut sera utilisée).

Vous avez besoin d'une image vraiment vide, il suffit donc d'initialiser avec UIImage():

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
252
Nate Cook

cela supprimera complètement l'image de l'ombre

for parent in self.navigationController!.navigationBar.subviews {
 for childView in parent.subviews {
     if(childView is UIImageView) {
         childView.removeFromSuperview()
     }
 }
}
35
Steve Payne

Avec Swift 2, vous pouvez le faire comme suit:

fichier AppDelegate

Application fonctionnelle à l'intérieur (..., didFinishLaunchingWithOptions launchOptions: ...)

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)

pour Swift 3:

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
31
Jorge Casariego

Il suffit d'écrire ceci dans l'extension de UINavigationBar

extension UINavigationBar {

    func shouldRemoveShadow(_ value: Bool) -> Void {
        if value {
            self.setValue(true, forKey: "hidesShadow")
        } else {
            self.setValue(false, forKey: "hidesShadow")
        }
    }
}

Et à vos yeux, le contrôleur ...

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.shouldRemoveShadow(true)        
}

Et pour que cela soit annulé pour tout viewController, il suffit de passer false.

29
Gaurav Chandarana

Swift 4 & Swift 5

Suppression de la bordure:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for:.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.layoutIfNeeded()

Restauration de la bordure:

self.navigationController?.navigationBar.setBackgroundImage(nil, for:.default)
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.layoutIfNeeded()
25

Définissez barStyle sur .Black avant de définir la teinte:

self.navigationController?.navigationBar.translucent = false
self.navigationController?.navigationBar.barStyle = .Black
self.navigationController?.navigationBar.barTintColor = UIColor.blueColor()
13
gpbl

La réponse de Luca Davanzo est excellente, mais cela ne fonctionne pas sous iOS 10. Je l'ai modifié pour qu'il fonctionne sous iOS 10 et inférieur.

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
            }
        }
    }
}

Vous pouvez également étendre UINavigationController et appeler cela ailleurs. removeFromSuperview() sur la ligne ne fonctionnera pas sur iOS 10; je viens donc de définir l'alpha sur 0 pour que cet appel soit compatible partout.

9
David Baez

Pour supprimer la bordure de UINavigationBar dans Swift 3+, utilisez:

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().isTranslucent = false
6
reza_khalafi

pour Swift 3

dans la méthode viewDidLoad

navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
5
Gulz

Mis à jour pour Swift 4 au cas où quelqu'un se poserait la question

navigationBar.shadowImage = UIImage()
navigationBar.backIndicatorImage = UIImage()

C'est encore moins verbeux maintenant.

4
Mauricio Chirino

Seulement cela a fonctionné pour moi,

self.navigationController?.navigationBar.shadowImage = UIImage()

Ref

3
Zaid Pathan

Voici le moyen de le faire sans changer la couleur de fond:

// 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()
        }
    }
}

REMARQUE: cela pourrait planter une application de production. Apparemment, la NavigationBar n'aime pas que sa vue disparaisse

3
Yariv Nissim

pour le Swift3, vous devriez écrire de manière légèrement différente:

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(),
    for: UIBarMetrics.default)
   self.navigationController?.navigationBar.shadowImage = UIImage()
1
Chetan Dobariya

Ceci est une version simplifiée de la réponse de Gaurav Chandarana .

extension UINavigationBar {

    func hideShadow(_ value: Bool = true) {
        setValue(value, forKey: "hidesShadow")
    }
}
1
Scott Gardner

La réponse acceptée a fonctionné pour moi, mais j'ai remarqué que lorsque je souhaitais que l'image de l'ombre réapparaisse lorsque vous reveniez en arrière ou que vous avanciez vers un autre vc, un clignotement perceptible apparaissait dans la barre de navigation.

En utilisant cette méthode navigationController?.navigationBar.setValue(true, forKey: "hidesShadow") dans viewWillAppear, la barre d’ombre est masquée dans le contrôleur de vue visible actuel.

Utiliser ces 2 méthodes

navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")

in viewWillDisappear le clignotement persiste, mais uniquement lorsque l'image ombrée réapparaît et non la barre de navigation elle-même.

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()
}
1
Lance Samaria

Délégué de l'application

UINavigationBar.appearance().setBackgroundImage(UIImage(), for: UIBarMetrics.default)
UINavigationBar.appearance().shadowImage = UIImage()
0
CSE 1994

La ligne de bordure est un UIImageView et la suppression d'une sous-vue qui est une imageView supprimera barButtonItems avec UIImageView. Le code ci-dessous vous aidera à le supprimer. J'espère que cela aide quelqu'un qui fait face à un problème comme moi.

for parent in self.navigationController!.navigationBar.subviews {
        for childView in parent.subviews {
            if childView.frame.height == 0.5 {
                childView.removeFromSuperview()
            }
        }
    }

La bordure UIImageView ne fait que 0,5 cm de hauteur, donc ce code ne l’enlève que.

0
bachman

Si vous souhaitez supprimer uniquement la ligne du bas et conserver la couleur unie de navigationBar, ajoutez ces lignes de code dans viewDidLoad: Swift 3, 4:

navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = false

Paix!

0
Mihail Salari

voici la réponse Swift 3 base de la réponse de Nate Cook

   self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
0
Alan

Dans AppDelegate, cela a globalement changé le format de la barre de navigation et supprime la ligne de fond/bordure:

 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()] }

N'a pas réussi à mettre en œuvre quelque chose de différent sur un VC spécifique, mais cela aidera 90% des gens

0
David West

iOS 11 et Swift 4 Vous devriez essayer de suivre si vous voulez supprimer la bordure mais ne pas rendre la barre de navigation translucide
self.navigationBar.shadowImage = UIImage()

0
BilalReffas