Comment masquer la ligne de fond de UINavigationBar 1px

443

J'ai une application qui a parfois besoin de sa barre de navigation pour se fondre dans le contenu.

Est-ce que quelqu'un sait comment se débarrasser ou changer la couleur de ce petit bar ennuyeux?

Sur l'image ci-dessous, la situation que j'ai - je parle de cette ligne de hauteur 1px sous "Root View Controller"

entrez la description de l'image ici

Szymon Kuczur
la source
comment augmenter 1px de hauteur de navigation?
Suresh Durishetti

Réponses:

738

Pour iOS 13:

Utilisez la .shadowColorpropriété

Si cette propriété est nulle ou contient la couleur claire, la barre n'affiche aucune ombre

Par exemple:

let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence

Pour iOS 12 et versions antérieures:

Pour ce faire, vous devez définir une image d'ombre personnalisée. Mais pour que l'image d'ombre soit affichée, vous devez également définir une image d'arrière-plan personnalisée, citant la documentation d'Apple:

Pour qu'une image d'ombre personnalisée soit affichée, une image d'arrière-plan personnalisée doit également être définie avec la méthode setBackgroundImage (_: for :). Si l'image d'arrière-plan par défaut est utilisée, l'image d'ombre par défaut sera utilisée quelle que soit la valeur de cette propriété.

Donc:

let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
                                                        for: .default)
navigationBar.shadowImage = UIImage()

Ci-dessus est le seul moyen "officiel" de le cacher. Malheureusement, il supprime la translucidité de la barre.

Je ne veux pas d'image d'arrière-plan, juste de la couleur

Vous avez ces options:

  1. Couleur unie, pas de translucidité:

    navigationBar.barTintColor = UIColor.redColor()
    navigationBar.isTranslucent = false
    navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationBar.shadowImage = UIImage()
  2. Créez une petite image d'arrière-plan remplie de couleurs et utilisez-la.

  3. Utilisez la méthode «hacky» décrite ci-dessous. Il gardera également la barre translucide.

Comment garder la barre translucide?

Pour conserver la translucidité, vous avez besoin d'une autre approche, cela ressemble à un hack mais fonctionne bien. L'ombre que nous essayons de supprimer est une racine des cheveux UIImageViewquelque part en dessous UINavigationBar. Nous pouvons le trouver et le masquer / afficher en cas de besoin.

Les instructions ci-dessous supposent que vous devez masquer les cheveux dans un seul contrôleur de votre UINavigationControllerhiérarchie.

  1. Déclarez la variable d'instance:

    private var shadowImageView: UIImageView?
  2. Ajouter une méthode qui trouve cette ombre (délié) 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
    }
  3. Ajouter / modifier des viewWillAppear/viewWillDisappearméthodes:

    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
    }

La même méthode devrait également fonctionner pour les UISearchBarcheveux et (presque) tout ce que vous devez cacher :)

Un grand merci à @Leo Natan pour l'idée originale!

Serhii Yakovenko
la source
104
Vous pouvez également définir la vue de la UINavigationBarpropriété:clipsToBounds = YES
cleverbit
3
@richarddas clipsToBounds = YESfonctionne comme un charme! Merci!
romeouald
3
Les clipsToBounds ne fonctionnent pas toujours pour certaines mises en page. Cette réponse a fonctionné parfaitement pour moi. Seulement, j'ai créé une sous-classe UINavigationBar et utilisé le code ci-dessus pour masquer l'image d'ombre dans les méthodes -layoutSubview. Merci!
cgossain
8
Juste pour noter que j'ai eu un problème où ma barre d'état supérieure iOS devient translucide et je pouvais voir ma vue de table défiler derrière la barre UINavigationBar. J'ai corrigé cela en définissant setTranslucent = NO.
Vlad
2
Dans iOS 10, il semble que lorsque viewWillAppear est appelé, nous ne pouvons pas obtenirshadowImageView
xi.lin
241

Ci-dessous peut aider simplement!

Rapide:

self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")

Objectif c:

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];
Vishnuvardhan
la source
6
Je suis sur Xcode 8 et développeur pour> iOS 8 et rien de ce qui précède n'a fonctionné pour moi, sauf celui-ci.
Vakas
2
Également sur XCode 8 et> iOS 8. C'est la seule réponse qui a fonctionné pour moi.
cloudcal
1
C'est la seule réponse courte et simple qui a fonctionné pour moi pour iOS 10 et Xcode 8.3.1. Merci mec.
Vishal Sonawane
1
Objective-C: self.navigationController.navigationBar.shadowImage = [UIImage nouveau];
Marcelo dos Santos
1
Seul cela fonctionne pour moi dans la version iOS 13.3.1 iPad.
Ravi
145

Si vous voulez simplement utiliser une couleur de barre de navigation solide et que vous l'avez configurée dans votre storyboard, utilisez ce code dans votre AppDelegateclasse pour supprimer la bordure de 1 pixel via le proxy d'apparence:

[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init]
                                  forBarPosition:UIBarPositionAny
                                      barMetrics:UIBarMetricsDefault];

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
Rick Pastoor
la source
2
Cela le rend global pour CHAQUE barre de navigation dans votre base de code ... la plupart du temps pas ce que vous voulez.
Christoph
97

Essaye ça:

[[UINavigationBar appearance] setBackgroundImage: [UIImage new]  
                                   forBarMetrics: UIBarMetricsDefault];

[UINavigationBar appearance].shadowImage = [UIImage new];

L'image ci-dessous a l'explication (barre de navigation iOS7):

entrez la description de l'image ici

Et vérifiez cette question SO: iOS7 - Changer la couleur de la bordure UINavigationBar

Tarek Hallak
la source
Comme l'a dit Serhii, une image d'arrière-plan personnalisée doit être définie pour que l'image d'ombre soit acceptée.
akashivskyy
3
faites-le dans votre AppDelegate.
myusuf3
Excellente réponse ... J'ai sauvé ma journée _ / \ _
Akshay
@RPM Fonctionne très bien dans iOS 7,8,9,10. Il existe le même code pour la barre de navigation de viewControlles en moyen pour Swift.
Akhrameev
64

Je voulais ajouter la version Swift de la réponse de Serhii. J'ai créé un UIBarExtension.swiftavec ce qui suit:

import Foundation
import UIKit

extension UINavigationBar {
    func hideBottomHairline() {
        self.hairlineImageView?.isHidden = true
    }

    func showBottomHairline() {
        self.hairlineImageView?.isHidden = false
    }
}

extension UIToolbar {
    func hideBottomHairline() {
        self.hairlineImageView?.isHidden = true
    }

    func showBottomHairline() {
        self.hairlineImageView?.isHidden = false
    }
}

extension UIView {
    fileprivate var hairlineImageView: UIImageView? {
        return hairlineImageView(in: self)
    }

    fileprivate func hairlineImageView(in view: UIView) -> UIImageView? {
        if let imageView = view as? UIImageView, imageView.bounds.height <= 1.0 {
            return imageView
        }

        for subview in view.subviews {
            if let imageView = self.hairlineImageView(in: subview) { return imageView }
        }

        return nil
    }
}
pxpgraphics
la source
Je vous remercie! Celui-ci devrait être la réponse.
PeiweiChen
Il fonctionne avec navigationBar mais ne fonctionne pas avec uitoolbar
TomSawyer
Je trouve qu'avec iOS 12, cela ne fonctionne plus. :(.
Chris Prince
Fonctionne très bien sur iOS 13
ttorbik
Celui-ci devrait être la réponse. fonctionne comme un charme dans iOS 13
COVID19
63

La façon rapide de le faire:

UINavigationBar.appearance().setBackgroundImage(
    UIImage(),
    forBarPosition: .Any,
    barMetrics: .Default)

UINavigationBar.appearance().shadowImage = UIImage()
OscarVGG
la source
2
Il est assez rare de descendre aussi loin dans la liste avant de trouver la réponse la plus élégante. +1!
sudo make install
3
Il masque tout l'arrière-plan de l'UINavigationBar tho: /
user365314
Faux, cela cache tout l'arrière-plan aussi!
TomSawyer
3
Remarque: vous devez définir la barre de navigation isTranslucent sur false
dmathewwws
19

Solution simple et rapide

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()
Jakub Průša
la source
3
+1 De toutes les réponses, c'est ce qui a finalement fonctionné pour moi. Il n'a pas gâché la barre d'état comme d'autres réponses, et il résout le problème de la modification d'une seule des barres du contrôleur de navigation, pas de toutes les barres de navigation du projet.
JoeGalind
Version Swift 4.2: navigationBar? .SetBackgroundImage (UIImage (), pour: UIBarPosition.any, barMetrics: UIBarMetrics.default) navigationBar? .ShadowImage = UIImage ()
airowe
16

Après avoir étudié la réponse de Serhil, j'ai créé un pod UINavigationBar + Addition qui peut facilement cacher la racine des cheveux.

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    UINavigationBar *navigationBar = self.navigationController.navigationBar;
    [navigationBar hideBottomHairline];
}
samwize
la source
16

Dans Swift 3.0

Modifiez votre AppDelegate.swiften ajoutant le code suivant à votre fonction d'application:

// Override point for customization after application launch.

// Remove border in navigationBar
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
smohn
la source
16

Depuis iOS 13, il existe une API système pour définir ou supprimer l'ombre

UIKit utilise shadowImage et la propriété shadowColor pour déterminer l'apparence de l'ombre. Lorsque shadowImage est nul, la barre affiche une ombre par défaut teintée en fonction de la valeur de la propriété shadowColor. Si shadowColor est nul ou contient la couleur clearColor, la barre n'affiche aucune ombre.

    let appearance = UINavigationBarAppearance()
    appearance.shadowImage = nil
    appearance.shadowColor = nil
    navigationController.navigationBar.standardAppearance = appearance

https://developer.apple.com/documentation/uikit/uibarappearance/3198009-shadowimage

glotcha
la source
shadowImage et shadowColor ne sont pas documentés dans les en- UINavigationBarAppearancetêtes !! Je ne le trouverais jamais. Merci, cela a résolu mes problèmes à 100%
Roger Oba
1
Oui, cela fonctionne bien pour moi aussi dans iOS 13, merci beaucoup @glotcha.
Yogesh Patel
@glotcha Right ....
Digvijay
Merci. la seule chose qui a fonctionné pour moi
alionthego
13

Peut également être caché de Storyboard (fonctionne sur Xcode 10.1)

En ajoutant un attribut d'exécution: hidesShadow - Boolean - True

entrez la description de l'image ici

Gagandeep Gambhir
la source
11

La solution de pxpgraphics mise à jour pour Swift 2.0

extension UINavigationBar {

    func hideBottomHairline()
    {
        hairlineImageViewInNavigationBar(self)?.hidden = true
    }

    func showBottomHairline()
    {
        hairlineImageViewInNavigationBar(self)?.hidden = false
    }

    private func hairlineImageViewInNavigationBar(view: UIView) -> UIImageView?
    {
        if let imageView = view as? UIImageView where imageView.bounds.height <= 1
        {
            return imageView
        }

        for subview: UIView in view.subviews
        {
            if let imageView = hairlineImageViewInNavigationBar(subview)
            {
                return imageView
            }
        }

        return nil
    }

}

extension UIToolbar
{

    func hideHairline()
    {
        let navigationBarImageView = hairlineImageViewInToolbar(self)?.hidden = true
    }

    func showHairline()
    {
        let navigationBarImageView = hairlineImageViewInToolbar(self)?.hidden = false
    }

    private func hairlineImageViewInToolbar(view: UIView) -> UIImageView?
    {
        if let imageView = view as? UIImageView where imageView.bounds.height <= 1
        {
            return imageView
        }

        for subview: UIView in view.subviews
        {
            if let imageView = hairlineImageViewInToolbar(subview)
            {
                return imageView
            }
        }

        return nil
    }

}
tf.alves
la source
Salut, nouveau sur iOS et essayant de m'enseigner. Comment utiliser l'extension? J'ai un fichier de contrôleur de vue et je mets ces extensions en dehors de la portée de la classe. Mais comment puis-je appeler hide / showHairline ()? Je ne comprends pas vraiment comment utiliser les extensions, mais c'est utilisé pour tant de solutions, mais je ne comprends tout simplement pas comment elles sont implémentées dans le code réel
Tommy K
Les extensions ajoutent des fonctionnalités à vos classes existantes. Toutes les classes, structures, énumérations, etc. étendues auront ces nouvelles fonctionnalités à votre disposition chaque fois que vous en aurez besoin. Voir plus ici: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
tf.alves
hm donc je devrais juste pouvoir utiliser UINavigationController().navigationBar/toolbar.hide/showBottomHairline()alors non? J'essaie, mais en vain. Suis-je pas bien compris?
Tommy K
11

Swift 4 // pour masquer la ligne d'ombre de la barre de navigation

navigationController?.navigationBar.shadowImage = UIImage()
Faris Muhammed
la source
10

J'utilise une extension UINavigationBar qui me permet de masquer / afficher cette ombre à l'aide de l'API UIAppearance ou de sélectionner la barre de navigation qui doit masquer / afficher cette ombre à l'aide de Storyboard (ou code source). Voici l'extension:

import UIKit

private var flatAssociatedObjectKey: UInt8 = 0

/*
  An extension that adds a "flat" field to UINavigationBar. This flag, when
  enabled, removes the shadow under the navigation bar.
 */
@IBDesignable extension UINavigationBar {
    @IBInspectable var flat: Bool {
        get {
            guard let obj = objc_getAssociatedObject(self, &flatAssociatedObjectKey) as? NSNumber else {
                return false
            }
            return obj.boolValue;
        }

        set {
            if (newValue) {
                let void = UIImage()
                setBackgroundImage(void, forBarPosition: .Any, barMetrics: .Default)
                shadowImage = void
            } else {
                setBackgroundImage(nil, forBarPosition: .Any, barMetrics: .Default)
                shadowImage = nil
            }
            objc_setAssociatedObject(self, &flatAssociatedObjectKey, NSNumber(bool: newValue),
                    objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

Maintenant, pour désactiver l'ombre sur toutes les barres de navigation, vous devez utiliser:

UINavigationBar.appearance().flat = true

Ou vous pouvez activer / désactiver ce comportement à l'aide de storyboards:

Storyboard de la barre de navigation

Alvivi
la source
@ NunoGonçalves, vous pouvez penser flatAssociatedObjectKeycomme un int unique (traité comme un pointeur) pour identifier votre objet associé. Ici est défini par l'adresse mémoire d'un var privé. J'ai mis à jour la réponse pour ajouter cette var. Voir nshipster.com/associated-objects pour plus d'informations.
Alvivi
Bonne solution mais ne fonctionne que lorsque la barre de navigation est définie translucentsur false
ZYiOS
9

Swift 4 testé une SOLUTION D'UNE LIGNE

Dans Viewdidload() Définir la valeur userdefault du contrôleur de navigation true pour la clé "hidesShadow"

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")

}
Sachin Rasane
la source
1
Fonctionne parfaitement !!
Prashant Tukadiya
7

Swift a mis cela

UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: .Any, barMetrics: .Default)
UINavigationBar.appearance().shadowImage = UIImage()

dans

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
UnRewa
la source
Et il supprime également la couleur d'arrière-plan.
TomSawyer
7

Une autre option si vous souhaitez conserver la translucidité et que vous ne voulez pas sous-classer tous UINavigationControllerdans votre application:

#import <objc/runtime.h>

@implementation UINavigationController (NoShadow)

+ (void)load {
    Method original = class_getInstanceMethod(self, @selector(viewWillAppear:));
    Method swizzled = class_getInstanceMethod(self, @selector(swizzled_viewWillAppear:));
    method_exchangeImplementations(original, swizzled);
}

+ (UIImageView *)findHairlineImageViewUnder:(UIView *)view {
    if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
        return (UIImageView *)view;
    }

    for (UIView *subview in view.subviews) {
        UIImageView *imageView = [self findHairlineImageViewUnder:subview];
        if (imageView) {
            return imageView;
        }
    }

    return nil;
}

- (void)swizzled_viewWillAppear:(BOOL)animated {
    UIImageView *shadow = [UINavigationController findHairlineImageViewUnder:self.navigationBar];
    shadow.hidden = YES;

    [self swizzled_viewWillAppear:animated];
}

@end
jhurliman
la source
6
Slightly Swift Solution 
func setGlobalAppearanceCharacteristics () {
    let navigationBarAppearace = UINavigationBar.appearance()
    navigationBarAppearace.tintColor = UIColor.white
    navigationBarAppearace.barTintColor = UIColor.blue
    navigationBarAppearace.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    navigationBarAppearace.shadowImage = UIImage()

}
James
la source
Merci James! Je ne comprends pas pourquoi quelqu'un a voté contre votre réponse.
Dănuț Mihai Florian
si vous en avez besoin, vous pouvez également ajouter: self.navigationController.navigationBar.translucent = false self.navigationController.navigationBar.clipsToBounds = false self.navigationController.navigationBar.shadowImage = UIImage () self.navigationController.navigationColorCarroller.navigation ()
Alessandro Ornano
5

Solution dans Swift 4.2:

private func removeHairlineFromNavbar() {
    UINavigationBar.appearance().setBackgroundImage(
        UIImage(),
        for: .any,
        barMetrics: .default)
    UINavigationBar.appearance().shadowImage = UIImage()
}

Il suffit de mettre cette fonction sur le premier Viewcontroller et de l'appeler viewdidload

Mattk90
la source
4

En iOS8, si vous définissez UINavigationBar.barStyleà.Black vous pouvez définir l'arrière-plan de la barre en couleur unie sans bordure.

Dans Swift:

UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barStyle = UIBarStyle.Black
UINavigationBar.appearance().barTintColor = UIColor.redColor()
gpbl
la source
C'est la solution la plus propre et la meilleure façon d'y parvenir. Si vous n'avez pas à prendre en charge <iOS 8, il n'y a aucune raison de ne pas utiliser cette réponse. Merci.
user3344977
Fonctionne très bien. Je l'ai également placé dans le storyboard, donc je n'ai même pas eu besoin de code.
vikzilla
1
Cela vous donne une toute petite ligne blanche au lieu de l'ombre standard.
Vegard
4

Solution en deux lignes qui fonctionne pour moi. Essayez d'ajouter ceci dans la méthode ViewDidLoad:

navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
self.extendedLayoutIncludesOpaqueBars = true
Evgenii Mokeev
la source
seulement cela a fonctionné pour moi
Usama bin Attique
3

Voici une solution très simple:

self.navigationController.navigationBar.clipsToBounds = YES;
user3344977
la source
37
La zone de la barre d'état est également tronquée.
Fury
3

Solution simple - Swift 5

  1. Créez une extension:

    extension UIImage {
    
        class func hideNavBarLine(color: UIColor) -> UIImage? {
    
            let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()
            context?.setFillColor(color.cgColor)
            context?.fill(rect)
    
    
            let navBarLine = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return navBarLine
        }
    }
  2. Ajoutez ceci à viewDidLoad():

    self.navigationController?.navigationBar.shadowImage = UIImage.hideNavBarLine(color: UIColor.clear)
Bandyliuk
la source
2

Pour les utilisateurs d'iOS 9, cela a fonctionné pour moi. ajoutez simplement ceci:

UINavigationBar.appearance().shadowImage = UIImage()
Mariano Pardo
la source
2

Le problème avec la définition d'une image d'arrière-plan est qu'il supprime le flou. Vous pouvez le supprimer sans définir d'image d'arrière-plan. Voir ma réponse ici .

Leo Natan
la source
2

Vous devez ajouter une vue au bas de l'UISearchBar

let rect = searchController.searchBar.frame;
let lineView : UIView = UIView.init(frame: CGRect.init(x: 0, y: rect.size.height-1, width: rect.size.width, height: 1))
lineView.backgroundColor = UIColor.init(hexString: "8CC73E")
searchController.searchBar.addSubview(lineView)
Socheat
la source
Je ne peux pas croire que c'est toujours un problème - je viens de le rencontrer à nouveau! Mais cette solution est la meilleure possible pour le moment; Merci @Socheat
RichAppz
1

Je sais que c'est un vieux fil, mais j'ai trouvé une solution qui fonctionne vraiment bien:

Sous-classe UINavigationBar. Dans votre sous-classe UINavigationBar, remplacez didAddSubview par le code suivant:

- (void)didAddSubview:(UIView *)subview
{
    [super didAddSubview:subview];

    if ([subview isKindOfClass:[UIImageView class]]) {
        [subview setClipsToBounds:YES];
    }
}
Joel Middendorf
la source
1

Je viens de créer une extension pour cela ... Désolé pour le formatage (c'est ma première réponse).

Usage:

  override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.hideShadow = true
}

Extension:

 UINavigationController.swift
//  Created by Ricardo López Rey on 16/7/15.

import Foundation


struct UINavigationControllerExtension {
    static var hideShadowKey : String = "HideShadow"
static let backColor = UIColor(red: 247/255, green: 247/255, blue: 248/255, alpha: 1.0)
}

extension UINavigationController {

    var hideShadow : Bool {
        get {
            if let ret =  objc_getAssociatedObject(self, &UINavigationControllerExtension.hideShadowKey) as? Bool {
                return ret
            } else {
                return false
            }


        }
        set {
            objc_setAssociatedObject(self,&UINavigationControllerExtension.hideShadowKey,newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))

            if newValue {


            self.navigationBar.setBackgroundImage(solidImage(UINavigationControllerExtension.backColor), forBarMetrics: UIBarMetrics.Default)

                self.navigationBar.shadowImage = solidImage(UIColor.clearColor())
            } else {
                self.navigationBar.setBackgroundImage(nil, forBarMetrics: UIBarMetrics.Default)
            }
        }
    }

    private func solidImage(color: UIColor, size: CGSize = CGSize(width: 1,height: 1)) -> UIImage {
        var rect = CGRectMake(0, 0, size.width, size.height)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        color.setFill()
        UIRectFill(rect)
        var image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }


}
Ricardo LR
la source
1

Dans AppDelegate , cela a globalement changé le format de la 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()] }

N'ont pas réussi à implémenter quelque chose de différent sur un VC spécifique, mais cela aidera 90% des personnes

David West
la source
1
-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    UIImage *emptyImage = [UIImage new];
    self.navigationController.navigationBar.shadowImage = emptyImage;
    [self.navigationController.navigationBar setBackgroundImage:emptyImage forBarMetrics:UIBarMetricsDefault];
}
Nik Kov
la source