iOS圆形渐变

时间:2018-12-26 16:40:30

标签: ios swift

我的任务是绘制带有圆形渐变的线(颜色应随圆改变),然后添加动画。现在,我以一定的间隔和不同的颜色绘制360层。

var colours: [UIColor] = [UIColor]()
var startAngle = CGFloat(-0.5 * Double.pi)
var index = 0

func drawLayers() {
    let smallAngle = (1.5 * CGFloat.pi - (-0.5 * CGFloat.pi)) / 360

    if index < colours.count { //colours.count = 360
        let endAngle = startAngle + smallAngle
        let circlePath = UIBezierPath(arcCenter: .init(x: 100, y: 100), radius: 100, startAngle: startAngle, endAngle: endAngle, clockwise: true)
        startAngle = endAngle
        let shapeLayer = CAShapeLayer()
        shapeLayer.path = circlePath.cgPath

        shapeLayer.fillColor = UIColor.clear.cgColor
        shapeLayer.strokeColor = colours[index].cgColor
        shapeLayer.lineWidth = 8

        view.layer.addSublayer(shapeLayer)

        index += 1

        Timer.scheduledTimer(
            withTimeInterval: 0.004,
            repeats: false) { (_) in
                self.drawLayers()
        }
    }
}

类似的东西,但带有线性动画

enter image description here

有人可以告诉我该怎么做吗?

1 个答案:

答案 0 :(得分:5)

iOS现在内置了圆形(圆锥形)渐变。因此,我只要求一次渐变,然后为用作遮罩的单个路径设置动画。那只是两层,更少的工作,真实的动画和真实的渐变。

示例:

enter image description here

这是我的测试代码;根据需要更改颜色和数字:

    let grad = CAGradientLayer()
    grad.type = .conic
    grad.colors = [UIColor.red.cgColor, UIColor.green.cgColor, UIColor.red.cgColor]
    grad.startPoint = CGPoint(x: 0.5, y: 0.5)
    grad.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
    self.view.layer.addSublayer(grad)
    let c = CAShapeLayer()
    let p = UIBezierPath(ovalIn: CGRect(x: 20, y: 20, width: 160, height: 160))
    c.path = p.cgPath
    c.fillColor = UIColor.clear.cgColor
    c.strokeColor = UIColor.black.cgColor
    c.lineWidth = 8
    grad.mask = c
    c.strokeEnd = 0

要制作动画,只需说:

    c.strokeEnd = 1