2015-08-08 17 views
18

Wiem, jak ustawić kolor tła paska nawigacyjnego (z barTintColor), ale teraz pracuję nad aplikacją na iOS, która wymaga poziomego gradientu (a nie typowego pionowego gradientu).Jak utworzyć poziomy gradient tła dla paska nawigacyjnego iOS?

Jak utworzyć pasek nawigacyjny z poziomym tłem gradientowym?

+0

Delegowanie to jako zasób, mam nadzieję, że jest niektóre wykorzystanie. http://stackoverflow.com/questions/19632081/horizontal-cagradientlayerlayer-in-ios-7-0 http://nscookbook.com/2013/04/recipe-20-using-cagradient-layer-in -a-custom-view/ – gwar9

Odpowiedz

60

Jeśli chcesz programowo ustawić gradient danym UINavigationBar mam dla Ciebie rozwiązanie.

Pierwsza konfiguracja a CAGradientLayer z wybranymi kolorami i lokalizacjami.

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); 

Następnie chwyć UImage dla tej warstwy.

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

Ustaw gradientImage jako backgroundImage dla UINavigationBar.

[navigationBar setBackgroundImage:gradientImage forBarMetrics:UIBarMetricsDefault]; 

Swift Rozwiązanie:

[![// 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

DZIĘKUJEMY! W końcu dostałem szansę na wdrożenie tego i zadziałało! Najpierw próbowałem dodać warstwę jako podwarstwę, ale wydawało mi się, że jest ona w konflikcie z biblioteką SVProgressHUD, której używam. Wystąpił błąd '[SVIndefiniteAnimatedView _barPosition]: nierozpoznany selektor wysłany do instancji'. Kiedy próbowałem ustawić go jako obraz tła, jak zasugerowałeś, zadziałało! – Andrew

+3

Muszę dodać, że ten kod nie bierze pod uwagę paska stanu. Jeśli chcesz, aby gradient przejął cały pasek stanu, możesz po prostu zrobić coś takiego: 'var updatedFrame = navigationBar.bounds updatedFrame.size.height + = 20 gradientLayer.frame = updatedFrame' – Croisciento

+0

Dziękuję ty! Wyszło mi to dobrze. – Raja

1

Można użyć tego:

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

dla iOS 7 Pasek nawigacyjny wysokości jest 64px

+0

Ale musisz go utworzyć, aby nie używać już stworzonego obrazu. – Slavcho

12

Updated odpowiedź @JulianM dla 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) 
Powiązane problemy