2015-08-08 19 views
18

So come impostare un colore di sfondo della barra di navigazione (con barTintColor), ma ora sto lavorando su un'app iOS che richiede un gradiente orizzontale (non il tipico gradiente verticale).Come posso creare uno sfondo sfumato orizzontale per la mia barra di navigazione iOS?

Come è possibile creare una barra di navigazione con uno sfondo a gradiente orizzontale?

+0

questo distacco come una risorsa, spero che sia di qualche uso. http://stackoverflow.com/questions/19632081/horizontal-cagradientlayer-in-ios-7-0 http://nscookbook.com/2013/04/recipe-20-using-cagradient-layer-in -a-custom-view/ – gwar9

risposta

60

Se si desidera impostare a livello di codice il gradiente di un dato UINavigationBar ho una soluzione per voi.

Prima installazione a CAGradientLayer con i colori e le posizioni desiderati.

CAGradientLayer *gradientLayer = [CAGradientLayer layer]; 
gradientLayer.frame = navigationBar.bounds; 
gradientLayer.colors = @[ (__bridge id)[UIColor greenColor].CGColor, 
          (__bridge id)[UIColor blueColor].CGColor ]; 
gradientLayer.startPoint = CGPointMake(0.0, 0.5); 
gradientLayer.endPoint = CGPointMake(1.0, 0.5); 

Quindi prendi l'UImage per quel livello.

UIGraphicsBeginImageContext(gradientLayer.bounds.size); 
[gradientLayer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *gradientImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Impostare la gradientImage come BackgroundImage per il vostro UINavigationBar.

[navigationBar setBackgroundImage:gradientImage forBarMetrics:UIBarMetricsDefault]; 

Swift Soluzione:

[![// Setup the gradient 
let gradientLayer = CAGradientLayer() 
gradientLayer.frame = navigationBar.bounds 
gradientLayer.colors = [UIColor.green.cgColor, UIColor.blue.cgColor] 
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5) 
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5) 

// Render the gradient to UIImage 
UIGraphicsBeginImageContext(gradientLayer.bounds.size) 
gradientLayer.render(in: UIGraphicsGetCurrentContext()!) 
let image = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

Set the UIImage as background property 
navigationBar.setBackgroundImage(image, for: UIBarMetrics.default) 

Result

+0

GRAZIE! Finalmente ho avuto la possibilità di implementare questo e ha funzionato! Per prima cosa ho provato ad aggiungere il layer come sottolivello, ma sembrava in conflitto con la libreria SVProgressHUD che sto usando. Stavo ricevendo l'errore '[SVIndefiniteAnimatedView _barPosition]: selettore non riconosciuto inviato all'istanza'. Quando ho provato ad impostarlo come immagine di sfondo, come hai suggerito, ha funzionato! – Andrew

+3

Dovrò aggiungere che questo codice non prenderà in considerazione la barra di stato. Se si desidera avere il gradiente prendere in consegna tutta la barra di stato e si può semplicemente fare qualcosa di simile: 'var = updatedFrame navigationBar.bounds updatedFrame.size.height + = 20 gradientLayer.frame = updatedFrame' – Croisciento

+0

Grazie tu! Ha funzionato per me bene. – Raja

1

è possibile utilizzare tale:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"gardientImage"] forBarMetrics:UIBarMetricsDefault]; 

per iOS 7 navigazione altezza della barra è 64px

+0

Ma devi crearlo, non usare l'immagine già creata. – Slavcho

12

Aggiornato risposta @JulianM per iOS 10/SWIFT 3.0:

let gradientLayer = CAGradientLayer() 
var updatedFrame = self.navigationController!.navigationBar.bounds 
updatedFrame.size.height += 20 
gradientLayer.frame = updatedFrame 
gradientLayer.colors = [UIColor.green.cgColor, UIColor.blue.cgColor] 
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5) 
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5) 

UIGraphicsBeginImageContext(gradientLayer.bounds.size) 
gradientLayer.render(in: UIGraphicsGetCurrentContext()!) 
let image = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

self.navigationController!.navigationBar.setBackgroundImage(image, for: UIBarMetrics.default)