如何在CAShapeLayer上快速循环颜色?

问题描述:

问题:通过颜色上的CAShapeLayer()如何在CAShapeLayer上快速循环颜色?

在下面的代码周期迅速。它 工作正常,但它使设备变暖。在CAShapeLayer()上有更好更多的 快速循环颜色吗?

第1部分

在下面的代码绘制,作为一个例子,一个方形UIBezierPath(),并且填充层CAShapeLayer()

let path = UIBezierPath() 
path.moveToPoint(CGPoint(x: 0, y: 0)) 
path.addLineToPoint(CGPoint(x: 0, y: 100)) 
path.addLineToPoint(CGPoint(x: 100, y: 100)) 
path.addLineToPoint(CGPoint(x: 100, y: 0)) 
path.closePath() 

let shape = CAShapeLayer() 
shape.path = path.CGPath 
shape.fillColor = UIColor.yellowColor().CGColor 

第2部分。

接下来,我添加CAKeyframeAnimation动画到CAShapeLayer()其有效地循环通过快速连续色调,给人的多色图像闪烁效果,下面的示例图像。

let colorsAnimation = CAKeyframeAnimation(keyPath: "fillColor") 

colorsAnimation.values = [UIColor.redColor().CGColor, UIColor.yellowColor().CGColor, UIColor.greenColor().CGColor, UIColor.blueColor().CGColor] 

colorsAnimation.keyTimes = [0.25, 0.5, 0.75, 1.0] 
colorsAnimation.calculationMode = kCAAnimationLinear 
colorsAnimation.removedOnCompletion = false 
colorsAnimation.fillMode = kCAFillModeForwards 
colorsAnimation.duration = 0.5 
colorsAnimation.repeatCount = Float.infinity 

shape.addAnimation(colorsAnimation, forKey: nil) 

图片:

enter image description here

+0

尝试computeMode'kCAAnimationDiscrete',当前你的线性尝试插值颜色,离散不会这样做。不知道你能做得更好吗? – Alistra

+0

谢谢,@Alistra。我确实尝试过'kCAAnimationDiscrete',但它并没有像'kCAAnimationLinear'似乎那样提供颜色之间的平滑变化。我认为我的形象有些误导。然而,你的建议让我更多地思考我想要达到的目标,所以谢谢! – user4806509

+0

只需在阵列中使用更多颜色,不要插入 – Alistra

这是一个有点冗长,但是,这是我要做的事在我的应用程序(电话should't得到温暖,至少我的没有):

var colorArray = [UIColor.red, UIColor.blue, UIColor.yellow, UIColor.orange, UIColor.green, UIColor.cyan, UIColor.purple] 

var colorIndex = 0 
var shouldStop = false 

func sequenceA() { 

    UIView.animate(withDuration: 0, delay: 0.2, options: .allowUserInteraction, animations: { 

     shape.fillColor = colorArray[colorIndex].CGColor 

    }, completion: {finished in 

     print(colorArray[colorIndex]) 

     if colorIndex == colorArray.count - 1 { 
      colorIndex = 0 
     } 
     colorIndex+=1 
     sequenceB() 

    }) 
} 

func sequenceB() { 

    // When you want to stop 
    if shouldStop == true { 
     return 
    } 


    UIView.animate(withDuration: 0, delay: 0.2, options: .allowUserInteraction, animations: { 

     shape.fillColor = colorArray[colorIndex].color 


    }, completion: {finished in 

     print(colorArray[colorIndex]) 

     if colorIndex == colorArray.count - 1 { 
      colorIndex = 0 
     } 
     colorIndex+=1 
     sequenceA() 

    }) 
} 


sequenceA() 

要initate只是调用sequenceA或B和将自己锁定到该切换颜色的重复过程。当你想停止时,你可以将shouldStop设置为true。

您可以通过更改两种功能的延迟将颜色切换的速度更改为任何您想要的颜色,并将颜色类型切换为您希望的颜色类型。希望这可以帮助!

+0

谢谢@Garret Kaye。这可以工作,但我实际上是在我的图像没有显示的颜色之间进行平滑变化之后。抱歉。从我现在的其他阅读中,我相信只有通过“CAKeyframeAnimation”才能实现“CAShapeLayer”的平滑填充更改。但是,你的建议也让我思考更多,并重新审视我正在努力实现的目标,所以谢谢! – user4806509

+0

没问题,祝你好运! –