2015-05-30 8 views
19

Sto cercando di rendere trasparente il mio UINavigationBar in UINavigationController. Ho creato una sottoclasse di UINavigationController e l'ho apprezzata in una scena del mio file storyboard. Ecco un pezzo del mio sottoclasse:UINavigationBar trasparente 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 
} 

Quando eseguo la mia applicazione un avere una barra di navigazione trasparente, ma la barra di stato è solo nero.

Ad esempio, se faccio qualcosa del genere su UITabBar - funziona.

risposta

73

Spero che ti aiuta

Swift 2:

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 

O Se si vuole sublcass il controller di navigazione quindi fare riferimento questo answer.


Modificare il bar in stile stato tramite:

Nella tua Info.plist è necessario definire View Controller-based barra di stato l'aspetto a qualsiasi valore.

enter image description here

UIApplication.shared.statusBarStyle = .lightContent 

Se si desidera nascondere la barra di stato:

UIApplication.shared.isStatusBarHidden = true 

Ottenere questo output contenuti luce e dalla navigazione trasparente. Ho visto lo sfondo è grigio. puoi vedere la trasparenza.

enter image description here

+0

Ora non riesco a vedere la barra di navigazione. Non funziona –

+0

Cosa intendi con trasparente allora? @NikitaZernov Trasparente = colore trasparente. puoi vedere solo titoli e pulsante. –

+0

Vuole rendere la sua barra di stato trasparente. –

29

Se stai usando Swift 2.0 utilizza il blocco di codice qui sotto:

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

per SWIFT 3.0 uso:

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 con Xcode 8.1

Nel tuo 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: Estensione per lo stesso write once usa tutta

extension UINavigationBar { 

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

creare un'estensione di UINavigationController e presente o nascondere barra di navigazione trasparente.

0

Ho provato tutti i metodi sopra e ho ancora uno spazio bianco invece del contenuto che si suppone debba essere sottoposto a rendering.Se si desidera disegnare una sottoview regolare (mappa di Google f.e.), non il contenuto di UIScrollView tramite la barra di navigazione, è necessario impostare il frame di visualizzazione secondaria in viewDidAppear. Così passo 1:

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

fase 2:

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

}

Questo ha funzionato per me.