คุณจะทำให้UINavigationBar โปร่งใสได้อย่างไร แม้ว่าฉันต้องการให้รายการบาร์ของมันยังคงมองเห็นได้
คุณจะทำให้UINavigationBar โปร่งใสได้อย่างไร แม้ว่าฉันต้องการให้รายการบาร์ของมันยังคงมองเห็นได้
คำตอบ:
หากใครสงสัยว่าจะทำสิ่งนี้ให้สำเร็จใน 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 กับภาพ
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
ใน 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];
[[UINavigationBar appearance] setShadowImage: [[UIImage alloc] init]];
จาก 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];
สำหรับผู้ที่ต้องการทำสิ่งนี้ใน 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
ดูเหมือนว่าจะใช้งานได้:
@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end
navigationController.navigationBar.backgroundColor = [UIColor clearColor];
-drawRect:
ในคลาสย่อยที่เหมาะสมไม่ใช่ในหมวดหมู่จากนั้นใช้คลาสย่อยนี้เป็นแถบนำทางของคุณ
หลังจากทำในสิ่งที่คนอื่นพูดข้างต้นคือ:
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true
... แถบนำทางของฉันยังคงเป็นสีขาว ดังนั้นฉันจึงเพิ่มบรรทัดนี้:
navigationController?.navigationBar.backgroundColor = .clear
... และ voila! ดูเหมือนว่าจะทำเคล็ดลับ
หากคุณสร้างด้วย 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
}
}
}
ฉันรู้ว่าหัวข้อนี้เก่า แต่ถ้าผู้คนต้องการทราบวิธีการทำโดยไม่ต้องใช้วิธีการ drawRect มากเกินไป
นี่คือสิ่งที่คุณต้องการ:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
โค้ดด้านล่างจะขยายออกไปตามคำตอบสูงสุดที่เลือกไว้สำหรับเธรดนี้เพื่อกำจัดเส้นขอบด้านล่างและตั้งค่าสีข้อความ:
บรรทัดรหัสสองบรรทัดสุดท้ายของชุดรหัสโปร่งใสนี้ ฉันยืมรหัสนั้นจากกระทู้นี้และมันทำงานได้อย่างสมบูรณ์!
คุณสมบัติ "clipsToBounds" เป็นรหัสที่ฉันพบซึ่งกำจัดเส้นขอบด้านล่างด้วยหรือไม่มีชุดโปร่งใส (ดังนั้นหากคุณตัดสินใจที่จะใช้พื้นหลังสีขาว / ดำ / ฯลฯ ที่เป็นของแข็งแทนจะไม่มีเส้นขอบ)
บรรทัด "tintColor" (บรรทัดที่เข้ารหัส 2) ตั้งค่าปุ่มย้อนกลับของฉันเป็นสีเทาอ่อน
ฉันเก็บ 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()
สำหรับ Swift 3.0:
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
}
NavigationController.NavigationBar.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
NavigationController.NavigationBar.ShadowImage = new UIImage();
NavigationController.NavigationBar.Translucent = true;
ลองใช้รหัสต่อไปนี้:
self.navigationController.navigationBar.translucent = YES;
อีกวิธีหนึ่งที่ทำงานให้ฉันคือ 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
}}
ใน 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
คุณหมายถึงโปร่งใสทั้งหมดหรือใช้สไตล์โปร่งแสงสีดำที่เห็นในแอพรูปภาพ หลังที่คุณสามารถทำได้โดยการตั้งค่าของคุณสมบัติการbarStyle
UIBarStyleBlackTranslucent
อดีต ... ฉันไม่แน่ใจ หากคุณต้องการให้ไอเท็มนั้นยังคงปรากฏให้เห็นคุณอาจต้องขุดบางส่วนในลำดับชั้นมุมมองของแถบและลบมุมมองที่มีพื้นหลังของมัน
ใช้งานได้กับ Swift 2.0
navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
navigationController!.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.translucent = true
ตรวจสอบRRViewControllerExtensionซึ่งใช้สำหรับการจัดการลักษณะที่ปรากฏของแถบ UINavigation
ด้วย RRViewControllerExtension ในโครงการของคุณคุณเพียงแค่ต้องแทนที่
-(BOOL)prefersNavigationBarTransparent;
ในมุมมองของคุณ
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;