制作椭圆渐变形状

Making an oval gradient in shape

我正在尝试找出如何创建一个不是完美圆形的椭圆形渐变。例如美国 football/rugby/eye 形状而不是圆形。

目前我创建了一个 CALayer 子类,如下所示,它创建了一个圆。我怎样才能把它变成椭圆形(如上所述)?

class CircleGradientLayer: CALayer {

var startRadius: CGFloat?
var startCenter: CGPoint?
var endCenter: CGPoint?
var endRadius: CGFloat?
var locations: [CGFloat]?
var colors: [UIColor]?

override func drawInContext(ctx: CGContext) {
    super.drawInContext(ctx)


    if let colors = self.colors, let locations = self.locations, let startRadius = self.startRadius, let startCenter = self.startCenter, let endCenter = self.endCenter, let endRadius = self.endRadius {
        var colorSpace: CGColorSpaceRef?

        var components = [CGFloat]()
        for i in 0 ..< colors.count {
            let colorRef = colors[i].CGColor
            let colorComponents = CGColorGetComponents(colorRef)
            let numComponents = CGColorGetNumberOfComponents(colorRef)
            if colorSpace == nil {
                colorSpace = CGColorGetColorSpace(colorRef)
            }
            for j in 0 ..< numComponents {
                let component = colorComponents[j]
                components.append(component)
            }
        }

        if let colorSpace = colorSpace {
            let gradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, locations.count)
            CGContextDrawRadialGradient(ctx, gradient, startCenter, startRadius, endCenter, endRadius, CGGradientDrawingOptions.DrawsAfterEndLocation)

        }
    } 
}
}

一种方法是通过将 X 放大一些系数来设置图层的变换。例如:

layer.transform = CATransform3DMakeScale(1.5, 1.0)

不确定这是否是最佳解决方案,但它应该可行!