Como ocultar a linha inferior do UINavigationBar 1px

443

Eu tenho um aplicativo que às vezes precisa da barra de navegação para se misturar ao conteúdo.

Alguém sabe como se livrar ou mudar a cor desse barzinho chato?

Na imagem abaixo da situação que tenho - estou falando dessa linha de 1px de altura abaixo de "Root View Controller"

insira a descrição da imagem aqui

Szymon Kuczur
fonte
Veja o exemplo a
seguir
como aumentar 1px da altura da navegação?
Suresh Durishetti

Respostas:

738

Para iOS 13:

Use a .shadowColorpropriedade

Se essa propriedade for nula ou contiver a cor clara, a barra não exibirá sombra

Por exemplo:

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

Para iOS 12 e abaixo:

Para fazer isso, você deve definir uma imagem de sombra personalizada. Mas para que a imagem de sombra seja mostrada, você também precisa definir uma imagem de fundo personalizada, cite a documentação da Apple:

Para que uma imagem de sombra personalizada seja mostrada, uma imagem de plano de fundo personalizada também deve ser definida com o método setBackgroundImage (_: for :). Se a imagem de plano de fundo padrão for usada, a imagem de sombra padrão será usada, independentemente do valor dessa propriedade.

Assim:

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

Acima está a única maneira "oficial" de escondê-lo. Infelizmente, remove a translucidez da barra.

Não quero imagem de fundo, apenas cor

Você tem essas opções:

  1. Cor sólida, sem translucidez:

    navigationBar.barTintColor = UIColor.redColor()
    navigationBar.isTranslucent = false
    navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationBar.shadowImage = UIImage()
    
  2. Crie uma pequena imagem de fundo cheia de cor e use-a.

  3. Use o método 'hacky' descrito abaixo. Também manterá a barra translúcida.

Como manter a barra translúcida?

Para manter a translucidez, você precisa de outra abordagem, parece um hack, mas funciona bem. A sombra que estamos tentando remover é uma linha fina em UIImageViewalgum lugar abaixo UINavigationBar. Podemos encontrá-lo e ocultar / mostrar quando necessário.

As instruções abaixo assumem que você precisa de uma linha fina escondida em apenas um controlador de sua UINavigationControllerhierarquia.

  1. Declarar variável de instância:

    private var shadowImageView: UIImageView?
  2. Adicione um método que encontre essa sombra (linha fina) 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. Adicionar / editar viewWillAppear/viewWillDisappearmétodos:

    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
    }
    

O mesmo método também deve funcionar para o UISearchBarcouro cabeludo e (quase) qualquer outra coisa que você precise ocultar :)

Muito obrigado a @Leo Natan pela ideia original!

Serhii Yakovenko
fonte
103
Você também pode definir a vista da UINavigationBarpropriedade:clipsToBounds = YES
cleverbit
3
@richarddas clipsToBounds = YESfunciona como um encanto! Obrigado!
Romeouald
3
O clipsToBounds nem sempre funciona para alguns layouts. Essa resposta funcionou perfeita para mim. Somente criei uma subclasse UINavigationBar e usei o código acima para ocultar a imagem de sombra nos métodos -layoutSubview. Obrigado!
Cgossain
7
Só para observar que tive um problema em que minha barra de status superior do iOS se tornou translúcida e pude ver minha exibição de tabela rolando atrás da UINavigationBar. Corrigi isso definindo setTranslucent = NO.
Vlad
2
Em iOS 10 parece que quando viewWillAppear é chamado não podemos chegarshadowImageView
xi.lin
241

Abaixo pode ajudar simplesmente!

Rápido:

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

Objetivo C:

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];
Vishnuvardhan
fonte
6
Estou no Xcode 8 e desenvolvo para o iOS 8 e nenhuma das opções acima funcionou para mim, exceto esta.
Vakas 22/09/16
2
Também no XCode 8 e> iOS 8. Essa é a única resposta que funcionou para mim.
cloudcal
1
Esta é a única resposta curta e simples que funcionou para mim no iOS 10 e no Xcode 8.3.1. Obrigado cara.
Vishal Sonawane
1
Objetivo-C: self.navigationController.navigationBar.shadowImage = [UIImage new];
Marcelo dos Santos
1
Só isso funciona para mim no iOS 13.3.1 Versão iPad.
Ravi
145

Se você deseja apenas usar uma cor sólida da barra de navegação e configurou isso no seu storyboard, use este código na sua AppDelegateclasse para remover a borda de 1 pixel por meio do proxy de aparência:

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

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
Rick Pastoor
fonte
2
Isso o define global para TODAS as barras de navegação em sua base de código ... na maioria das vezes não é o que você deseja.
Christoph
97

Tente o seguinte:

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

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

A imagem abaixo tem a explicação (iOS7 NavigationBar):

insira a descrição da imagem aqui

E verifique esta pergunta do SO: iOS7 - Alterar a cor da borda do UINavigationBar

Tarek Hallak
fonte
Como Serhii disse, uma imagem de plano de fundo personalizada deve ser definida para que a imagem de sombra seja aceita.
Akashivskyy
3
faça isso no seu AppDelegate.
myusuf3
Ótima resposta ... Salvei o meu dia _ / \ _
Akshay
O @RPM funciona muito bem no iOS 7,8,9,10. Existe o mesmo código para a barra de navegação do viewControlles na mídia do Swift.
Akhrameev 10/01
64

Queria adicionar a versão Swift da resposta de Serhii. Eu criei um UIBarExtension.swiftcom o seguinte:

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
fonte
Obrigado! Este deve ser a resposta.
PeiweiChen
Ele funciona com NavigationBar mas não funciona com UIToolbar
TomSawyer
Estou descobrindo que com o iOS 12 isso não está mais funcionando. :(.
Chris Prince
Funciona muito bem iOS 13
ttorbik
Este deve ser a resposta. funciona como charme em ios 13
COVID19
63

A maneira rápida de fazer isso:

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

UINavigationBar.appearance().shadowImage = UIImage()
OscarVGG
fonte
2
É muito raro chegar tão longe na lista antes de encontrar a resposta mais elegante. +1!
sudo make install
3
Ele oculta todo o plano de fundo do UINavigationBar tho: /
user365314 3/15
Errado, esconde todo o fundo também!
TomSawyer
3
Nota: você deve definir isTranslucent da barra de navegação como false
dmathewwws
19

Solução simples em rápida

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()
Jakub Průša
fonte
3
+1 De todas as respostas, foi isso que finalmente funcionou para mim. Ele não atrapalhou a barra de status como outras respostas e soluciona o problema de alterar apenas uma das barras do controlador de navegação, nem todas as barras de navegação no projeto.
JoeGalind
Swift 4.2 versão: navigationBar? .SetBackgroundImage (UIImage (), para: UIBarPosition.any, barMetrics: UIBarMetrics.default) navigationBar? .ShadowImage = UIImage ()
airowe
16

Depois de estudar a resposta de Serhil, criei um pod UINavigationBar + Addition que pode ocultar facilmente a linha do cabelo.

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

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

No Swift 3.0

Edite seu AppDelegate.swiftadicionando o seguinte código à sua função de aplicativo:

// Override point for customization after application launch.

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

No iOS 13, existe uma API do sistema para definir ou remover a sombra

O UIKit usa shadowImage e a propriedade shadowColor para determinar a aparência da sombra. Quando shadowImage é nulo, a barra exibe uma sombra padrão pintada de acordo com o valor na propriedade shadowColor. Se shadowColor for nulo ou contiver a cor clearColor, a barra não exibirá sombra.

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

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

glotcha
fonte
shadowImage e shadowColor não estão documentados nos UINavigationBarAppearancecabeçalhos !! Eu nunca o encontraria. Obrigado, isso resolvido meus problemas de 100%
Roger Oba
1
Sim, está funcionando bem para mim também no iOS 13, muito obrigado @glotcha.
Yogesh Patel
@glotcha Right ....
Digvijay
obrigado. a única coisa que funcionou para mim
alionthego 18/03
13

Também pode ser oculto no Storyboard (trabalhando no Xcode 10.1)

Adicionando o atributo runtime: hidesShadow - Boolean - True

insira a descrição da imagem aqui

Gagandeep Gambhir
fonte
11

Solução da pxpgraphics atualizada para o 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
fonte
Olá, novo no iOS e tentando me ensinar. Como uso a extensão? Eu tenho um arquivo de controlador de exibição e coloquei essas extensões fora do escopo da classe. Mas como chamo hide / showHairline ()? Não realmente entender como usar extensões, mas a sua utilizado para tantas soluções, mas eu só não entendo como eles são implementados no código real
Tommy K
As extensões adicionam funcionalidade às suas classes existentes. Qualquer classe estendida, estrutura, enum, etc, terá esses novos recursos disponíveis sempre que você precisar usá-los. Veja mais aqui: developer.apple.com/library/ios/documentation/Swift/Conceptual/...
tf.alves
hm, então eu deveria ser capaz de usar, UINavigationController().navigationBar/toolbar.hide/showBottomHairline()então não? Estou tentando isso, mas sem sucesso. Não estou entendendo corretamente?
Tommy K
11

Swift 4 // para ocultar a linha de sombra da barra de navegação

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

Uso uma extensão UINavigationBar que permite ocultar / mostrar essa sombra usando a API UIAppearance ou selecionar qual barra de navegação deve ocultar / mostrar essa sombra usando o Storyboard (ou código-fonte). Aqui está a extensão:

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

Agora, para desativar a sombra em todas as barras de navegação, você deve usar:

UINavigationBar.appearance().flat = true

Ou você pode ativar / desativar esse comportamento usando storyboards:

Storyboard da barra de navegação

Alvivi
fonte
@ NunoGonçalves, você pode pensar flatAssociatedObjectKeycomo um int exclusivo (tratado como ponteiro) para identificar seu objeto associado. Aqui é definido pelo endereço de memória de uma var privada. Eu atualizei a resposta para adicionar esta var. Consulte nshipster.com/associated-objects para obter mais informações.
Alvivi 29/10/2015
Boa solução, mas funciona apenas quando a barra de navegação é definido translucentcomo falso
ZYiOS
9

Swift 4 testado ONE LINE SOLUTION

No Viewdidload() valor definido por padrão do usuário do controlador Set Navigation true para a chave "hidesShadow"

override func viewDidLoad() {
    super.viewDidLoad()

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

}
Sachin Rasane
fonte
1
Funcionando perfeitamente !!
Prashant Tukadiya
7

Swift colocou isso

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

no

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
UnRewa
fonte
E remove a cor de fundo também.
TomSawyer
7

Outra opção, se você deseja preservar a translucidez e não deseja subclassificar todos os UINavigationControlleraplicativos:

#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
fonte
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
fonte
Obrigado James! Não consigo entender por que alguém votou na sua resposta.
Dănuț Mihai Florian
se você precisar, também pode incluir: self.navigationController.navigationBar.translucent = false self.navigationController.navigationBar.clipsToBounds = false self.navigationController.navigationBar.shadowImage = UIImage () self.navigationController.navigationBar.backgroundColor ()
Alessandro Ornano
5

Solução no Swift 4.2:

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

Basta colocar esta função no primeiro Viewcontroller e chamar viewdidload

Mattk90
fonte
4

No iOS8, se você definir UINavigationBar.barStylecomo, .Blackpoderá definir o plano de fundo da barra como cor lisa, sem a borda.

Em Swift:

UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barStyle = UIBarStyle.Black
UINavigationBar.appearance().barTintColor = UIColor.redColor()
gpbl
fonte
Esta é a solução mais limpa e a melhor maneira de conseguir isso. Se você não precisa oferecer suporte ao <iOS 8, não há motivo para não usar esta resposta. Obrigado.
User3344977
Funciona bem. Eu também o coloquei no storyboard, para que nem precisasse de código.
precisa saber é o seguinte
1
Fazer isso fornece uma linha branca muito pequena, em vez da sombra padrão.
Vegard
4

Solução de duas linhas que funciona para mim. Tente adicionar isso no método ViewDidLoad:

navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
self.extendedLayoutIncludesOpaqueBars = true
Evgenii Mokeev
fonte
só isso funcionou para mim
Osama bin Attique
3

Aqui está uma solução muito simples:

self.navigationController.navigationBar.clipsToBounds = YES;
user3344977
fonte
37
A área da barra de status também é cortada.
Fury
3

Solução simples - Swift 5

  1. Crie uma extensão:

    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. Adicione isto a viewDidLoad():

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

Para usuários do iOS 9, isso funcionou para mim. basta adicionar isso:

UINavigationBar.appearance().shadowImage = UIImage()
Mariano Pardo
fonte
2

O problema de definir uma imagem de fundo é que ela remove a desfocagem. Você pode removê-lo sem definir uma imagem de fundo. Veja minha resposta aqui .

Leo Natan
fonte
2

Você deve adicionar uma exibição na parte inferior da 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
fonte
Não acredito que isso ainda é um problema - apenas me deparei com isso novamente! Mas esta solução é a melhor possível no momento; Obrigado @Socheat
RichAppz
1

Sei que esse é um tópico antigo, mas encontrei uma solução que funciona muito bem:

Subclasse UINavigationBar. Na sua subclasse UINavigationBar, substitua didAddSubview pelo seguinte código:

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

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

Acabei de criar uma extensão para isso ... Desculpe a formatação (esta é minha primeira resposta).

Uso:

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

Extensão:

 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
fonte
1

No AppDelegate , isso mudou globalmente o formato da 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ão conseguiu implementar nada diferente em um VC específico, mas isso ajudará 90% das pessoas

David West
fonte
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
fonte