Jak ukryć dolną linię UINavigationBar 1px

443

Mam aplikację, która czasami potrzebuje paska nawigacji, aby wtopić się w treść.

Czy ktoś wie, jak się pozbyć lub zmienić kolor tego irytującego małego paska?

Na poniższym obrazku mam - mówię o tej linii o wysokości 1px poniżej „Root View Controller”

wprowadź opis zdjęcia tutaj

Szymon Kuczur
źródło
przejrzyj
jak zwiększyć 1px wysokości nawigacji?
Suresh Durishetti,

Odpowiedzi:

738

W systemie iOS 13:

Użyj .shadowColornieruchomości

Jeśli ta właściwość jest równa zero lub zawiera czysty kolor, pasek nie wyświetla cienia

Na przykład:

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

Dla iOS 12 i niższych:

Aby to zrobić, należy ustawić niestandardowy obraz cienia. Ale aby pokazać obraz cienia, musisz również ustawić niestandardowy obraz tła, cytat z dokumentacji Apple:

Aby wyświetlić niestandardowy obraz cienia, niestandardowy obraz tła musi być również ustawiony za pomocą metody setBackgroundImage (_: for :). Jeśli zostanie użyty domyślny obraz tła, zostanie użyty domyślny obraz cienia, niezależnie od wartości tej właściwości.

Więc:

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

Powyżej jest jedynym „oficjalnym” sposobem na ukrycie tego. Niestety usuwa przezroczystość paska.

Nie chcę obrazu tła, tylko kolor

Masz te opcje:

  1. Jednolity kolor, bez półprzezroczystości:

    navigationBar.barTintColor = UIColor.redColor()
    navigationBar.isTranslucent = false
    navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationBar.shadowImage = UIImage()
  2. Utwórz mały obraz tła wypełniony kolorem i użyj go.

  3. Użyj metody „hacky” opisanej poniżej. Dzięki temu pasek będzie przezroczysty.

Jak zachować przejrzystość paska?

Aby zachować przejrzystość, potrzebujesz innego podejścia, wygląda to na hack, ale działa dobrze. Cień, który próbujemy usunąć, to linia włosów UIImageViewgdzieś pod UINavigationBar. Możemy go znaleźć i ukryć / pokazać w razie potrzeby.

Poniższe instrukcje zakładają, że potrzebujesz linii włosów ukrytej tylko w jednym kontrolerze w Twojej UINavigationControllerhierarchii.

  1. Deklaracja zmiennej instancji:

    private var shadowImageView: UIImageView?
  2. Dodaj metodę, która znajdzie ten cień (linia włosów) 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. Dodaj / edytuj viewWillAppear/viewWillDisappearmetody:

    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
    }

Ta sama metoda powinna również działać w przypadku UISearchBarlinii włosów i (prawie) wszystkiego, co musisz ukryć :)

Ogromne podziękowania dla @Leo Natan za oryginalny pomysł!

Serhii Yakovenko
źródło
103
Możesz także ustawić widok UINavigationBarwłaściwości:clipsToBounds = YES
cleverbit
3
@richarddas clipsToBounds = YESdziała jak urok! Dzięki!
romeouald
3
ClipToBounds nie zawsze działa w przypadku niektórych układów. Ta odpowiedź była dla mnie idealna. Tylko ja utworzyłem podklasę UINavigationBar i użyłem powyższego kodu, aby ukryć obraz cienia w metodach -layoutSubview. Dzięki!
cgossain
7
Wystarczy zauważyć, że miałem problem z tym, że mój górny pasek stanu iOS stał się półprzezroczysty i mogłem zobaczyć widok tabeli przewijający się za paskiem UINavigation. Naprawiłem to ustawiając setTranslucent = NO.
Vlad
2
W iOS 10 wydaje się, że kiedy viewWillAppear się nazywa, nie możemy dostaćshadowImageView
xi.lin
241

Poniżej może pomóc po prostu!

Szybki:

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

Cel C:

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];
Vishnuvardhan
źródło
6
Używam Xcode 8 i programisty dla> iOS 8 i żadne z powyższych nie działało dla mnie, z wyjątkiem tego.
Vakas
2
Również na XCode 8 i> iOS 8. To jedyna odpowiedź, która zadziałała dla mnie.
cloudcal
1
To jedyna krótka i prosta odpowiedź, która działała dla mnie na iOS 10 i Xcode 8.3.1. Dzięki stary.
Vishal Sonawane
1
Cel-C: self.navigationController.navigationBar.shadowImage = [UIImage new];
Marcelo dos Santos
1
Tylko to działa dla mnie w wersji iOS 13.3.1 iPad.
Ravi
145

Jeśli chcesz po prostu użyć jednolitego koloru paska nawigacyjnego i skonfigurowałeś go w swojej serii ujęć, użyj tego kodu w swojej AppDelegateklasie, aby usunąć granicę 1 piksela za pośrednictwem wyglądu proxy:

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

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
Rick Pastoor
źródło
2
Ustawia to globalnie dla KAŻDEGO paska nawigacyjnego w bazie kodu ... przez większość czasu nie jest to, czego chcesz.
Christoph
97

Spróbuj tego:

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

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

Poniższe zdjęcie ma wyjaśnienie (pasek nawigacji iOS7):

wprowadź opis zdjęcia tutaj

I sprawdź to SO: iOS7 - Zmień kolor ramki UINavigationBar

Tarek Hallak
źródło
Jak powiedział Serhii, aby zaakceptować obraz cienia, należy ustawić niestandardowy obraz tła.
akashivskyy
3
zrób to w swoim AppDelegate.
myusuf3
Świetna odpowiedź ... Uratowałem mój dzień _ / \ _
Akshay,
@RPM działa świetnie w iOS 7,8,9,10. Ten sam kod dla paska nawigacji viewControlles w medium dla Swift.
Akhrameev,
64

Chciałem dodać szybką wersję odpowiedzi Serhii. Utworzyłem UIBarExtension.swiftz:

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
źródło
Dziękuję Ci! To powinna być odpowiedź.
PeiweiChen
Działa z paskiem nawigacji, ale nie działa z uitoolbar
TomSawyer
Uważam, że w iOS 12 to już nie działa. :(.
Chris Prince,
Działa świetnie iOS 13
ttorbik
To powinna być odpowiedź. działa jak urok w
iOS
63

Szybki sposób na zrobienie tego:

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

UINavigationBar.appearance().shadowImage = UIImage()
OscarVGG
źródło
2
Rzadko zdarza się, aby znaleźć się tak daleko na liście, zanim znajdzie się najbystrzejszą odpowiedź. +1!
sudo make install
3
Ukrywa całe tło UINavigationBar tho: /
user365314
Źle, ukrywa też całe tło!
TomSawyer
3
Uwaga: musisz ustawić wartość nawigacji w pasku nawigacyjnym na Przeźroczysty na false
dmathewwws
19

Proste rozwiązanie w mgnieniu oka

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()
Jakub Průša
źródło
3
+1 Ze wszystkich odpowiedzi, to w końcu dla mnie zadziałało. Nie zepsuło paska stanu jak innych odpowiedzi i rozwiązuje problem zmiany tylko jednego paska kontrolera nawigacji, a nie wszystkich pasków nawigacji w projekcie.
JoeGalind
Wersja Swift 4.2: navigationBar? .SetBackgroundImage (UIImage (), dla: UIBarPosition.any, barMetrics: UIBarMetrics.default) navigationBar? .ShadowImage = UIImage ()
airowe
16

Po przestudiowaniu odpowiedzi od Serhila stworzyłem pasek UINavigationBar + Dodatek, który może z łatwością ukryć linię włosów.

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    UINavigationBar *navigationBar = self.navigationController.navigationBar;
    [navigationBar hideBottomHairline];
}
samwize
źródło
16

W Swift 3.0

Edytuj swój AppDelegate.swift, dodając następujący kod do funkcji aplikacji:

// Override point for customization after application launch.

// Remove border in navigationBar
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
smohn
źródło
16

Począwszy od systemu iOS 13 istnieje systemowy interfejs API do ustawiania lub usuwania cienia

UIKit korzysta z właściwości shadowImage i shadowColor do określenia wyglądu cienia. Gdy shadowImage ma wartość zero, pasek wyświetla domyślny cień podbarwiony zgodnie z wartością we właściwości shadowColor. Jeśli shadowColor ma wartość zero lub zawiera kolor clearColor, pasek nie wyświetla cienia.

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

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

glotcha
źródło
shadowImage i shadowColor nie są udokumentowane w UINavigationBarAppearancenagłówkach !! Nigdy tego nie znajdę. Dzięki, to rozwiązało moje problemy w 100%
Roger Oba,
1
Tak, działa również dobrze dla mnie w iOS 13, dziękuję bardzo @glotcha.
Yogesh Patel,
@glotcha Right ....
Digvijay
dzięki. jedyna rzecz, która mi
zadziałała
13

Może być również ukryty w Storyboard (działa na Xcode 10.1)

Dodając atrybut środowiska wykonawczego: hidesShadow - Boolean - True

wprowadź opis zdjęcia tutaj

Gagandeep Gambhir
źródło
11

Zaktualizowano rozwiązanie pxpgraphics dla 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
źródło
Cześć, nowy na iOS i próbuję się uczyć. Jak korzystać z rozszerzenia? Mam plik kontrolera widoku i umieszczam w nim te rozszerzenia poza zakresem klasy. Ale jak mam wywołać hide / showHairline ()? Naprawdę nie rozumiem, jak używać rozszerzeń, ale jest on używany w tak wielu rozwiązaniach, ale po prostu nie rozumiem, jak są one zaimplementowane w rzeczywistym kodzie
Tommy K
Rozszerzenia dodają funkcjonalność do istniejących klas. Każda rozszerzona klasa, struktura, wyliczanie itp. Będzie miała te nowe funkcje dostępne zawsze, gdy będziesz ich potrzebować. Zobacz więcej tutaj: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
tf.alves
hm, więc powinienem móc użyć, UINavigationController().navigationBar/toolbar.hide/showBottomHairline()a następnie nie? Próbuję tego, ale bezskutecznie. Czy nie rozumiem poprawnie?
Tommy K
11

Swift 4 // do ukrywania linii cienia paska nawigacji

navigationController?.navigationBar.shadowImage = UIImage()
Faris Muhammed
źródło
10

Korzystam z rozszerzenia UINavigationBar, które pozwala mi ukryć / pokazać ten cień za pomocą interfejsu API UIAppearance lub wybrać pasek nawigacji, który ma ukryć / pokazać ten cień za pomocą Storyboard (lub kodu źródłowego). Oto rozszerzenie:

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

Teraz, aby wyłączyć cień na wszystkich paskach nawigacyjnych, musisz użyć:

UINavigationBar.appearance().flat = true

Lub możesz włączyć / wyłączyć to zachowanie za pomocą scenariuszy:

Storyboard paska nawigacji

Alvivi
źródło
@ NunoGonçalves, możesz myśleć o flatAssociatedObjectKeyunikatowej int (traktowanej jak wskaźnik), aby zidentyfikować powiązany obiekt. Tutaj jest zdefiniowany przez adres pamięci prywatnego var. Zaktualizowałem odpowiedź, aby dodać ten var. Zobacz nshipster.com/associated-objects aby uzyskać więcej informacji.
Alvivi,
Dobre rozwiązanie, ale działa tylko wtedy, gdy pasek nawigacyjny jest ustawiony translucentna false
ZYiOS
9

Swift 4 Testowane ROZWIĄZANIE W JEDNEJ LINII

W Viewdidload() Ustaw wartość domyślną użytkownika kontrolera nawigacji true dla klucza „hidesShadow”

override func viewDidLoad() {
    super.viewDidLoad()

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

}
Sachin Rasane
źródło
1
Działa idealnie !!
Prashant Tukadiya,
7

Swift to położył

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

w

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
UnRewa
źródło
I usuwa również kolor tła.
TomSawyer
7

Inna opcja, jeśli chcesz zachować przezroczystość i nie chcesz podklasować wszystkich UINavigationControlleraplikacji:

#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
źródło
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
źródło
Dzięki James! Nie rozumiem, dlaczego ktoś głosował na twoją odpowiedź.
Dănuț Mihai Florian
jeśli jest to potrzebne, możesz również dodać: self.navigationController.navigationBar.translucent = false self.navigationController.navigationBar.clipsToBounds = false self.navigationController.navigationBar.shadowImage = UIImage () self.navigationController.navueColorBlueBarbar.navigationBar.bar ()
Alessandro Ornano,
5

Rozwiązanie w Swift 4.2:

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

Po prostu umieść tę funkcję w pierwszym programie Viewcontroller i wywołaj ją viewdidload

Mattk90
źródło
4

W iOS8, jeśli ustawisz UINavigationBar.barStylena.Black można ustawić tło na pasku jako zwykły kolorze bez obramowania.

W Swift:

UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barStyle = UIBarStyle.Black
UINavigationBar.appearance().barTintColor = UIColor.redColor()
gpbl
źródło
To najczystsze rozwiązanie i najlepszy sposób na osiągnięcie tego. Jeśli nie musisz obsługiwać <iOS 8, nie ma powodu, aby nie używać tej odpowiedzi. Dzięki.
user3344977
Działa świetnie. Ustawiłem go również w scenorysie, więc nawet nie potrzebowałem żadnego kodu.
vikzilla
1
Dzięki temu uzyskasz bardzo małą białą linię zamiast standardowego cienia.
Vegard
4

Dwuliniowe rozwiązanie, które działa dla mnie. Spróbuj dodać to w metodzie ViewDidLoad:

navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
self.extendedLayoutIncludesOpaqueBars = true
Evgenii Mokeev
źródło
tylko to zadziałało dla mnie
Usama bin Attique,
3

Oto bardzo proste rozwiązanie:

self.navigationController.navigationBar.clipsToBounds = YES;
użytkownik3344977
źródło
37
Obszar paska stanu jest również obcinany.
Fury
3

Proste rozwiązanie - Swift 5

  1. Utwórz rozszerzenie:

    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. Dodaj to do viewDidLoad():

    self.navigationController?.navigationBar.shadowImage = UIImage.hideNavBarLine(color: UIColor.clear)
Bandyliuk
źródło
2

Dla użytkowników iOS 9 to zadziałało dla mnie. po prostu dodaj to:

UINavigationBar.appearance().shadowImage = UIImage()
Mariano Pardo
źródło
2

Problem z ustawieniem obrazu tła polega na tym, że usuwa on rozmycie. Możesz go usunąć bez ustawiania obrazu tła. Zobacz moją odpowiedź tutaj .

Leo Natan
źródło
2

Powinieneś dodać widok na dole 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
źródło
Nie mogę uwierzyć, że to wciąż problem - po prostu znów się z tym spotkałem! Ale obecnie jest to najlepsze możliwe rozwiązanie; Dzięki @Socheat
RichAppz
1

Wiem, że to stary wątek, ale znalazłem rozwiązanie, które działa naprawdę dobrze:

Podklasa UINavigationBar. W podklasie UINavigationBar przesłonięcie didAddSubview przy użyciu następującego kodu:

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

    if ([subview isKindOfClass:[UIImageView class]]) {
        [subview setClipsToBounds:YES];
    }
}
Joel Middendorf
źródło
1

Właśnie utworzyłem rozszerzenie dla tego ... Przepraszam za formatowanie (to moja pierwsza odpowiedź).

Stosowanie:

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

Rozbudowa:

 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
źródło
1

W AppDelegate globalnie zmieniło to format paska nawigacyjnego:

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

Nie udało mi się wdrożyć niczego innego na konkretnym VC, ale to pomoże 90% ludzi

David West
źródło
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
źródło