Cara menyembunyikan garis bawah UINavigationBar 1px

443

Saya memiliki aplikasi yang terkadang membutuhkan bilah navigasi untuk berbaur dengan konten.

Adakah yang tahu cara menyingkirkan atau mengubah warna bar kecil yang menyebalkan ini?

Pada gambar di bawah ini situasi yang saya miliki - saya sedang berbicara tentang garis ketinggian 1px di bawah "Root View Controller"

masukkan deskripsi gambar di sini

Szymon Kuczur
sumber
bagaimana cara menambah tinggi navigasi 1px?
Suresh Durishetti

Jawaban:

738

Untuk iOS 13:

Gunakan .shadowColorproperti

Jika properti ini nihil atau berisi warna jernih, bilah tidak menampilkan bayangan

Contohnya:

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

Untuk iOS 12 dan di bawah ini:

Untuk melakukan ini, Anda harus mengatur gambar bayangan kustom. Tetapi untuk gambar bayangan yang ditampilkan, Anda juga perlu mengatur gambar latar belakang khusus, kutipan dari dokumentasi Apple:

Agar gambar bayangan khusus ditampilkan, gambar latar belakang khusus juga harus diatur dengan metode setBackgroundImage (_: for :). Jika gambar latar belakang default digunakan, maka gambar bayangan default akan digunakan terlepas dari nilai properti ini.

Begitu:

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

Di atas adalah satu-satunya cara "resmi" untuk menyembunyikannya. Sayangnya, ini menghilangkan tembus bilah.

Saya tidak ingin gambar latar belakang, hanya warna

Anda memiliki opsi itu:

  1. Warna solid, tidak tembus cahaya:

    navigationBar.barTintColor = UIColor.redColor()
    navigationBar.isTranslucent = false
    navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationBar.shadowImage = UIImage()
  2. Buat gambar latar kecil dengan warna dan gunakan.

  3. Gunakan metode 'retas' yang dijelaskan di bawah ini. Itu juga akan membuat bar tembus.

Bagaimana agar bilah tetap tembus?

Untuk menjaga transparansi Anda membutuhkan pendekatan lain, itu terlihat seperti retasan tetapi bekerja dengan baik. Bayangan yang kami coba hapus adalah garis rambut di UIImageViewsuatu tempat di bawah UINavigationBar. Kita dapat menemukannya dan menyembunyikan / menampilkannya saat dibutuhkan.

Instruksi di bawah ini menganggap Anda perlu garis rambut disembunyikan hanya dalam satu pengontrol UINavigationControllerhierarki Anda .

  1. Nyatakan variabel instan:

    private var shadowImageView: UIImageView?
  2. Tambahkan metode yang menemukan bayangan ini (garis rambut) 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. Tambahkan / edit viewWillAppear/viewWillDisappearmetode:

    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
    }

Metode yang sama juga harus bekerja untuk UISearchBargaris rambut, dan (hampir) hal lain yang perlu Anda sembunyikan :)

Terima kasih banyak kepada @Leo Natan untuk ide aslinya!

Serhii Yakovenko
sumber
103
Anda juga dapat mengatur tampilan UINavigationBarproperti:clipsToBounds = YES
cleverbit
3
@richarddas clipsToBounds = YESbekerja seperti pesona! Terima kasih!
romeouald
3
The clipToBounds tidak selalu berfungsi untuk beberapa tata letak. Jawaban ini sangat cocok untuk saya. Hanya saya membuat subkelas UINavigationBar dan menggunakan kode di atas untuk menyembunyikan gambar bayangan dalam metode -layoutSubview. Terima kasih!
cgossain
7
Sebagai catatan, saya mengalami masalah ketika bilah status teratas iOS saya menjadi tembus cahaya dan saya bisa melihat tampilan tabel saya bergulir di belakang UINavigationBar. Saya memperbaikinya dengan mengatur setTranslucent = TIDAK.
Vlad
2
Di iOS 10 tampaknya ketika viewWillAppear dipanggil kita tidak bisa mendapatkanshadowImageView
xi.lin
241

Di bawah ini dapat membantu!

Cepat:

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

Sasaran C:

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];
Wisnuvardhan
sumber
6
Saya menggunakan Xcode 8 dan pengembang untuk> iOS 8 dan tidak ada yang di atas bekerja untuk saya kecuali yang ini.
Vakas
2
Juga di XCode 8 dan> iOS 8. Ini adalah satu-satunya jawaban yang bekerja untuk saya.
cloudcal
1
Ini adalah satu-satunya jawaban singkat dan sederhana yang berfungsi untuk saya untuk iOS 10 dan Xcode 8.3.1. Terima kasih sobat.
Vishal Sonawane
1
Objective-C: self.navigationController.navigationBar.shadowImage = [UIImage new];
Marcelo dos Santos
1
Hanya ini yang berfungsi untuk saya di iOS 13.3.1 Versi iPad.
Ravi
145

Jika Anda hanya ingin menggunakan warna bilah navigasi yang solid dan mengaturnya di storyboard Anda, gunakan kode ini di AppDelegatekelas Anda untuk menghapus batas 1 piksel melalui proxy penampilan:

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

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
Rick Pastoor
sumber
2
Ini membuatnya global untuk SETIAP bilah nav di basis kode Anda ... sering kali bukan yang Anda inginkan.
Christoph
97

Coba ini:

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

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

Gambar di bawah ini memiliki penjelasan (iOS7 NavigationBar):

masukkan deskripsi gambar di sini

Dan periksa pertanyaan SO ini: iOS7 - Ubah warna perbatasan UINavigationBar

Tarek Hallak
sumber
Seperti yang Serhii katakan, gambar latar belakang khusus harus diatur agar gambar bayangan diterima.
akashivskyy
3
lakukan ini di AppDelegate Anda.
myusuf3
Jawaban bagus ... Menyimpan hari saya _ / \ _
Akshay
@RPM Bekerja sangat baik di iOS 7,8,9,10. Ada kode yang sama untuk bilah navigasi viewControlles dalam medium untuk Swift.
Akhrameev
64

Ingin menambahkan versi Swift dari jawaban Serhii. Saya membuat UIBarExtension.swiftdengan yang berikut:

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
sumber
Terima kasih! Yang ini harus menjadi jawabannya.
PeiweiChen
Ini bekerja dengan navigationBar tetapi tidak bekerja dengan uitoolbar
TomSawyer
Saya menemukan dengan iOS 12 ini tidak berfungsi lagi. :(.
Chris Prince
IOS 13 bagus
ttorbik
Yang ini harus menjadi jawabannya. bekerja seperti pesona di ios 13
COVID19
63

Cara cepat untuk melakukannya:

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

UINavigationBar.appearance().shadowImage = UIImage()
OscarVGG
sumber
2
Sangat jarang untuk mendapatkan ini jauh di bawah daftar sebelum menemukan jawaban yang paling ramping. +1!
sudo make install
3
Itu menyembunyikan seluruh latar belakang UINavigationBar tho: /
user365314
Salah, itu juga menyembunyikan seluruh latar belakang!
TomSawyer
3
Catatan: Anda harus mengatur isTranslucent pada navigasiBar menjadi false
dmathewwws
19

Solusi sederhana dalam cepat

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()
Jakub Průša
sumber
3
+1 Dari semua jawaban, inilah yang akhirnya berhasil bagi saya. Itu tidak mengacaukan bilah status sebagai jawaban lain, dan itu mengatasi masalah mengubah hanya satu bilah pengontrol navigasi, tidak semua bilah navigasi di proyek.
JoeGalind
Versi Swift 4.2: navigationBar? .SetBackgroundImage (UIImage (), untuk: UIBarPosition.any, barMetrics: UIBarMetrics.default) navigationBar? .ShadowImage = UIImage ()
airowe
16

Setelah mempelajari jawaban dari Serhil, saya membuat pod UINavigationBar + Addition yang dapat dengan mudah menyembunyikan garis rambut.

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

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

Di Swift 3.0

Edit Anda AppDelegate.swiftdengan menambahkan kode berikut ke fungsi aplikasi Anda:

// Override point for customization after application launch.

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

Pada iOS 13 ada sistem API untuk mengatur atau menghapus bayangan

UIKit menggunakan shadowImage dan properti shadowColor untuk menentukan penampilan bayangan. Ketika shadowImage nihil, bilah menampilkan bayangan default yang diwarnai sesuai dengan nilai di properti shadowColor. Jika shadowColor nil atau berisi warna clearColor, bilah tidak menampilkan bayangan.

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

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

glotcha
sumber
shadowImage dan shadowColor tidak didokumentasikan dalam UINavigationBarAppearanceheader !! Saya tidak akan pernah menemukannya. Terima kasih, ini menyelesaikan masalah saya 100%
Roger Oba
1
Ya itu berfungsi dengan baik untuk saya juga di iOS 13 terima kasih banyak @glotcha.
Yogesh Patel
@glotcha Benar ....
Digvijay
Terima kasih. satu-satunya hal yang bekerja untuk saya
alionthego
13

Dapat juga disembunyikan dari Storyboard (mengerjakan Xcode 10.1)

Dengan menambahkan atribut runtime: hidesShadow - Boolean - True

masukkan deskripsi gambar di sini

Gagandeep Gambhir
sumber
11

solusi pxpgraphics ' diperbarui untuk 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
sumber
Hai, baru mengenal iOS dan mencoba belajar sendiri. Bagaimana cara saya menggunakan ekstensi? Saya memiliki file view controller dan saya meletakkan ekstensi ini di dalamnya di luar lingkup kelas. Tapi lalu bagaimana saya memanggil hide / showHairline ()? Tidak benar-benar mengerti cara menggunakan ekstensi tetapi ini digunakan untuk banyak solusi, tapi saya hanya tidak mengerti bagaimana mereka diterapkan dalam kode aktual
Tommy K
Ekstensi menambahkan fungsionalitas ke kelas Anda yang ada. Setiap kelas yang diperluas, struktur, enum, dll, akan memiliki fitur-fitur baru ini tersedia untuk Anda setiap kali Anda perlu menggunakannya. Lihat lebih lanjut di sini: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
tf.alves
hm jadi saya hanya bisa menggunakan UINavigationController().navigationBar/toolbar.hide/showBottomHairline()maka tidak? Saya mencoba ini tetapi tidak berhasil. Apakah saya tidak mengerti dengan benar?
Tommy K
11

Swift 4 // untuk menyembunyikan garis bayangan bar navigasi

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

Saya menggunakan ekstensi UINavigationBar yang memungkinkan saya untuk menyembunyikan / memperlihatkan bayangan itu menggunakan API UIAppearance atau memilih bilah navigasi yang harus menyembunyikan / memperlihatkan bayangan itu menggunakan Storyboard (atau kode sumber). Ini ekstensi:

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

Sekarang, untuk menonaktifkan bayangan di semua bilah navigasi yang harus Anda gunakan:

UINavigationBar.appearance().flat = true

Atau Anda dapat mengaktifkan / menonaktifkan perilaku ini menggunakan storyboard:

Papan Navigasi Papan Cerita

Alvivi
sumber
@ NunoGonçalves, Anda dapat menganggapnya flatAssociatedObjectKeysebagai int unik (diperlakukan sebagai penunjuk) untuk mengidentifikasi objek terkait Anda. Di sini ditentukan oleh alamat memori var pribadi. Saya memperbarui respons untuk menambahkan var ini. Lihat nshipster.com/associated-objects untuk info lebih lanjut.
Alvivi
Solusi bagus tetapi hanya berfungsi ketika bilah navigasi disetel translucentke false
ZYiOS
9

Swift 4 Diuji SATU LINE SOLUSI

Di Viewdidload() Setel nilai kerusakan pengontrol Navigasi milik true untuk kunci "hidesShadow"

override func viewDidLoad() {
    super.viewDidLoad()

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

}
Sachin Rasane
sumber
1
Bekerja dengan sempurna !!
Prashant Tukadiya
7

Swift taruh ini

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

di

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
UnRewa
sumber
Dan itu menghilangkan warna latar belakang juga.
TomSawyer
7

Opsi lain jika Anda ingin mempertahankan transparansi dan Anda tidak ingin mensubklas setiap UINavigationControllerdalam aplikasi Anda:

#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
sumber
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
sumber
James terima kasih! Saya tidak mengerti mengapa seseorang memilih jawaban Anda.
Dănuț Mihai Florian
jika Anda memerlukannya, Anda juga dapat menambahkan: self.navigationController.navigationBar.translucent = false self.navigationController.navigationBar.clipsToBounds = false self.navigationController.navigationBar.shadowImage = UIImage () self.navigationContour.warnaRayaGambaranGambaranwarna. ()
Alessandro Ornano
5

Solusi dalam Swift 4.2:

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

Cukup taruh fungsi ini di Viewcontroller pertama dan panggil masuk viewdidload

Mattk90
sumber
4

Di iOS8, jika Anda mengatur UINavigationBar.barStyleuntuk, .BlackAnda dapat mengatur latar belakang bilah sebagai warna polos tanpa batas.

Dalam Swift:

UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barStyle = UIBarStyle.Black
UINavigationBar.appearance().barTintColor = UIColor.redColor()
gpbl
sumber
Ini adalah solusi terbersih dan cara terbaik untuk mencapai ini. Jika Anda tidak harus mendukung <iOS 8, tidak ada alasan untuk tidak menggunakan jawaban ini. Terima kasih.
user3344977
Bagus sekali. Saya mengaturnya di storyboard juga jadi bahkan tidak perlu kode apa pun.
vikzilla
1
Melakukan ini memberi Anda garis putih yang sangat kecil, bukan bayangan standar.
Vegard
4

Solusi dua baris yang bekerja untuk saya. Coba tambahkan ini dalam metode ViewDidLoad:

navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
self.extendedLayoutIncludesOpaqueBars = true
Evgenii Mokeev
sumber
hanya ini yang berhasil untuk saya
Usama bin Attique
3

Inilah solusi yang sangat sederhana:

self.navigationController.navigationBar.clipsToBounds = YES;
pengguna3344977
sumber
37
Area bilah status juga terpotong.
Fury
3

Solusi sederhana - Swift 5

  1. Buat ekstensi:

    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. Tambahkan ini ke viewDidLoad():

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

Untuk pengguna iOS 9, ini berhasil bagi saya. tambahkan saja ini:

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

Masalah dengan pengaturan gambar latar belakang adalah menghapus kabur. Anda dapat menghapusnya tanpa mengatur gambar latar belakang. Lihat jawaban saya di sini .

Leo Natan
sumber
2

Anda harus menambahkan tampilan ke bagian bawah 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
sumber
Saya tidak percaya ini masih menjadi masalah - temui lagi! Tetapi solusi ini adalah yang terbaik saat ini; Terima kasih @Socheat
RichAppz
1

Saya tahu ini adalah utas lama, tetapi saya menemukan solusi yang bekerja sangat baik:

Subkelas UINavigationBar. Di subkelas UINavigationBar Anda, ganti didAddSubview dengan kode berikut:

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

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

Saya Baru saja membuat ekstensi untuk ini ... Maaf tentang pemformatan (ini adalah jawaban pertama saya).

Pemakaian:

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

Perpanjangan:

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

Di dalam AppDelegate , ini secara global mengubah format 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()] }

Belum berhasil menerapkan sesuatu yang berbeda pada VC tertentu, tetapi ini akan membantu 90% orang

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