如何为我的iOS导航栏创build水平渐变背景?

我知道如何设置一个导航栏背景颜色(与barTintColor),但现在我正在iOS应用程序,要求水平渐变(不是典型的垂直渐变)。

我如何创build一个水平渐变背景的导航栏?

如果你想以编程方式设置给定的UINavigationBar的渐变我有你的解决scheme。

首先用你想要的颜色和位置设置一个CAGradientLayer

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

然后抓取该图层的UImage。

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

gradientImage设置为UINavigationBar的backgroundImage。

 [navigationBar setBackgroundImage:gradientImage forBarMetrics:UIBarMetricsDefault]; 

Swift解决scheme:

 [![// Setup the gradient let gradientLayer = CAGradientLayer() gradientLayer.frame = navigationBar.bounds gradientLayer.colors = [UIColor.greenColor().CGColor, UIColor.blueColor().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.renderInContext(UIGraphicsGetCurrentContext()) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() // Set the UIImage as background property navigationBar.setBackgroundImage(image, forBarMetrics: UIBarMetrics.Default) 

结果

更新了iOS 10 / swift 3.0的@JulianM答案:

 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) 

你可以使用这个:

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

对于ios 7导航栏的高度是64px