ทำให้ UINavigationBar โปร่งใส


คำตอบ:


635

หากใครสงสัยว่าจะทำสิ่งนี้ให้สำเร็จใน iOS 7+ ได้หรือไม่นี่เป็นโซลูชัน (รองรับ iOS 6 ด้วย)

ในวัตถุประสงค์ -C

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

อย่างรวดเร็ว 3 (iOS 10)

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

ใน 2 อย่างรวดเร็ว

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

อภิปรายผล

การตั้งค่าtranslucentเป็นYESบนแถบการนำทางเป็นการหลอกลวงเนื่องจากพฤติกรรมที่กล่าวถึงในUINavigationBarเอกสารประกอบ ฉันจะรายงานส่วนที่เกี่ยวข้องที่นี่:

หากคุณตั้งค่าคุณสมบัตินี้เป็นYESบนแถบนำทางที่มีภาพพื้นหลังที่กำหนดเองทึบแสงแถบนำทางจะใช้ความทึบของระบบน้อยกว่า 1.0 กับภาพ


29
ตอบความคิดเห็นของฉันเองที่นี่; เพื่อยกเลิกการลองส่งผลกระทบ:[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = nil; self.navigationController.navigationBar.translucent = NO;
Johann Burgess

ฉันต้องการ VC เดียวเท่านั้นที่จะมีแถบนำทางแบบโปร่งใส ฉันจะเปลี่ยนกลับไปใช้รูปแบบดั้งเดิมหลังจากออกจาก VC นั้นได้อย่างไร
Guilherme

2
เพื่อให้บรรลุใน Swift จากภายใน ViewController ทำเช่นนี้: self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
datayeah

ทำงานโดยใช้การตรวจสอบด้วยเช่นกัน (iOS7 / 8) ดู: gist.github.com/mpycio/ddbdea1adb6b86cf02f6
Mahakala

1
การยกเลิกเอฟเฟกต์สำหรับฉันใช้งานได้เพียงบางส่วนเท่านั้น เพราะหลังจากที่ฉันทำสิ่งนี้แล้วการดูในตารางของฉันล้วนมีส่วนหัวที่ใหญ่เกินไป แอพกว้างซึ่งแปลก (ฉันแค่ต้องการให้เอฟเฟกต์นี้สำหรับคอนโทรลเลอร์หนึ่งตัวที่ฉันกดลงบนสแต็ก)
Henning

29

ใน iOS5 คุณสามารถทำได้เพื่อทำให้แถบการนำทางโปร่งใส:

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
ใน iOS 6 คุณจะต้องลบเงาของแถบนำทางไม่เช่นนั้นมันจะดูแปลก [[UINavigationBar appearance] setShadowImage: [[UIImage alloc] init]];
Robert

23

จาก 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

สำหรับผู้ที่ต้องการทำสิ่งนี้ใน Swift 2.x:

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

หรือ Swift 3.x:

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

2
navigationController เป็นคุณสมบัติทางเลือกดังนั้นคุณต้องแกะมันออกมา เพียงแค่เพิ่ม self.navigationController .navigationBar และคุณจะดีไป?
แดเนียล Galasko

10

ดูเหมือนว่าจะใช้งานได้:

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

navigationController.navigationBar.backgroundColor = [UIColor clearColor];

6
ดูเหมือนว่าใน iOS 5 คุณต้องแทนที่-drawRect:ในคลาสย่อยที่เหมาะสมไม่ใช่ในหมวดหมู่จากนั้นใช้คลาสย่อยนี้เป็นแถบนำทางของคุณ
Yang Meyer

9

หลังจากทำในสิ่งที่คนอื่นพูดข้างต้นคือ:

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

... แถบนำทางของฉันยังคงเป็นสีขาว ดังนั้นฉันจึงเพิ่มบรรทัดนี้:

navigationController?.navigationBar.backgroundColor = .clear

... และ voila! ดูเหมือนว่าจะทำเคล็ดลับ


7

หากคุณสร้างด้วย iOS 13.4 เบต้าล่าสุดและ XCode 11.4 คำตอบที่ยอมรับจะไม่ทำงานอีกต่อไป ฉันพบวิธีอื่นบางทีอาจเป็นเพียงข้อบกพร่องในซอฟต์แวร์เบต้า แต่ฉันกำลังเขียนลงไปที่นั่นในกรณี

(รวดเร็ว 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
        }
    }
}

! น่ากลัว เป็นเพียงการค้นหาวิธีแก้ไข! ใช้งานได้ดี! ขอบคุณ!
Georg

5

ฉันรู้ว่าหัวข้อนี้เก่า แต่ถ้าผู้คนต้องการทราบวิธีการทำโดยไม่ต้องใช้วิธีการ drawRect มากเกินไป

นี่คือสิ่งที่คุณต้องการ:

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

1
ฉันขอโทษนี่ไม่ถูกต้อง คุณยังต้องแทนที่เมธอด drawRect
Sander

ทำไมมันผิด ดูเหมือนว่าจะทำงานใน IOS 6 ซิม มันไม่ทำงานใน IOS 5 ใช่ไหม navigationBar.backgroundColor ดูเหมือนว่าจะไม่มีเอกสาร
Cristi

5

โค้ดด้านล่างจะขยายออกไปตามคำตอบสูงสุดที่เลือกไว้สำหรับเธรดนี้เพื่อกำจัดเส้นขอบด้านล่างและตั้งค่าสีข้อความ:

  1. บรรทัดรหัสสองบรรทัดสุดท้ายของชุดรหัสโปร่งใสนี้ ฉันยืมรหัสนั้นจากกระทู้นี้และมันทำงานได้อย่างสมบูรณ์!

  2. คุณสมบัติ "clipsToBounds" เป็นรหัสที่ฉันพบซึ่งกำจัดเส้นขอบด้านล่างด้วยหรือไม่มีชุดโปร่งใส (ดังนั้นหากคุณตัดสินใจที่จะใช้พื้นหลังสีขาว / ดำ / ฯลฯ ที่เป็นของแข็งแทนจะไม่มีเส้นขอบ)

  3. บรรทัด "tintColor" (บรรทัดที่เข้ารหัส 2) ตั้งค่าปุ่มย้อนกลับของฉันเป็นสีเทาอ่อน

  4. ฉันเก็บ barTintColor ไว้เป็นข้อมูลสำรอง ฉันไม่รู้ว่าทำไมความโปร่งใสถึงใช้งานไม่ได้ แต่ถ้าไม่ฉันต้องการ bg white ของฉันอย่างที่เคยมี

    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:

override func viewDidLoad() {
    super.viewDidLoad()

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

3

โซลูชัน C # / Xamarin

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


1

อีกวิธีหนึ่งที่ทำงานให้ฉันคือ Subclass UINavigationBar และปล่อยให้วิธี 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

ใน Swift 4.2

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

(ใน viewWillAppear) จากนั้นใน viewWillDisappear หากต้องการยกเลิกให้ใส่

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

0

คุณหมายถึงโปร่งใสทั้งหมดหรือใช้สไตล์โปร่งแสงสีดำที่เห็นในแอพรูปภาพ หลังที่คุณสามารถทำได้โดยการตั้งค่าของคุณสมบัติการbarStyle UIBarStyleBlackTranslucentอดีต ... ฉันไม่แน่ใจ หากคุณต้องการให้ไอเท็มนั้นยังคงปรากฏให้เห็นคุณอาจต้องขุดบางส่วนในลำดับชั้นมุมมองของแถบและลบมุมมองที่มีพื้นหลังของมัน


2
ฉันหมายถึงอดีต ฉันพยายามสร้างหมวดหมู่และเอาชนะวิธี drawRect ของ UINavigationBar (เรียกใช้ CGContextClearRect) แต่นั่นทำให้มันเป็นสีดำสนิท รายการยังคงมองเห็นได้
quano

0

ใช้งานได้กับ Swift 2.0

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

0

ตรวจสอบRRViewControllerExtensionซึ่งใช้สำหรับการจัดการลักษณะที่ปรากฏของแถบ UINavigation

ด้วย RRViewControllerExtension ในโครงการของคุณคุณเพียงแค่ต้องแทนที่

-(BOOL)prefersNavigationBarTransparent;

ในมุมมองของคุณ

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)
            }
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.