UINavigationBar 1px alt satırını gizleme


443

İçeriğe uyum sağlamak için bazen gezinme çubuğuna ihtiyaç duyan bir uygulamam var.

Herkes bu sinir bozucu küçük çubuğun kurtulmak veya rengini değiştirmek için biliyor mu?

Aşağıdaki görüntüde ben var - "Root View Controller" altındaki bu 1 piksel yükseklik çizgisinden bahsediyorum

resim açıklamasını buraya girin


Bunu gözden
geçirin

navigasyon yüksekliği 1 piksel nasıl artırılır?
Suresh Durishetti

Yanıtlar:


738

İOS 13 için:

.shadowColorÖzelliği kullanın

Bu özellik sıfırsa veya açık renk içeriyorsa, çubuk gölge göstermez

Örneğin:

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

İOS 12 ve önceki sürümler için:

Bunu yapmak için özel bir gölge görüntüsü ayarlamanız gerekir. Ancak gölge görüntünün gösterilmesi için ayrıca özel bir arka plan görüntüsü ayarlamanız gerekir, Apple'ın belgelerinden alıntı yapın:

Özel bir gölge görüntüsünün gösterilmesi için, setBackgroundImage (_: for :) yöntemiyle özel bir arka plan görüntüsü de ayarlanmalıdır. Varsayılan arka plan görüntüsü kullanılırsa, bu özelliğin değerine bakılmaksızın varsayılan gölge görüntüsü kullanılır.

Yani:

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

Yukarıda gizlemenin tek "resmi" yolu. Ne yazık ki, çubuğun yarı saydamlığını kaldırır.

Arka plan resmi istemiyorum, sadece renk

Bu seçeneklere sahipsiniz:

  1. Düz renk, yarı saydamlık yok:

    navigationBar.barTintColor = UIColor.redColor()
    navigationBar.isTranslucent = false
    navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationBar.shadowImage = UIImage()
  2. Renklerle dolu küçük bir arka plan görüntüsü oluşturun ve kullanın.

  3. Aşağıda açıklanan 'hacky' yöntemini kullanın. Ayrıca çubuğu yarı saydam tutacaktır.

Çubuğu yarı saydam tutmak nasıl?

Yarı saydamlığı korumak için başka bir yaklaşıma ihtiyacınız var, bir kesmek gibi görünüyor ama iyi çalışıyor. Kaldırmaya çalıştığımız gölge, UIImageViewaltında bir yerde bir saç çizgisidir UINavigationBar. Gerektiğinde bulabilir ve gizleyebilir / gösterebiliriz.

Aşağıdaki talimatlarda, UINavigationControllerhiyerarşinizin yalnızca bir denetleyicisinde gizli saç çizgisine ihtiyacınız olduğu varsayılmaktadır .

  1. Örnek değişkeni bildir:

    private var shadowImageView: UIImageView?
  2. Bu gölgeyi bulan yöntemi ekle (saç çizgisi) 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. viewWillAppear/viewWillDisappearYöntem ekleme / düzenleme :

    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
    }

Aynı yöntem UISearchBarsaç çizgisi için de çalışmalı ve (neredeyse) saklamanız gereken başka bir şey var :)

Orijinal fikir için @Leo Natan'a çok teşekkürler!


103
Ayrıca sadece UINavigationBartesisin görünümünü ayarlayabilirsiniz :clipsToBounds = YES
cleverbit

3
@richarddas clipsToBounds = YESbir cazibe gibi çalışıyor! Teşekkürler!
romeouald

3
ClipsToBounds her zaman bazı mizanpajlarda çalışmaz. Bu cevap benim için mükemmel çalıştı. Sadece bir UINavigationBar alt sınıfı oluşturdum ve -layoutSubview yöntemlerinde gölge görüntüsünü gizlemek için yukarıdaki kodu kullandım. Teşekkürler!
cgossain

7
Sadece iOS üst durum çubuğumun yarı saydam hale gelmesi konusunda sorun yaşadığımı ve tablo görünümümün UINavigationBar'ın arkasına geçtiğini görebiliyordum. Bunu setTranslucent = NO ayarlayarak düzelttim.
Vlad

2
İOS 10 yılında zaman gibi görünüyor viewWillAppear denir biz alamayanshadowImageView
xi.lin

241

Aşağıda sadece yardımcı olabilir!

Swift:

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

Hedef C:

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];

6
Xcode 8'deyim ve> iOS 8 için geliştiriciyim ve yukarıdakilerin hiçbiri benim için işe yaramadı.
Vakas

2
Ayrıca XCode 8 ve> iOS 8'de. Benim için çalışan tek cevap bu.
cloudcal

1
Bu, iOS 10 ve Xcode 8.3.1 için benim için çalışan tek kısa ve basit cevap. Teşekkürler dostum.
Vishal Sonawane

1
Objective-C: self.navigationController.navigationBar.shadowImage = [UIImage yeni];
Marcelo dos Santos

1
İOS 13.3.1 Sürüm iPad'de sadece bu benim için çalışıyor.
Ravi

145

Yalnızca düz bir gezinme çubuğu rengi kullanmak istiyorsanız ve bunu film şeridinizde ayarladıysanız AppDelegate, görünüm proxy'si aracılığıyla 1 piksel kenarlığını kaldırmak için sınıfınızda bu kodu kullanın :

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

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];

2
Bu, kod tabanınızdaki HER gezinme çubuğu için küreseldir ... çoğu zaman istediğinizi değil.
Christoph

97

Bunu dene:

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

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

Aşağıdaki resmin açıklaması (iOS7 NavigationBar):

resim açıklamasını buraya girin

Ve şu SO sorusunu kontrol edin: iOS7 - UINavigationBar kenarlık rengini değiştirme


Serhii'nin dediği gibi, gölge görüntünün kabul edilebilmesi için özel bir arka plan görüntüsü ayarlanmalıdır.
akashivskyy

3
bunu AppDelegate'inizde yapın.
myusuf3

Harika cevap ...
Akshay

@ RPM iOS 7,8,9,10'da harika çalışıyor. Swift için ortam içinde viewControlles gezinti çubuğu için aynı kod vardır .
Akhrameev

64

Serhii'nin cevabının Swift versiyonunu eklemek istedim. Ben UIBarExtension.swiftaşağıdakilerle bir oluşturdum :

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

Teşekkür ederim! Cevap bu olmalı.
PeiweiChen

NavigationBar ile çalışır, ancak uitoolbar ile çalışmaz
TomSawyer

IOS 12 ile bu artık çalışmıyor çalışmıyor buluyorum . :(.
Chris Prince

Harika iOS 13 Çalışıyor
ttorbik

Cevap bu olmalı. ios 13'teki cazibe gibi çalışıyor
COVID19

63

Bunu yapmanın en hızlı yolu:

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

UINavigationBar.appearance().shadowImage = UIImage()

2
En şık cevabı bulmadan önce bunu listeye getirmek oldukça nadirdir. 1!
sudo make install

3
UINavigationBar'ın tüm arka planını gizler tho: /
user365314

Yanlış, tüm arka planı da gizler!
TomSawyer

3
Not: NavigationBar isTranslucent öğesini false olarak ayarlamanız gerekir
dmathewwws

19

Hızlı ve basit çözüm

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()

3
+1 Tüm cevapların sonunda benim için işe yaradığı şey buydu. Durum çubuğunu diğer yanıtlar gibi karıştırmadı ve projedeki tüm gezinme çubuklarını değil, yalnızca gezinme denetleyicisi çubuklarından birini değiştirme sorununu giderir.
JoeGalind

Swift 4.2 sürümü: navigationBar? .SetBackgroundImage (UIImage (), için: UIBarPosition.any, barMetrics: UIBarMetrics.default) navigationBar? .ShadowImage = UIImage ()
airowe

16

Serhil'in cevabını inceledikten sonra , saç çizgisini kolayca gizleyebilen bir kapsül UINavigationBar + Addition oluşturdum .

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

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

16

Swift 3.0'da

Düzenlemenizle AppDelegate.swiftBaşvurunuz çalışması için aşağıdaki kodu ekleyerek:

// Override point for customization after application launch.

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

16

İOS 13'ten itibaren gölgeyi ayarlamak veya kaldırmak için bir sistem API'si var

UIKit gölgenin görünümünü belirlemek için shadowImage ve shadowColor özelliğini kullanır. ShadowImage sıfır olduğunda, çubuk shadowColor özelliğindeki değere göre renklendirilen varsayılan bir gölge görüntüler. ShadowColor sıfırsa veya clearColor rengini içeriyorsa, çubuk gölge göstermez.

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

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


shadowImage ve shadowColor UINavigationBarAppearancebaşlıklarda belgelenmemiştir !! Asla bulamazdım. Teşekkürler, bu sorunlarımı% 100 çözdü
Roger Oba

1
Evet, iOS 13'te de benim için iyi çalışıyor, çok teşekkür ederim @glotcha.
Yogesh Patel

@glotcha Sağ ....
Digvijay

Teşekkürler. benim için çalışan tek şey
alionthego

13

Storyboard'dan da gizlenebilir (Xcode 10.1 üzerinde çalışıyor)

Çalışma zamanı niteliğini ekleyerek: hidesShadow - Boolean - True

resim açıklamasını buraya girin


11

pxpgraphics 'çözümü Swift 2.0 için güncellendi

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
    }

}

Merhaba, iOS için yeni ve kendime öğretmeye çalışıyorum. Uzantıyı nasıl kullanırım? Bir görünüm denetleyicisi dosyası var ve bu uzantıları sınıf kapsamı dışında içine koymak. Ama sonra nasıl hide / showHairline () diyebilirim? Uzantıları nasıl kullanacağınızı gerçekten anlamadım, ancak çok fazla çözüm için kullanıldı, ancak gerçek kodda nasıl uygulandıklarını anlamıyorum
Tommy K

Uzantılar mevcut sınıflarınıza işlevsellik katar. Herhangi bir genişletilmiş sınıf, yapı, numaralandırma, vb. Kullanmanız gerektiğinde bu yeni özelliklere sahip olacaksınız. Buradan daha fazlasını görün: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
tf.alves

hm öyleyse sadece UINavigationController().navigationBar/toolbar.hide/showBottomHairline()o zaman hayır kullanabilmeliyim ? Bunu deniyorum ama boşuna. Doğru anlamıyor muyum?
Tommy K

11

Swift 4 // gezinme çubuğu gölge çizgisini gizlemek için

navigationController?.navigationBar.shadowImage = UIImage()

10

UIAppearance API'sını kullanarak bu gölgeyi gizlememe / gösterme veya Storyboard'u (veya kaynak kodunu) kullanarak bu gölgeyi gizleme / gösterme seçimini seçmemi sağlayan bir UINavigationBar uzantısı kullanıyorum. İşte uzantı:

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

Şimdi, gölgeyi tüm gezinme çubuklarında devre dışı bırakmak için kullanmanız gerekir:

UINavigationBar.appearance().flat = true

Veya film şeritlerini kullanarak bu davranışı etkinleştirebilir / devre dışı bırakabilirsiniz:

Gezinme Çubuğu Film Şeridi


@ NunoGonçalves, flatAssociatedObjectKeyilişkili nesnenizi tanımlamak için benzersiz bir int (işaretçi olarak kabul edilir) olarak düşünebilirsiniz . Burada özel bir değişkenin bellek adresi ile tanımlanır. Bu değişkeni eklemek için yanıtı güncelledim. Daha fazla bilgi için nshipster.com/associated-objects adresine bakın .
Alvivi

İyi bir çözüm, ancak yalnızca gezinme çubuğu translucentyanlış olarak ayarlandığında çalışır
ZYiOS

9

Swift 4 Test Edilen TEK HAT ÇÖZÜMÜ

In Viewdidload() anahtarı "hidesShadow" için de geçerlidir Seti Navigasyon kontrolörün userdefault değeri

override func viewDidLoad() {
    super.viewDidLoad()

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

}

1
Mükemmel çalışıyor !!
Prashant Tukadiya

7

Swift bunu koydu

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

içinde

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool

Ve arka plan rengini de kaldırır.
TomSawyer

7

Saydamlığı korumak ve UINavigationControlleruygulamanızdaki her bir alt sınıfı sınıflandırmak istemiyorsanız başka bir seçenek :

#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

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

}

Teşekkürler James! Birinin cevabını neden oy verdiğini anlayamıyorum.
Dănuț Mihai Florian

İhtiyacınız olursa, şunları da ekleyebilirsiniz: self.navigationController.navigationBar.translucent = false self.navigationController.navigationBar.clipsToBounds = false self.navigationController.navigationBar.shadowImage = UIImage () self.navigationController.navigationBn.OurbCo. ()
Alessandro Ornano

5

Swift 4.2 çözümü :

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

Bu işlevi ilk Viewcontroller'a koyun ve viewdidload


4

İOS8 olarak, eğer set UINavigationBar.barStyleiçin .Blacksize kenarlıksız düz renk olarak barın arka plan ayarlayabilirsiniz.

Swift'te:

UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barStyle = UIBarStyle.Black
UINavigationBar.appearance().barTintColor = UIColor.redColor()

Bu, bunu başarmanın en temiz ve en iyi yoludur. <İOS 8'i desteklemeniz gerekmiyorsa, bu yanıtı kullanmamanız için hiçbir neden yoktur. Teşekkürler.
user3344977

Harika çalışıyor. Film şeridinde de ayarladım, bu yüzden herhangi bir koda bile gerek yoktu.
vikzilla

1
Bunu yapmak size standart gölge yerine çok küçük beyaz bir çizgi verir.
Vegard

4

Benim için çalışan iki hat çözümü. Bunu ViewDidLoad yönteminde eklemeyi deneyin:

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

sadece bu benim için çalıştı
Usama bin Attique

3

İşte çok basit bir çözüm:

self.navigationController.navigationBar.clipsToBounds = YES;

37
Durum çubuğu alanı da kırpılır.
Fury

3

Basit çözüm - Swift 5

  1. Bir uzantı oluşturun:

    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. Bunu şuraya ekle viewDidLoad():

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

2

İOS 9 kullanıcıları için bu benim için çalıştı. sadece şunu ekleyin:

UINavigationBar.appearance().shadowImage = UIImage()

2

Arka plan görüntüsünün ayarlanmasındaki sorun, bulanıklığı gidermesidir. Arka plan görüntüsü ayarlamadan kaldırabilirsiniz. Cevabımı burada görün .


2

UISearchBar'ın altına bir görünüm eklemelisiniz

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)

Bu hala bir sorun olduğuna inanamıyorum - sadece tekrar geldi! Ancak bu çözüm şu anda mümkün olan en iyi çözümdür; Teşekkürler @Seat
RichAppz

1

Bu eski bir iş parçacığı olduğunu biliyorum, ama gerçekten iyi çalışan bir çözüm buldum:

Alt sınıf UINavigationBar. UINavigationBar alt sınıfınızda, didAddSubview öğesini aşağıdaki kodla geçersiz kılın:

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

    if ([subview isKindOfClass:[UIImageView class]]) {
        [subview setClipsToBounds:YES];
    }
}

1

Bunun için bir uzantı oluşturdum ... Biçimlendirme için üzgünüm (bu benim ilk cevabım).

Kullanımı:

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

Uzantı:

 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
    }


}

1

AppDelegate içinde bu, NavBar'ın biçimini global olarak değiştirdi:

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

Belirli bir VC'ye farklı bir şey uygulamayı başaramadık, ancak bu insanların% 90'ına yardımcı olacak


1
-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    UIImage *emptyImage = [UIImage new];
    self.navigationController.navigationBar.shadowImage = emptyImage;
    [self.navigationController.navigationBar setBackgroundImage:emptyImage forBarMetrics:UIBarMetricsDefault];
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.