Jawaban:
Jika ada yang bertanya-tanya bagaimana mencapai ini di iOS 7+, berikut ini solusinya (iOS 6 juga kompatibel)
Dalam Objective-C
[self.navigationBar setBackgroundImage:[UIImage new]
forBarMetrics:UIBarMetricsDefault];
self.navigationBar.shadowImage = [UIImage new];
self.navigationBar.translucent = YES;
Dalam cepat 3 (iOS 10)
self.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.isTranslucent = true
Dengan cepat 2
self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.translucent = true
Mengatur translucent
ke YES
pada bilah navigasi melakukan trik, karena perilaku yang dibahas dalam UINavigationBar
dokumentasi. Saya akan melaporkan di sini fragmen yang relevan:
Jika Anda menyetel properti ini ke
YES
pada bilah navigasi dengan gambar latar belakang kustom buram, bilah navigasi akan menerapkan opacity sistem kurang dari 1,0 ke gambar.
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
Di iOS5 Anda dapat melakukan ini untuk membuat bilah navigasi transparan:
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]];
Dari IOS7:
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];
Bagi siapa saja yang ingin melakukan ini di Swift 2.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true
atau Swift 3.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
Ini sepertinya berhasil:
@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end
navigationController.navigationBar.backgroundColor = [UIColor clearColor];
-drawRect:
dalam subkelas yang tepat, bukan dalam kategori, dan kemudian menggunakan subkelas ini sebagai bilah navigasi Anda.
Setelah melakukan apa yang orang lain katakan di atas, yaitu:
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true
... bilah navigasi saya masih putih . Jadi saya menambahkan baris ini:
navigationController?.navigationBar.backgroundColor = .clear
... dan voila! Sepertinya ini akan berhasil.
Jika Anda membuat dengan beta iOS 13.4 dan XCode 11.4 beta terbaru, jawaban yang diterima tidak akan berfungsi lagi. Saya telah menemukan cara lain, mungkin itu hanya bug dalam perangkat lunak beta, tapi saya menuliskannya di sana, untuk berjaga-jaga
(cepat 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
}
}
}
Saya tahu topik ini sudah lama, tetapi jika orang ingin tahu cara melakukannya tanpa membebani metode drawRect.
Inilah yang Anda butuhkan:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
Kode di bawah ini membentang pada jawaban teratas yang dipilih untuk utas ini, untuk menghilangkan batas bawah dan mengatur warna teks:
Dua baris kode terakhir dari kode ini mengatur transparansi. Saya meminjam kode itu dari utas ini dan berhasil dengan sempurna!
Properti "clipsToBounds" adalah kode yang saya temukan yang menghilangkan garis batas bawah dengan ATAU tanpa set transparansi (jadi jika Anda memutuskan untuk menggunakan latar belakang putih / hitam / dll yang solid, sebagai gantinya, tidak akan ada garis perbatasan).
Baris "tintColor" (baris kode 2) mengatur tombol punggungku menjadi abu-abu terang
Saya menyimpan barTintColor sebagai cadangan. Saya tidak tahu mengapa transparansi tidak akan berfungsi, tetapi jika tidak, saya ingin bg putih saya seperti dulu
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;
Cara lain yang berhasil bagi saya adalah dengan Subclass UINavigationBar Dan biarkan Metode drawRect kosong !!
@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
}}
Dalam Swift 4.2
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
(di viewWillAppear), dan kemudian di viewWillDisappear, untuk membatalkannya, masukkan
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.isTranslucent = false
Apakah yang Anda maksud sepenuhnya transparan, atau menggunakan gaya hitam-tembus pandang yang terlihat di aplikasi Foto? Yang terakhir dapat Anda capai dengan mengatur barStyle
propertinya UIBarStyleBlackTranslucent
. Mantan ... Saya tidak yakin tentang. Jika Anda ingin item di dalamnya tetap terlihat, Anda mungkin harus melakukan beberapa penggalian di hierarki tampilan bilah dan menghapus tampilan yang mengandung latar belakangnya.
Periksa RRViewControllerExtension , yang didedikasikan untuk manajemen tampilan bilah UINavigation.
dengan RRViewControllerExtension di proyek Anda, Anda hanya perlu menimpanya
-(BOOL)prefersNavigationBarTransparent;
di viewcontroller Anda.
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;