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:
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()
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()
}
}
}
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)
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.
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()
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()
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.
Pour supprimer la bordure de UINavigationBar dans Swift 3+, utilisez:
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().isTranslucent = false
pour Swift 3
dans la méthode viewDidLoad
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
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.
Seulement cela a fonctionné pour moi,
self.navigationController?.navigationBar.shadowImage = UIImage()
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
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()
Ceci est une version simplifiée de la réponse de Gaurav Chandarana .
extension UINavigationBar {
func hideShadow(_ value: Bool = true) {
setValue(value, forKey: "hidesShadow")
}
}
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()
}
Délégué de l'application
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: UIBarMetrics.default)
UINavigationBar.appearance().shadowImage = UIImage()
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.
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!
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()
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
iOS 11 et Swift 4 Vous devriez essayer de suivre si vous voulez supprimer la bordure mais ne pas rendre la barre de navigation translucideself.navigationBar.shadowImage = UIImage()