Câu trả lời:
Nếu có ai thắc mắc làm thế nào để đạt được điều này trong iOS 7+, thì đây là một giải pháp (cũng tương thích với iOS 6)
Trong Mục tiêu-C
[self.navigationBar setBackgroundImage:[UIImage new]
forBarMetrics:UIBarMetricsDefault];
self.navigationBar.shadowImage = [UIImage new];
self.navigationBar.translucent = YES;
Trong swift 3 (iOS 10)
self.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.isTranslucent = true
Trong 2
self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.translucent = true
Thiết translucent
để YES
trên thanh điều hướng hiện các trick, do một hành vi được thảo luận trong UINavigationBar
tài liệu. Tôi sẽ báo cáo ở đây đoạn có liên quan:
Nếu bạn đặt thuộc tính này
YES
trên thanh điều hướng có hình nền tùy chỉnh mờ đục, thanh điều hướng sẽ áp dụng độ mờ của hệ thống nhỏ hơn 1.0 cho hình ảnh.
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
Trong iOS5, bạn có thể làm điều này để làm cho thanh điều hướng trong suốt:
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]];
Từ 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];
Đối với bất kỳ ai muốn làm điều này trong Swift 2.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true
hoặc Swift 3.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
Điều này dường như làm việc:
@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end
navigationController.navigationBar.backgroundColor = [UIColor clearColor];
-drawRect:
vào một lớp con thích hợp, không phải trong một danh mục và sau đó sử dụng lớp con này làm thanh điều hướng.
Sau khi làm những gì mọi người khác đã nói ở trên, tức là:
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true
... Thanh điều hướng của tôi vẫn trắng . Vì vậy, tôi đã thêm dòng này:
navigationController?.navigationBar.backgroundColor = .clear
... et voila! Điều đó dường như để làm các mẹo.
Nếu bạn xây dựng với phiên bản beta mới nhất iOS 13.4 và XCode 11.4, câu trả lời được chấp nhận sẽ không hoạt động nữa. Tôi đã tìm thấy một cách khác, có thể đó chỉ là một lỗi trong phần mềm beta, nhưng tôi sẽ viết nó xuống đó, chỉ trong trường hợp
(nhanh 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
}
}
}
Tôi biết chủ đề này đã cũ, nhưng nếu mọi người muốn biết nó được thực hiện như thế nào mà không làm quá tải phương thức drawRect.
Đây là những gì bạn cần:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
Đoạn mã dưới đây mở rộng theo câu trả lời trên cùng được chọn cho chủ đề này, để thoát khỏi viền dưới cùng và đặt màu văn bản:
Hai dòng mã hóa cuối cùng của mã này đặt độ trong suốt. Tôi đã mượn mã đó từ chủ đề này và nó hoạt động hoàn hảo!
Thuộc tính "clipToBound" là mã mà tôi đã tìm thấy đã loại bỏ đường viền dưới cùng với OR mà không được đặt độ trong suốt (vì vậy nếu bạn quyết định sử dụng nền trắng / đen / vân vân, thay vào đó, vẫn sẽ không có đường viền).
Dòng "tintColor" (dòng được mã hóa thứ 2) đặt nút quay lại của tôi thành màu xám nhạt
Tôi giữ barTintColor như một bản sao lưu. Tôi không biết tại sao tính minh bạch sẽ không hoạt động, nhưng nếu nó không, tôi muốn bg của tôi màu trắng như tôi đã từng có nó
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;
Một cách khác hiệu quả với tôi là Phân lớp UINavestionBar và để trống Phương thức drawRect !!
@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
}}
Trong Swift 4.2
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
(trong viewWillAppear), và sau đó trong viewWillDisappear, để hoàn tác nó, đặt
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.isTranslucent = false
Bạn có nghĩa là hoàn toàn trong suốt, hoặc sử dụng phong cách màu đen mờ nhìn thấy trong ứng dụng Ảnh? Cái sau bạn có thể thực hiện bằng cách đặt thuộc tính của nó barStyle
thành UIBarStyleBlackTranslucent
. Trước đây ... tôi không chắc chắn về. Nếu bạn muốn các mục trên đó vẫn hiển thị, bạn có thể phải thực hiện một số thao tác tìm kiếm trong phân cấp chế độ xem của thanh và xóa chế độ xem chứa nền của nó.
Kiểm tra RRViewControllExtension , được dành riêng cho quản lý xuất hiện thanh UINavestion .
với RRViewControllExtension trong dự án của bạn, bạn chỉ cần ghi đè
-(BOOL)prefersNavigationBarTransparent;
trong bạn điều khiển xem.
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;