如何在CALayer中绘制径向渐变?

我知道CAGradientLayer目前不支持径向渐变,只有kCAGradientLayerAxial选项。

我想要下面的东西:

在这里输入图像说明

我已经四处寻找这个问题,发现有一个办法解决这个问题。 但是我的解释并不清楚。 所以我想知道,如果我可以使用CAGradientLayer绘制径向渐变,如果是的话,那么该怎么做呢?

根据我的理解,你只需要一个绘制渐变的图层,而CGContextDrawRadialGradient完全CGContextDrawRadialGradient这个需求。 为了重申您所说的话, CAGradientLayer不支持径向渐变,除此之外我们无能为力,除了可以用CALayer子类干净地完成的不必要的调整。

注意:梯度图的代码是从这里取的,这不是这个答案的意思。


viewDidLoad

 GradientLayer *gradientLayer = [GradientLayer new]; gradientLayer.frame = self.view.bounds; [self.view.layer addSublayer:gradientLayer]; 

CALayer子类:

 - (instancetype)init { self = [super init]; if (self) { [self setNeedsDisplay]; } return self; } - (void)drawInContext:(CGContextRef)ctx { size_t gradLocationsNum = 2; CGFloat gradLocations[2] = {0.0f, 1.0f}; CGFloat gradColors[8] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.5f}; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradColors, gradLocations, gradLocationsNum); CGColorSpaceRelease(colorSpace); CGPoint gradCenter= CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); float gradRadius = MIN(self.bounds.size.width , self.bounds.size.height) ; CGContextDrawRadialGradient (ctx, gradient, gradCenter, 0, gradCenter, gradRadius, kCGGradientDrawsAfterEndLocation); CGGradientRelease(gradient); } 

在这里输入图像说明

这里是我使用的Swift3代码:

 import UIKit class RadialGradientLayer: CALayer { required override init() { super.init() needsDisplayOnBoundsChange = true } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } required override init(layer: Any) { super.init(layer: layer) } public var colors = [UIColor.red.cgColor, UIColor.blue.cgColor] override func draw(in ctx: CGContext) { ctx.saveGState() let colorSpace = CGColorSpaceCreateDeviceRGB() var locations = [CGFloat]() for i in 0...colors.count-1 { locations.append(CGFloat(i) / CGFloat(colors.count)) } let gradient = CGGradient(colorsSpace: colorSpace, colors: colors as CFArray, locations: locations) let center = CGPoint(x: bounds.width / 2.0, y: bounds.height / 2.0) let radius = min(bounds.width / 2.0, bounds.height / 2.0) ctx.drawRadialGradient(gradient!, startCenter: center, startRadius: 0.0, endCenter: center, endRadius: radius, options: CGGradientDrawingOptions(rawValue: 0)) } }