Yanıtlar:
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
Ayar translucent
için YES
gezinme çubuğunda nedeniyle tartışılan bir davranışa, hile yok UINavigationBar
belgelere. Burada ilgili parçayı rapor edeceğim:
Bu özelliği,
YES
opak ö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.
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
İ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];
[[UINavigationBar appearance] setShadowImage: [[UIImage alloc] init]];
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];
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
Bu işe yarıyor gibi görünüyor:
@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end
navigationController.navigationBar.backgroundColor = [UIColor clearColor];
-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 .
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.
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
}
}
}
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];
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:
Bu kodun son iki kodlu satırı saydamlığı ayarlar. Ben bu iş parçacığından bu kodu ödünç ve mükemmel çalıştı!
"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).
"TintColor" satırı (2. kodlu satır) geri düğmemi açık griye ayarlar
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()
NavigationController.NavigationBar.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
NavigationController.NavigationBar.ShadowImage = new UIImage();
NavigationController.NavigationBar.Translucent = true;
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
}}
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
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.
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.
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)
}
}
}
}
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = nil; self.navigationController.navigationBar.translucent = NO;