Làm cho UINavestionBar minh bạch


Câu trả lời:


635

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

Thảo luận

Thiết translucentđể YEStrên thanh điều hướng hiện các trick, do một hành vi được thảo luận trong UINavigationBartà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 YEStrê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.


29
Trả lời bình luận của riêng tôi ở đây; để hoàn tác ảnh hưởng hãy thử:[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = nil; self.navigationController.navigationBar.translucent = NO;
Johann Burgess

Tôi chỉ cần một VC để có một thanh điều hướng trong suốt. Làm cách nào để tôi trở lại phong cách ban đầu sau khi thoát khỏi VC đó?
Guilherme

2
để đạt được điều này trong Swift từ bên trong ViewContoder, hãy thực hiện như sau: self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
datayeah 3/03/2015

Hoạt động bằng cách sử dụng xuất hiện (iOS7 / 8), xem: gist.github.com/mpycio/ddbdea1adb6b86cf02f6
Mahakala

1
Hoàn tác hiệu quả đối với tôi chỉ hoạt động một phần. Bởi vì sau khi tôi làm điều này, tất cả các bảng xem của tôi đều có tiêu đề quá lớn. Toàn ứng dụng, thật kỳ lạ. (Tôi chỉ muốn hiệu ứng này cho một bộ điều khiển mà tôi ấn vào ngăn xếp.)
Henning

29

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];

6
Trong iOS 6, bạn cũng sẽ muốn xóa bóng thanh điều hướng, nếu không nó sẽ trông lạ. [[UINavigationBar appearance] setShadowImage: [[UIImage alloc] init]];
Robert

23

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];

14

Đố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

2
navigationContoder là một thuộc tính tùy chọn, do đó bạn cần mở khóa nó. Chỉ cần thêm self.navigationController .navigationBar và bạn tốt để đi?
Daniel Galasko

10

Điều này dường như làm việc:

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

navigationController.navigationBar.backgroundColor = [UIColor clearColor];

6
Có vẻ như trong iOS 5, bạn phải ghi đè -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.
Yang Meyer

9

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.


7

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
        }
    }
}

Tuyệt vời! Chỉ là tìm kiếm một sửa chữa! Hoạt động tuyệt vời! Cảm ơn!
Georg

5

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];

1
Tôi xin lỗi, điều này không chính xác. Bạn vẫn phải ghi đè phương thức drawRect
Sander

Tại sao điều này là sai? Có vẻ như nó đang hoạt động trong sim iOS 6. Nó không hoạt động trong iOS 5? navigationBar.backgroundColor dường như không có giấy tờ.
Cristi

5

Đ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:

  1. 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!

  2. 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).

  3. 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

  4. 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()

3

cho Swift 3.0:

override func viewDidLoad() {
    super.viewDidLoad()

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

3

Dung dịch C # / Xamarin

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

2

Hãy thử đoạn mã sau:

self.navigationController.navigationBar.translucent = YES;

1

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
}}

1

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

0

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ó barStylethà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ó.


2
Ý tôi là trước đây. Tôi đã thử tạo một danh mục và ghi đè phương thức drawRect của UINavlationBar (gọi CGContextClearRect), nhưng điều đó làm cho nó hoàn toàn đen. Các mặt hàng vẫn có thể nhìn thấy mặc dù.
quano

0

Điều này hoạt động cho Swift 2.0.

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

0

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.

thanh điều hướng tranparent


-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)
            }
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.