2015-05-30 16 views
19

Ich versuche, meine UINavigationBar in UINavigationController transparent zu machen. Ich habe eine Unterklasse von UINavigationController erstellt und eine Szene in meiner Storyboard-Datei gemocht. Hier ist ein Stück meiner Unterklasse:Transparente UINavigationBar in Swift

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    let size = self.navigationBar.frame.size 
    self.navigationBar.setBackgroundImage(imageWithColor(UIColor.blackColor(), size: size, alpha: 0.2), forBarMetrics: UIBarMetrics.Default) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func imageWithColor(color: UIColor, size: CGSize, alpha: CGFloat) -> UIImage { 
    UIGraphicsBeginImageContext(size) 
    let currentContext = UIGraphicsGetCurrentContext() 
    let fillRect = CGRectMake(0, 0, size.width, size.height) 
    CGContextSetFillColorWithColor(currentContext, color.CGColor) 
    CGContextSetAlpha(currentContext, alpha) 
    CGContextFillRect(currentContext, fillRect) 
    let retval: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return retval 
} 

Wenn ich meine Anwendung eines Lauf einer Navigationsleiste transparent, aber Statusleiste ist nur schwarz.

Zum Beispiel, wenn ich so etwas auf UITabBar - es funktioniert.

Antwort

73

Hoffe, dass es Sie

Swift 2 helfen:

self.navigationController.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) 
self.navigationController.navigationBar.shadowImage = UIImage() 
self.navigationController.navigationBar.translucent = true 
self.navigationController.view.backgroundColor = UIColor.clearColor() 

Swift 4

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) 
self.navigationController?.navigationBar.shadowImage = UIImage() 
self.navigationController?.navigationBar.isTranslucent = true 
self.navigationController?.view.backgroundColor = UIColor.clear 

oder wenn Sie wollen sublcass die Navigationssteuerung dann beziehen diese answer.


Ändern der Statusleiste Stil über:

In Ihrem Info.plist Sie -View-Controller-basierte Statusleiste Aussehen auf einen beliebigen Wert definieren müssen.

enter image description here

UIApplication.shared.statusBarStyle = .lightContent 

Wenn Sie die Statusleiste ausblenden möchten:

UIApplication.shared.isStatusBarHidden = true 

diese Ausgabe von Licht Inhalt und zu durch transparente Navigation. Ich habe Ansichthintergrund ist grau. Sie können die Transparenz sehen.

enter image description here

+0

Jetzt kann ich meine Navigationsleiste nicht sehen. Es funktioniert nicht –

+0

Was meinst du mit transparent dann? @NikitaZernov Transparent = klare Farbe. Sie können nur Titel und Schaltfläche sehen. –

+0

Er möchte seine Statusleiste transparent machen. –

29

Wenn Sie mit Swift 2.0 verwendet den Codeblock unter:

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

für Swift 3.0 Verwendung:

navigationController?.setNavigationBarHidden(false, animated: true) 
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) 
navigationController?.navigationBar.shadowImage = UIImage() 
navigationController?.navigationBar.isTranslucent = true 
5

Swift 3.0.1 mit Xcode 8.1

In Ihrem UINavigationController

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) 
    self.navigationBar.shadowImage = UIImage() 
    self.navigationBar.isTranslucent = true 
    self.view.backgroundColor = UIColor.clear 
} 
3

Xcode 8.x: Swift 3: Erweiterung für den gleichen schreiben benutzen, wenn im gesamten

extension UINavigationBar { 

    func transparentNavigationBar() { 
     self.setBackgroundImage(UIImage(), for: .default) 
     self.shadowImage = UIImage() 
     self.isTranslucent = true 
    } 
} 
3

eine Erweiterung von UINavigationController erstellen und präsentieren oder transparente Navigationsleiste auszublenden.

extension UINavigationController { 

    public func presentTransparentNavigationBar() { 
     navigationBar.setBackgroundImage(UIImage(), for:UIBarMetrics.default) 
     navigationBar.isTranslucent = true 
     navigationBar.shadowImage = UIImage() 
     setNavigationBarHidden(false, animated:true) 
    } 

    public func hideTransparentNavigationBar() { 
     setNavigationBarHidden(true, animated:false) 
     navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImage(for: UIBarMetrics.default), for:UIBarMetrics.default) 
     navigationBar.isTranslucent = UINavigationBar.appearance().isTranslucent 
     navigationBar.shadowImage = UINavigationBar.appearance().shadowImage 
    } 
} 
0

habe ich versucht, alle oben genannten Methoden und noch weißen Raum anstelle von Inhalten, die durch gerendert werden sollten bekam.Wenn Sie eine normale Unteransicht (Google map f.), Nicht UIScrollView-Inhalte über die Navigationsleiste zeichnen möchten, müssen Sie den Untersichtrahmen in viewDidAppear einstellen. So Schritt 1:

existingNavigationBar.setBackgroundImage(transparentImageFromAssets, for: .default) 
existingNavigationBar.shadowImage = transparentImageFromAssets 
existingNavigationBar.isTranslucent = true 

Schritt 2:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    self.mapView.frame = UIScreen.main.bounds 

}

Das ist für mich gearbeitet.