Hızlı bir şekilde navigasyon çubuğunun kenarlığı nasıl kaldırılır?


131

Navigasyon Çubukları sınırını şanssız olarak kaldırmaya çalışıyorum. Araştırdım ve insanlar shadowImage ve BackgroundImage'ı sıfır olarak ayarlamalarını söylüyorlar, ancak bu benim durumumda çalışmıyor.

Benim kodum

    self.navigationController?.navigationBar.barTintColor = UIColor(rgba: "#4a5866")
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
    self.navigationController?.navigationBar.shadowImage = UIImage(named: "")

örnek:

görüntü açıklamasını buraya girin

Yanıtlar:


309

Sorun şu iki satırda:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
self.navigationController?.navigationBar.shadowImage = UIImage(named: "")

İsimsiz bir görüntünüz olmadığından, UIImage(named: "")döner nil, bu da varsayılan davranışın devreye girdiği anlamına gelir:

Sıfır olmadığında, varsayılan gölge görüntüsü yerine gösterilecek özel bir gölge görüntüsü. Özel bir gölgenin gösterilmesi için -setBackgroundImage: forBarMetrics: ile özel bir arka plan görüntüsü de ayarlanmalıdır (varsayılan arka plan görüntüsü kullanılırsa, varsayılan gölge görüntüsü kullanılacaktır).

Gerçekten boş bir resme ihtiyacınız var, bu yüzden sadece şununla başlayın UIImage():

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()

2
Bu cevap gerçekten işe yarıyor. Çünkü kabul edilen yanıtı (kod) kullanırsanız, araç çubuğu imageViews için kaldırın.
Sergey Krasiuk

1
Kabul edilen cevap bu olmalıdır. Ayrıca, UINavigationBar.appearance ()
Heinrisch

1
Swift 3 için kabul edilen cevap bu olmalı. Kabul edilen cevap benim için Swift 2'de işe yaradı, ancak Swift 3'te
işe yaramadı

1
swift3 için biraz farklı yazmalısınız: self.navigationController? .navigationBar.setBackgroundImage (UIImage (), for: UIBarMetrics.default) self.navigationController? .navigationBar.shadowImage = UIImage ()
Chetan Dobariya

5
Bu yöntem iOS 11'deki büyük başlıkla çakışıyor
SteffenK

53

Swift 4 ve Swift 5

Kenarlığın kaldırılması:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for:.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.layoutIfNeeded()

Sınır geri yükleniyor:

self.navigationController?.navigationBar.setBackgroundImage(nil, for:.default)
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.layoutIfNeeded()

2
Mükemmel cevap :)
PJR

Burada layoutIfNeeded () 'e ihtiyacımız var mı?
korgx9

1
Evet korgx9, buna ihtiyacımız var. Aksi takdirde bir sonraki çekime kadar rengi değiştirmez.
Sazzad Hissain Khan

37

bu gölge görüntüyü tamamen kaldıracaktır

for parent in self.navigationController!.navigationBar.subviews {
 for childView in parent.subviews {
     if(childView is UIImageView) {
         childView.removeFromSuperview()
     }
 }
}

1
Detaylandırır mısın
Kmeixner

1
Ayrıca benim için bu çözüm çalışıyor, @Nate Cook'un cevabı işe yaramadı. : S
Luca Davanzo

2
Kutsal şeytan !! Tüm aramalardan sonra, işe yarayan TEK şey budur.
Tuan Anh Vu

çalışıyor, ama aynı zamanda gezinme çubuğunda bir menü simgesi var ve kayboldu: / Sadece kenarlığın silinmesini istiyorum. YARDIM: /
Stephy Samaniego

Bu benim için çalıştı, ancak yeni ViewController'a bastıktan sonra çizgiyi oradan kaldırıyor. Bundan nasıl kurtulabilirim?
Anirudha Mahale

36

Swift 2 ile bunu şu şekilde yapabilirsiniz:

AppDelegate dosyası

Inside func uygulaması (..., didFinishLaunchingWithOptions launchOptions: ...)

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)

Swift 3 için:

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)

Doğru cevap.
Ed.

Bu kapsamlı cevap!
madeny

Garip yerlere yazmaktansa bu tür yararlı varsayılanları Appdelegate'de yazmak daha iyidir. Doğru Cevap :)
Md Rais

35

Bunu sadece UINavigationBar uzantısına yazın

extension UINavigationBar {

    func shouldRemoveShadow(_ value: Bool) -> Void {
        if value {
            self.setValue(true, forKey: "hidesShadow")
        } else {
            self.setValue(false, forKey: "hidesShadow")
        }
    }
}

Ve sizin görüşünüzdeController ...

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.shouldRemoveShadow(true)        
}

Ve bunu herhangi bir viewController için geri almak için, sadece false değerini verin.


Bu harika çalışıyor, ANCAK nav yığınındaki TÜM vcs içinse gizler. Eğer vc1'de kullanırsanız ve vc1, vc2'ye itebilirse, vc2'de de gizlenecektir. Gölgeyi vc2'de göstermek için, viewDidLoad'da bunu false olarak ayarlamanız gerekir. Sorun, vc1'e geri döndüğünüzde, vc2'de sıfırlandığı için tekrar gösterilmesidir. İleri geri gidip gelmek için mantık kullanmalısınız ki buna değmeyebilir. Bununla birlikte, gölge görüntünün herhangi bir vc'de görünmesini istemiyorsanız, bu gitmenin en kolay yoludur
Lance Samaria

Diyelim ki 5 viewController içeren bir viewControllers yığınına sahibiz (Ve ilkinde gölgeyi gizledik). Şimdi yalnızca 3. viewController için, gölgeyi gizlemek İSTEMİYORUM. Bu yüzden, bu yöntemi viewWillAppear'da FALSE ve görünümde TRUE ile 3. viewController'ınWillDisappear'ı ile çağıracağım. Tüm gereken bu!
Gaurav Chandarana

kesinlikle doğru, iyi fikir! Cevabınızı çok kısa ve etkili olduğu için şaşırttığımı sanmayın, ben de oy verdim. Hata mesajları için onu ve navBar'ı kaldırmak için kullanıyorum. Bulduğum sorun, vc1'de kaldırırken vc2'yi göstermekti, ancak vc2'de bir hata varsa, bunu viewWillDisappear'da kaldırmak işe yaramayabilir. Ama yine de çok özel bir durum. Genel durum kullanımı için viewWillDisappear fikrini beğeniyorum ve cevabınıza eklemelisiniz. Kodunuz ne olursa olsun çalışır ve gölgeyi kaldırmanın kolay bir yoludur! 👍🏿👍🏿
Lance Samaria

Tıkır tıkır çalışıyor. Bunun özel ayarlar olmadığından emin olmak mı istedin?
inokey

2
Bu mükemmel bir cevap! Kodu kolaylaştıran bir yanıt ekledim.
Scott Gardner

13

Set barStyleiçin .Blackrenk tonunu ayarlamadan önce:

self.navigationController?.navigationBar.translucent = false
self.navigationController?.navigationBar.barStyle = .Black
self.navigationController?.navigationBar.barTintColor = UIColor.blueColor()

bunun gerçekten işe yaraması biraz rastgele mi? yoksa fazla mı düşünüyorum?
joe

@joe iyi burada çalışıyor :-) sizin için işe yaramıyor mu?
gpbl

şey bu, ÇALIŞIYOR. BarStyle'ı neden siyaha çevirip sonra tüm barTintColor'u maviye çevirdiğine dair bir açıklama olup olmadığını merak ediyorum :)
joe

belki siyah ve opak olarak ayarlandığında, navigasyon
çubuğundaki

Bunu kullanmayı denedim ve alt çizgiyi kaldırıyor ancak beyaz bir çubuk tonu kullanıyorsanız başlık görünmüyor: /
RileyDev

11

Swift 5

İnce çizgiyi gizlemek için setBackgroundImage / shadowImage kullanılırken, hafif bir gecikme olur. Bu yöntem gecikmeyi ortadan kaldırır. Chameleon Framework'e Kredi Verin . Kullandıkları yöntem budur (ObjC'de)


extension UINavigationController {
    func hideHairline() {
        if let hairline = findHairlineImageViewUnder(navigationBar) {
            hairline.isHidden = true
        }
    }
    func restoreHairline() {
        if let hairline = findHairlineImageViewUnder(navigationBar) {
            hairline.isHidden = false
        }
    }
    func findHairlineImageViewUnder(_ view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1.0 {
            return view as? UIImageView
        }
        for subview in view.subviews {
            if let imageView = self.findHairlineImageViewUnder(subview) {
                return imageView
            }
        }
        return nil
    }
}

1
FWIW, iOS 13.4'te benim için çalışan tek çözüm bu ...
kevinstueber

9

Luca Davanzo'nun cevabı harika, ancak iOS 10'da çalışmıyor. İOS 10 ve altında çalışacak şekilde değiştirdim.

for parent in navigationController!.view.subviews {
    for child in parent.subviews {
        for view in child.subviews { 
            if view is UIImageView && view.frame.height == 0.5 {
                view.alpha = 0
            }
        }
    }
}

Ayrıca UINavigationController'ı genişletebilir ve bundan vazgeçebilirsiniz. removeFromSuperview()hatta iOS 10'da çalışmayacak, bu yüzden alfa'yı 0 olarak ayarladım, böylece bu çağrı her yerde uyumlu olacak.


Gezinirken bazı viewControllers'de gölgeyi göstermenin / gizlemenin herhangi bir yolu var mı?
Ashkan.H

A sahip yükseklikleri kontrol etmelisiniz height >= 1.0. 3x retina ekrana sahip iPhone modellerinde (örn. 8 Plus, XR ...) saç çizgisinin yüksekliği 0,33'tür.
fl034

7

Swift 3+ sürümünde UINavigationBar'dan kenarlığı kaldırmak için şunu kullanın:

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().isTranslucent = false

5

hızlı 3 için

içinde viewDidLoadyöntemi

navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()


4

Birinin merak etmesi durumunda Swift 4 için güncellendi

navigationBar.shadowImage = UIImage()
navigationBar.backIndicatorImage = UIImage()

Artık daha da az ayrıntılı.


2

Arka plan rengini değiştirmeden yapmak istiyorsanız bu şekilde:

// Remove the border ImageView from the NavigationBar background
func hideBottomBorder() {
    for view in navigationBar.subviews.filter({ NSStringFromClass($0.dynamicType) == "_UINavigationBarBackground" }) as [UIView] {
        if let imageView = view.subviews.filter({ $0 is UIImageView }).first as? UIImageView {
            imageView.removeFromSuperview()
        }
    }
}

NOT: Bu, bir üretim uygulamasında çökebilir. Görünüşe göre NavigationBar görünümünün kaybolmasını sevmiyor


2

Kabul edilen cevap benim için işe yaradı, ancak gölge görüntünün geri döndüğümde veya başka bir vc'ye ileri doğru iterken yeniden görünmesini istediğimde gezinme çubuğunda gözle görülür bir göz kırpma olduğunu fark ettim.

Bu yöntemi navigationController?.navigationBar.setValue(true, forKey: "hidesShadow") viewWillAppear içinde kullanma gölge çubuğu geçerli görünür görünüm denetleyicisinde gizlidir.

Bu 2 yöntemi kullanmak

navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")

in viewWillDisappear yanıp sönme hala gerçekleşir, ancak yalnızca gölge görüntü yeniden göründüğünde ve gezinme çubuğunun kendisi değil.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // 1. hide the shadow image in the current view controller you want it hidden in
    navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
    navigationController?.navigationBar.layoutIfNeeded()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)

    // 2. show the shadow image when pushing or popping in the next view controller. Only the shadow image will blink
    navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
    navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")
    navigationController?.navigationBar.layoutIfNeeded()
}

1

swift3 için biraz farklı yazmalısınız:

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(),
    for: UIBarMetrics.default)
   self.navigationController?.navigationBar.shadowImage = UIImage()


1

Uygulama temsilcisi

UINavigationBar.appearance().setBackgroundImage(UIImage(), for: UIBarMetrics.default)
UINavigationBar.appearance().shadowImage = UIImage()

1

Yalnızca alt satırı kaldırmak ve navigationBar'ın düz rengini korumak istiyorsanız, bu kod satırlarını viewDidLoad: Swift 3, 4'e ekleyin:

navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = false

Barış!


0

Kenar çizgisi bir UIImageView'dur ve bir imageView olan bir alt görünümü kaldırmak, UIImageView ile barButtonItems'i kaldırır. Aşağıdaki kod, onu kaldırmanıza yardımcı olacaktır. Umarım bu benim gibi bir sorunla karşılaşan birine yardımcı olur.

for parent in self.navigationController!.navigationBar.subviews {
        for childView in parent.subviews {
            if childView.frame.height == 0.5 {
                childView.removeFromSuperview()
            }
        }
    }

Kenar UIImageView yalnızca 0,5 yüksekliğindedir, bu nedenle bu kod yalnızca bunu kaldırır.


Bu benim için çökmelere neden oldu. Bence ebeveyn ve childView'ların, her birini kontrol etmeden önce sıfır olma ihtimaline karşı açılmaları gerekiyor. Yine de özel bir UINavigationController kullanıyorum, bu yüzden bu, standart çubuğu olan diğer kullanıcılar için geçerli olmayabilir.
Natalia

0

AppDelegate içinde bu, NavBar'ın formatını global olarak değiştirdi ve alt satırı / sınırı kaldırır:

 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'de farklı bir şey uygulamayı başaramadım, ancak bu, insanların% 90'ına yardımcı olacak


UINavigationBar.appearance (). BackgroundColor = UIColor.redColor () gerekli değildir.
sabiland

0

Nate Cook cevabının hızlı 3 üssündeki cevap bu

   self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    self.navigationController?.navigationBar.shadowImage = UIImage()

0

iOS 11 ve Swift 4 Kenarlığı kaldırmak istiyor ancak navigitonbar'ı yarı saydam yapmak istemiyorsanız aşağıdakileri denemelisiniz.
self.navigationBar.shadowImage = UIImage()


0

özel navigationController'ınıza şu satırları ekleyin:

self.navigationBar.setBackgroundImage(UIImage(), for:.default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.layoutIfNeeded()

Önemli Not

ilk satır viewDidLoad () yöntemini kullanıyorsanız son satır önemlidir, çünkü navigationController gezinme çubuğunu yeniden çizmelidir, ancak bunu, gezinme çubuğunu çizmeden önce viewWillAppear () yönteminde layoutIfNeeded () olmadan kolayca kullanabilirsiniz.


0

Jack Chen'in Swiftier yöntemi:

extension UINavigationController {

    var isHiddenHairline: Bool {
        get {
            guard let hairline = findHairlineImageViewUnder(navigationBar) else { return true }
            return hairline.isHidden
        }
        set {
            if let hairline = findHairlineImageViewUnder(navigationBar) {
                hairline.isHidden = newValue
            }
        }
    }

    private func findHairlineImageViewUnder(_ view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1.0 {
            return view as? UIImageView
        }

        for subview in view.subviews {
            if let imageView = self.findHairlineImageViewUnder(subview) {
                return imageView
            }
        }

        return nil
    }
}

Kullanımı:

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.isHiddenHairline = true
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.isHiddenHairline = false
    }

0
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithTransparentBackground()
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.