2016-05-16 24 views
7

Ho letto molti thread, ma nessuno ha risolto questa domanda in una risposta chiara e coerente per l'ultima versione di Swift.Come cambiare il colore del bordo inferiore di UINavigationBar?

Ad esempio, la risposta in alto this question suggerisce UINavigationBar.appearance().setShadowImage(). Tuttavia, tale metodo non esiste nell'ultima versione di swift.

I non si desidera nascondere il bordo inferiore. Voglio solo cambiare il colore.

Inoltre, sarebbe bello poter modificare l'altezza, ma so che sto chiedendo troppo in una domanda.

Edit: Ho creato un'immagine di 2x1 pixel e impostare al ShadowImage, ma il confine rimane invariato:

UINavigationBar.appearance().barTintColor = UIColor.whiteColor() 
UINavigationBar.appearance().shadowImage = UIImage(named: "border.jpg") //in my AppDelegate, for global appearance 

Ecco l'immagine; è davvero piccolo: border image

+2

L'immagine shadow esiste ancora, è necessario eseguire 'UINavigationBar.appearance(). ShadowImage = ...'in Swift – dan

+0

Qualcuno sa perché il completamento automatico non mostra shadowImage? (Ma in realtà esiste) – TIMEX

+0

Perché non è accessibile tramite 'UINavigationBar.appearance()'. – ZGski

risposta

0

I vecchi metodi di settaggio UIKit come UISomeClass.setSomething(whatIWantToSet) sono stati riformulati in modo da poterli impostare direttamente con un segno =. Quindi, nel mio esempio dovresti usare UISomeClass.something = whatIWantToSet.

Nel tuo caso, è UINavigationBar.appearance().shadowImage = whatYouWantToSet.

13

SWIFT 2.x:

Fuori di convenienza, ho esteso UIImage() per permettermi di usare essenzialmente come un colore con il codice immediatamente sotto.

extension UIImage { 
    class func imageWithColor(color: UIColor) -> UIImage { 
     let rect = CGRectMake(0, 0, 1.0, 0.5) 
     UIGraphicsBeginImageContextWithOptions(rect.size, false, 0) 
     color.setFill() 
     UIRectFill(rect) 
     let image: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image 
    } 
} 

Avanti, ti consigliamo di aggiungere le seguenti righe al codice per regolare l'immagine ombra del viewController UINavigationBar s', o il colore in questo caso.

// Sets Bar's Background Image (Color) // 
self.navigationController?.navigationBar.setBackgroundImage(UIImage.imageWithColor(UIColor.blueColor()), forBarMetrics: .Default) 
// Sets Bar's Shadow Image (Color) // 
self.navigationController?.navigationBar.shadowImage = UIImage.imageWithColor(UIColor.redColor()) 

SWIFT 3.x/4.x:

codice di estensione: il codice

extension UIImage { 
    class func imageWithColor(color: UIColor) -> UIImage { 
     let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 0.5) 
     UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) 
     color.setFill() 
     UIRectFill(rect) 
     let image : UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
     UIGraphicsEndImageContext() 
     return image 
    } 
} 

NavigationBar:

// Sets Bar's Background Image (Color) // 
navigationController?.navigationBar.setBackgroundImage(UIImage.imageWithColor(color: .blue), for: .default) 
// Sets Bar's Shadow Image (Color) // 
navigationController?.navigationBar.shadowImage = UIImage.imageWithColor(color: .red) 

Edit 1:

Aggiornato codice di estensione in modo da poter regolare la dimensione rect senza cambiare colore UIImage opacità.

Edit 2:

Aggiunto Swift 3 + 4 Swift codice.

+0

Sai, perché cambio l'altezza/larghezza del tuo rect a' '' 0.5''', il colore cambia? – TIMEX

+0

@TIMEX, ho aggiornato il mio codice quindi questo non dovrebbe più accadere – ZGski