UINavigationBar'ı şeffaf yapma


Yanıtlar:


635

Herkes bunu iOS 7+ 'da nasıl başaracağını merak ediyorsa, işte bir çözüm (iOS 6 uyumlu da)

Hedef-C'de

[self.navigationBar setBackgroundImage:[UIImage new]
                         forBarMetrics:UIBarMetricsDefault];
self.navigationBar.shadowImage = [UIImage new];
self.navigationBar.translucent = YES;

Hızlı 3'te (iOS 10)

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

Hızlı 2

self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.translucent = true

Tartışma

Ayar translucentiçin YESgezinme çubuğunda nedeniyle tartışılan bir davranışa, hile yok UINavigationBarbelgelere. Burada ilgili parçayı rapor edeceğim:

Bu özelliği, YESopak özel arka plan görüntüsü olan bir gezinme çubuğunda olarak ayarlarsanız , gezinme çubuğu görüntüye 1,0'dan daha az bir sistem opaklığı uygular.


29
Burada kendi yorumumu cevaplıyorum; etkiler denemek için deneyin:[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = nil; self.navigationController.navigationBar.translucent = NO;
Johann Burgess

Şeffaf bir navbar için sadece bir VC'ye ihtiyacım var. Bu VC'den çıktıktan sonra orijinal stile nasıl geri dönebilirim?
Guilherme

2
Swift'te bir ViewController içinden bunu başarmak için şu şekilde yapın: self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
datayeah

Görünüşü de kullanıyor (iOS7 / 8), bkz: gist.github.com/mpycio/ddbdea1adb6b86cf02f6
Mahakala

1
Etkiyi geri almak sadece kısmen işe yarıyor. Çünkü bunu yaptıktan sonra, tablo görüntülemelerimin hepsinde çok büyük başlık var. Uygulama genelinde, garip. (Bu efekti yalnızca yığına
Henning

29

İOS5'te gezinme çubuğunu şeffaf hale getirmek için bunu yapabilirsiniz:

nav.navigationBar.translucent = YES; // Setting this slides the view up, underneath the nav bar (otherwise it'll appear black)
const float colorMask[6] = {222, 255, 222, 255, 222, 255};
UIImage *img = [[UIImage alloc] init];
UIImage *maskedImage = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(img.CGImage, colorMask)];

[nav.navigationBar setBackgroundImage:maskedImage forBarMetrics:UIBarMetricsDefault]; 
[img release];

6
İOS 6'da gezinme çubuğu gölgesini de kaldırmak isteyeceksiniz, aksi takdirde garip görünecektir. [[UINavigationBar appearance] setShadowImage: [[UIImage alloc] init]];
Robert

23

IOS7'den:

self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.view.backgroundColor = [UIColor clearColor];
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

14

Swift 2.x'te bunu yapmak isteyen herkes için:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true

veya Swift 3.x:

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

2
navigationController isteğe bağlı bir özelliktir, bu yüzden paketini açmanız gerekir. Sadece self.navigationController? .NavigationBar ekleyin ve gitmek için iyi
Daniel Galasko

10

Bu işe yarıyor gibi görünüyor:

@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end

navigationController.navigationBar.backgroundColor = [UIColor clearColor];

6
İOS 5'te -drawRect:bir kategoride değil, uygun bir alt sınıfta geçersiz kılmanız ve ardından bu alt sınıfı gezinme çubuğunuz olarak kullanmanız gerektiği anlaşılıyor .
Yang Meyer

9

Yukarıda herkesin söylediklerini yaptıktan sonra, yani:

navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true

... gezinme çubuğum hala beyazdı . Bu satırı ekledim:

navigationController?.navigationBar.backgroundColor = .clear

... ve voila! Bu hile gibi görünüyordu.


7

En son beta iOS 13.4 ve XCode 11.4 ile oluşturursanız, kabul edilen cevap artık çalışmaz. Başka bir yol buldum, belki sadece beta yazılımında bir hata, ama her ihtimale karşı yazıyorum

(hızlı 5)

import UIKit

class TransparentNavBar :UINavigationBar {
    override func awakeFromNib() {
        super.awakeFromNib()
        self.setBackgroundImage(UIImage(), for: .default)
        self.shadowImage = UIImage()
        self.isTranslucent = true
        self.backgroundColor = .clear
        if #available(iOS 13.0, *) {
            self.standardAppearance.backgroundColor = .clear
            self.standardAppearance.backgroundEffect = .none
            self.standardAppearance.shadowColor = .clear
        }
    }
}

Müthiş! Sadece bir düzeltme arıyordum! Harika çalışıyor! Teşekkürler!
Georg

5

Bu konunun eski olduğunu biliyorum, ancak insanlar drawRect yöntemini aşırı yüklemeden nasıl yapıldığını bilmek istiyorlarsa.

İhtiyacın olan şey bu:

self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

1
Üzgünüm, bu doğru değil. Yine de drawRect yöntemini geçersiz kılmanız gerekiyor
Sander

Bu neden yanlış? IOS 6 sim'de çalışıyor gibi görünüyor. IOS 5'te çalışmıyor mu? navigationBar.backgroundColor belgesiz görünüyor.
Cristi

5

Aşağıdaki kod, alt kenarlıktan kurtulmak ve metin rengini ayarlamak için bu iş parçacığı için seçilen üst yanıt üzerine genişler:

  1. Bu kodun son iki kodlu satırı saydamlığı ayarlar. Ben bu iş parçacığından bu kodu ödünç ve mükemmel çalıştı!

  2. "ClipsToBounds" özelliği, saydamlık kümesi olmadan OR ile alt kenarlık çizgisinden kurtulan bulduğum koddu (bunun yerine düz beyaz / siyah / vb. Arka planla gitmeye karar verirseniz, yine de sınır çizgisi olmayacaktır).

  3. "TintColor" satırı (2. kodlu satır) geri düğmemi açık griye ayarlar

  4. BarTintColor'u yedek olarak sakladım. Şeffaflığın neden işe yaramadığını bilmiyorum, ama eğer işe yaramazsa, eskiden sahip olduğum gibi bg beyazımı istiyorum

    let navigationBarAppearace = UINavigationBar.appearance()
    navigationBarAppearace.tintColor = UIColor.lightGray
    navigationBarAppearace.barTintColor = UIColor.white
    navigationBarAppearace.clipsToBounds = true
    navigationBarAppearace.isTranslucent = true
    navigationBarAppearace.setBackgroundImage(UIImage(), for: .default)
    navigationBarAppearace.shadowImage = UIImage()

3

Swift 3.0 için:

override func viewDidLoad() {
    super.viewDidLoad()

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

3

C # / Xamarin Çözümü

NavigationController.NavigationBar.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
NavigationController.NavigationBar.ShadowImage = new UIImage();
NavigationController.NavigationBar.Translucent = true;

2

Aşağıdaki kod parçasını deneyin:

self.navigationController.navigationBar.translucent = YES;

1

Benim için çalışan başka bir yol UINavigationBar alt sınıf ve drawRect yöntemi boş bırakmaktır!

@IBDesignable class MONavigationBar: UINavigationBar {


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
    // Drawing code
}}

1

Swift 4.2 içinde

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

(viewWillAppear'da) ve sonra viewWillDisappear'da geri almak için

self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.isTranslucent = false

0

Tamamen şeffaf mı yoksa Fotoğraflar uygulamasında görülen yarı saydam siyah stili mi kullanıyorsunuz? İkincisini, barStyleözelliğini ayarlayarak yapabilirsiniz UIBarStyleBlackTranslucent. Birincisi ... Emin değilim. Üzerindeki öğelerin hala görünür olmasını istiyorsanız, çubuğun görünüm hiyerarşisinde biraz araştırma yapmanız ve arka planını içeren görünümü kaldırmanız gerekebilir.


2
Birincisi demek istiyorum. Bir kategori yapma ve UINavigationBar (CGContextClearRect çağıran) drawRect yöntemini geçersiz kılma denedim, ama bu tamamen siyah yaptı. Öğeler yine de görülebiliyordu.
quano

0

Bu Swift 2.0 için çalışıyor.

navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
navigationController!.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.translucent = true

0

UINavigation çubuğu görünüm yönetimine ayrılmış RRViewControllerExtension öğesini kontrol edin .

projenizdeki RRViewControllerExtension ile, sadece geçersiz kılmanız gerekir

-(BOOL)prefersNavigationBarTransparent;

size viewcontroller.

gezinme çubuğu şeffaf


-2
extension UINavigationBar {
var isTransperent: Bool {
        get {
            return false // Just to satisfy property
        }
        set {
            if newValue == true {
                self.shadowImage   = UIImage()
                self.isTranslucent = true
                self.setBackgroundImage(UIImage(), for: .default)
            }else{
                self.shadowImage   = UIImage()
                self.isTranslucent = false
                self.setBackgroundImage(nil, for: .default)
            }
        }
    }
}
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.