Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 连续环中的CALayer梯度跃迁_Ios_Swift - Fatal编程技术网

Ios 连续环中的CALayer梯度跃迁

Ios 连续环中的CALayer梯度跃迁,ios,swift,Ios,Swift,我打算在连续循环中从CALayer渐变过渡设置动画,即从colorOne到colorTwo,然后从colorTwo到colorOne。我只在一个实例中实现了这个逻辑,但没有持续地实现。我该怎么做呢。代码如下: override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated); self.gradientOne = CAGradientLayer(); self.gradientOne?.

我打算在连续循环中从CALayer渐变过渡设置动画,即从colorOne到colorTwo,然后从colorTwo到colorOne。我只在一个实例中实现了这个逻辑,但没有持续地实现。我该怎么做呢。代码如下:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated);
    self.gradientOne = CAGradientLayer();
    self.gradientOne?.frame = self.view.bounds;
    self.gradientOne?.colors = [UIColor(red: 0.0/255.0, green: 150.0/255.0, blue: 123.0/255.0, alpha: 1.0).CGColor, UIColor(red: 0.0/255.0, green: 150.0/255.0, blue: 123.0/255.0, alpha: 1.0).CGColor]
    self.view.layer.insertSublayer(self.gradientOne, atIndex: 0)

            UIView.animateKeyframesWithDuration(3.0, delay: 0.0, options: UIViewKeyframeAnimationOptions.Repeat, animations: { () -> Void in

        UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 3.0, animations: { () -> Void in

            self.colorTimer = NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: "animateLayerToGreen", userInfo: nil, repeats: true);
            self.animateLayerToBlue()
        })

    }, completion: nil)
}

func animateLayerToBlue(){

    var fromColors = self.gradientOne?.colors
    var toColors: [AnyObject] = [ UIColor.blueColor().CGColor, UIColor.blueColor().CGColor]
    self.gradientOne!.colors = toColors
    var animation : CABasicAnimation = CABasicAnimation(keyPath: "colors")

    animation.fromValue = fromColors
    animation.toValue = toColors
    animation.duration = 4.00
    animation.removedOnCompletion = true
    animation.fillMode = kCAFillModeForwards
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    animation.delegate = self
    self.gradientOne?.addAnimation(animation, forKey:"animateGradient")
}

func animateLayerToGreen(){

    var fromColors = self.gradientOne?.colors
    var toColors: [AnyObject] = [UIColor(red: 0.0/255.0, green: 150.0/255.0, blue: 123.0/255.0, alpha: 1.0).CGColor, UIColor(red: 0.0/255.0, green: 150.0/255.0, blue: 123.0/255.0, alpha: 1.0).CGColor]
    self.gradientOne!.colors = toColors
    var animation : CABasicAnimation = CABasicAnimation(keyPath: "colors")

    animation.fromValue = fromColors
    animation.toValue = toColors
    animation.duration = 4.00
    animation.removedOnCompletion = true
    animation.fillMode = kCAFillModeForwards
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    animation.delegate = self
    self.gradientOne?.addAnimation(animation, forKey:"animateGradient")
}
尝试设置:

 animation.repeatCount = Float.infinity
 animation.removedOnCompletion = false

希望它能起作用

请看CAKeyframe动画(以及repeatCount属性)@DavidRönnqvist hi,感谢您的回复。我已经根据您的建议编辑了代码,但没有产生预期的结果。谢谢您,这很有用,在过渡结束时,它会跳回到以前的颜色。如何使前后过渡尽可能平滑?