Cómo ocultar el resultado final de UINavigationBar 1px

443

Tengo una aplicación que a veces necesita que su barra de navegación se mezcle con el contenido.

¿Alguien sabe cómo deshacerse o cambiar el color de esta pequeña barra molesta?

En la imagen a continuación la situación que tengo - estoy hablando de esta línea de altura de 1px debajo de "Root View Controller"

ingrese la descripción de la imagen aquí

Szymon Kuczur
fuente
¿Cómo aumentar 1px de altura de navegación?
Suresh Durishetti

Respuestas:

738

Para iOS 13:

Usa la .shadowColorpropiedad

Si esta propiedad es nula o contiene el color claro, la barra no muestra sombras

Por ejemplo:

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

Para iOS 12 y versiones inferiores:

Para hacer esto, debe establecer una imagen de sombra personalizada. Pero para que se muestre la imagen sombreada, también debe establecer una imagen de fondo personalizada, cite la documentación de Apple:

Para que se muestre una imagen de sombra personalizada, también se debe establecer una imagen de fondo personalizada con el método setBackgroundImage (_: for :). Si se utiliza la imagen de fondo predeterminada, se utilizará la imagen de sombra predeterminada independientemente del valor de esta propiedad.

Entonces:

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

Arriba está la única forma "oficial" de ocultarlo. Desafortunadamente, elimina la translucidez de la barra.

No quiero imagen de fondo, solo color

Tienes esas opciones:

  1. Color sólido, sin translucidez:

    navigationBar.barTintColor = UIColor.redColor()
    navigationBar.isTranslucent = false
    navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationBar.shadowImage = UIImage()
    
  2. Crea una pequeña imagen de fondo llena de color y úsala.

  3. Utilice el método 'hacky' que se describe a continuación. También mantendrá la barra translúcida.

¿Cómo mantener la barra translúcida?

Para mantener la translucidez, necesita otro enfoque, parece un truco pero funciona bien. La sombra que estamos tratando de eliminar es una rayita en UIImageViewalgún lugar debajo UINavigationBar. Podemos encontrarlo y ocultarlo / mostrarlo cuando sea necesario.

Las instrucciones a continuación suponen que necesita una línea oculta solo en un controlador de su UINavigationControllerjerarquía.

  1. Declarar variable de instancia:

    private var shadowImageView: UIImageView?
  2. Agregue un método que encuentre esta sombra (rayita) 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. Agregar / 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
    }
    

El mismo método también debería funcionar para UISearchBarrayita y (casi) cualquier otra cosa que necesite ocultar :)

¡Muchas gracias a @Leo Natan por la idea original!

Serhii Yakovenko
fuente
103
También puede configurar la vista de la UINavigationBarpropiedad:clipsToBounds = YES
cleverbit
3
@richarddas clipsToBounds = YESfunciona como un encanto! ¡Gracias!
romeouald
3
ClipsToBounds no siempre funciona para algunos diseños. Esta respuesta funcionó perfecta para mí. Solo creé una subclase UINavigationBar y usé el código anterior para ocultar la imagen de sombra en los métodos -layoutSubview. ¡Gracias!
cgossain
77
Solo para tener en cuenta que tuve un problema en el que mi barra de estado superior de iOS se volvió translúcida y pude ver mi vista de tabla desplazándose detrás de UINavigationBar. Lo arreglé estableciendo setTranslucent = NO.
Vlad
2
En iOS 10 parece que cuando viewWillAppear se llama no podemos obtenershadowImageView
xi.lin
241

¡A continuación puede ayudar simplemente!

Rápido:

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

C objetivo:

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];
Vishnuvardhan
fuente
66
Estoy en Xcode 8 y desarrollador para> iOS 8 y ninguno de los anteriores funcionó para mí, excepto este.
Vakas
2
También en XCode 8 y> iOS 8. Esta es la única respuesta que funcionó para mí.
cloudcal
1
Esta es la única respuesta corta y simple que funcionó para mí para iOS 10 y Xcode 8.3.1. Gracias hombre.
Vishal Sonawane
1
Objetivo-C: self.navigationController.navigationBar.shadowImage = [UIImage new];
Marcelo dos Santos
1
Solo esto funciona para mí en iOS 13.3.1 Versión iPad.
Ravi
145

Si solo desea usar un color de barra de navegación sólido y lo ha configurado en su guión gráfico, use este código en su AppDelegateclase para eliminar el borde de 1 píxel a través del proxy de apariencia:

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

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
Rick Pastoor
fuente
2
Esto lo establece global para CADA barra de navegación en su base de código ... la mayoría de las veces no es lo que desea.
Christoph
97

Prueba esto:

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

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

La imagen de abajo tiene la explicación (iOS7 NavigationBar):

ingrese la descripción de la imagen aquí

Y revise esta pregunta SO: iOS7 - Cambiar el color del borde UINavigationBar

Tarek Hallak
fuente
Como dijo Serhii, se debe establecer una imagen de fondo personalizada para que se acepte la imagen de sombra.
akashivskyy
3
haz esto en tu AppDelegate.
myusuf3
Gran respuesta ... Me salvó el día _ / \ _
Akshay
@RPM funciona muy bien en iOS 7,8,9,10. Existe el mismo código para la barra de navegación de viewControlles en medio para Swift.
Akhrameev
64

Quería agregar la versión Swift de la respuesta de Serhii. Creé un UIBarExtension.swiftcon lo siguiente:

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
fuente
¡Gracias! Esta debería ser la respuesta.
PeiweiChen
Funciona con navigationBar pero no funciona con uitoolbar
TomSawyer
Estoy descubriendo que con iOS 12 esto ya no funciona. :(.
Chris Prince
Funciona genial iOS 13
ttorbik
Esta debería ser la respuesta. funciona como encanto en ios 13
COVID19
63

La forma rápida de hacerlo:

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

UINavigationBar.appearance().shadowImage = UIImage()
OscarVGG
fuente
2
Es bastante raro llegar tan lejos en la lista antes de encontrar la respuesta más elegante. +1!
sudo make install
3
Oculta todo el trasfondo de UINavigationBar aunque: /
user365314
¡Incorrecto, también oculta todo el fondo!
TomSawyer
3
Nota: debe configurar la barra de navegación isTranslucent en false
dmathewwws
19

Solución simple en swift

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()
Jakub Průša
fuente
3
+1 De todas las respuestas, esto es lo que finalmente funcionó para mí. No estropeó la barra de estado como otras respuestas, y aborda el problema de cambiar solo una de las barras del controlador de navegación, no todas las barras de navegación en el proyecto.
JoeGalind
Versión Swift 4.2: navigationBar? .SetBackgroundImage (UIImage (), para: UIBarPosition.any, barMetrics: UIBarMetrics.default) navigationBar? .ShadowImage = UIImage ()
airowe
16

Después de estudiar la respuesta de Serhil, creé una vaina UINavigationBar + Addition que puede ocultar fácilmente la línea del cabello.

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

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

En Swift 3.0

Edite su AppDelegate.swiftagregando el siguiente código a la función de su aplicación:

// Override point for customization after application launch.

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

A partir de iOS 13, hay una API del sistema para establecer o eliminar la sombra

UIKit usa shadowImage y la propiedad shadowColor para determinar la apariencia de la sombra. Cuando shadowImage es nil, la barra muestra una sombra predeterminada teñida de acuerdo con el valor en la propiedad shadowColor. Si shadowColor es nulo o contiene el color clearColor, la barra no muestra sombra.

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

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

Glotcha
fuente
shadowImage y shadowColor no están documentados en los UINavigationBarAppearanceencabezados !! Nunca lo encontraría. Gracias, esto resolvió mis problemas al 100%
Roger Oba
1
Sí, también funciona bien para mí en iOS 13 muchas gracias @glotcha.
Yogesh Patel
@glotcha Right ....
Digvijay
Gracias. lo único que funcionó para mí
alionthego
13

También se puede ocultar de Storyboard (trabajando en Xcode 10.1)

Al agregar el atributo de tiempo de ejecución: hidesShadow - Boolean - True

ingrese la descripción de la imagen aquí

Gagandeep Gambhir
fuente
11

Solución de pxpgraphics actualizada para 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
fuente
Hola, nuevo en iOS y tratando de enseñarme. ¿Cómo uso la extensión? Tengo un archivo de controlador de vista y coloco estas extensiones fuera del alcance de la clase. Pero entonces, ¿cómo llamo hide / showHairline ()? Realmente no entiendo cómo usar extensiones, pero se usa para tantas soluciones, pero no entiendo cómo se implementan en el código real
Tommy K
Las extensiones agregan funcionalidad a sus clases existentes. Cualquier clase extendida, estructura, enumeración, etc., tendrá estas nuevas funciones disponibles siempre que necesite usarlas. Ver más aquí: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
tf.alves
hm, así que debería poder usar UINavigationController().navigationBar/toolbar.hide/showBottomHairline()entonces ¿no? Estoy intentando esto pero fue en vano. ¿No estoy entendiendo correctamente?
Tommy K
11

Swift 4 // para ocultar la línea de sombra de la barra de navegación

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

Utilizo una extensión UINavigationBar que me permite ocultar / mostrar esa sombra usando la API UIAppearance o seleccionando qué barra de navegación tiene que ocultar / mostrar esa sombra usando Storyboard (o código fuente). Aquí está la extensión:

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

Ahora, para deshabilitar la sombra en todas las barras de navegación, debe usar:

UINavigationBar.appearance().flat = true

O puede habilitar / deshabilitar este comportamiento usando guiones gráficos:

Barra de navegación Storyboard

Alvivi
fuente
@ NunoGonçalves, puede pensar flatAssociatedObjectKeycomo un int único (tratado como puntero) para identificar su objeto asociado. Aquí se define por la dirección de memoria de una var privada. Actualicé la respuesta para agregar esta var. Visite nshipster.com/associated-objects para obtener más información.
Alvivi
Buena solución, pero solo funciona cuando la barra de navegación está configurada translucenten falso
ZYiOS
9

Swift 4 probado SOLUCIÓN DE UNA LÍNEA

En Viewdidload() Establecer el valor predeterminado del usuario del controlador de navegación verdadero para la clave "hidesShadow"

override func viewDidLoad() {
    super.viewDidLoad()

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

}
Sachin Rasane
fuente
1
¡Funcionando perfectamente!
Prashant Tukadiya
7

Swift puso esto

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

en

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
UnRewa
fuente
Y también elimina el color de fondo.
TomSawyer
7

Otra opción si desea preservar la translucidez y no desea subclasificar todos UINavigationControlleren su aplicación:

#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
fuente
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
fuente
Gracias James! No puedo entender por qué alguien rechazó tu respuesta.
Dănuț Mihai Florian
si lo necesita, también puede agregar: self.navigationController.navigationBar.translucent = false self.navigationController.navigationBar.clipsToBounds = false self.navigationController.navigationBar.shadowImage = UIImage () self.navigationController.navigationBar.backolor.blue.backolor. ()
Alessandro Ornano
5

Solución en Swift 4.2:

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

Simplemente ponga esta función en el primer Viewcontroller y llámelo viewdidload

Mattk90
fuente
4

En iOS8, si se establece el UINavigationBar.barStyleque .Blackse puede poner el fondo de la barra como el color blanco sin la frontera.

En Swift:

UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barStyle = UIBarStyle.Black
UINavigationBar.appearance().barTintColor = UIColor.redColor()
gpbl
fuente
Esta es la solución más limpia y la mejor manera de lograr esto. Si no tiene que soportar <iOS 8, no hay razón para no usar esta respuesta. Gracias.
user3344977
Funciona genial. También lo configuré en el guión gráfico, por lo que ni siquiera necesité ningún código.
vikzilla
1
Hacer esto te da una línea blanca muy pequeña en lugar de la sombra estándar.
Vegard
4

Solución de dos líneas que funciona para mí. Intente agregar esto en el método ViewDidLoad:

navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
self.extendedLayoutIncludesOpaqueBars = true
Evgenii Mokeev
fuente
solo esto funcionó para mí
Usama bin Attique
3

Aquí hay una solución muy simple:

self.navigationController.navigationBar.clipsToBounds = YES;
usuario3344977
fuente
37
El área de la barra de estado también está recortada.
Furia
3

Solución simple - Swift 5

  1. Crea una extensión:

    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. Agregue esto a viewDidLoad():

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

Para los usuarios de iOS 9, esto funcionó para mí. solo agrega esto:

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

El problema con la configuración de una imagen de fondo es que elimina el desenfoque. Puede eliminarlo sin establecer una imagen de fondo. Mira mi respuesta aquí .

Leo Natan
fuente
2

Debe agregar una vista al final de 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
fuente
No puedo creer que esto siga siendo un problema, ¡solo lo volví a encontrar! Pero esta solución es la mejor posible en este momento; Gracias @Socheat
RichAppz
1

Sé que este es un hilo viejo, pero encontré una solución que funciona muy bien:

Subclase UINavigationBar. En su subclase UINavigationBar, anule didAddSubview con el siguiente código:

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

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

Acabo de crear una extensión para esto ... Perdón por el formato (esta es mi primera respuesta).

Uso:

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

Extensión:

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

Dentro de AppDelegate , esto ha cambiado globalmente el formato de 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()] }

No he logrado implementar nada diferente en un VC específico, pero esto ayudará al 90% de las personas

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