CABasicAnimation重复之间的延迟

squ*_*o10 4 delay cabasicanimation swift

下面的代码创造了一个"微光"效果,效果很好.(反射光在光滑表面上移动的外观.)它目前设置为永久重复,这很好,但是,我希望每个闪光之间有一个暂停.我可以延迟效果的开始,但我似乎无法弄清楚如何延迟每次运行.如果延迟时间是随机的,则奖励积分.

func startShimmering() {

    let light = UIColor.white.cgColor
    let alpha = UIColor.white.withAlphaComponent(0.0).cgColor

    let gradient = CAGradientLayer()
    gradient.colors = [alpha, light, alpha]
    gradient.frame = CGRect(x: -self.bounds.size.width, y: 0, width: 3 * self.bounds.size.width, height: self.bounds.size.height)
    gradient.startPoint = CGPoint(x: 1.0, y: 0.525)
    gradient.endPoint = CGPoint(x: 0.0, y: 0.5)
    gradient.locations = [0.1, 0.5, 0.9]
    self.layer.mask = gradient

    let animation = CABasicAnimation(keyPath: "locations")
    animation.fromValue = [0.0, 0.1, 0.2]
    animation.toValue = [0.8, 0.9, 1.0]
    animation.duration = 1.5
    animation.repeatCount = HUGE
    gradient.add(animation, forKey: "shimmer")
}
Run Code Online (Sandbox Code Playgroud)

nat*_*ter 11

正如Kevin的回答中提到的,你可以使用a CAAnimationGroup来为你的微光动画结束添加一个延迟.

"闪烁"动画的持续时间将长于组的动画.这两个持续时间之间的任何差异将是动画之间的延迟.

这是代码,为Swift游乐场做好准备:

class ShimmerView: UIView {

    func startShimmering() {

        let light = UIColor.white.cgColor
        let alpha = UIColor.white.withAlphaComponent(0.0).cgColor

        let gradient = CAGradientLayer()
        gradient.colors = [alpha, light, alpha]
        gradient.frame = CGRect(x: -self.bounds.size.width, y: 0, width: 3 * self.bounds.size.width, height: self.bounds.size.height)
        gradient.startPoint = CGPoint(x: 1.0, y: 0.525)
        gradient.endPoint = CGPoint(x: 0.0, y: 0.5)
        gradient.locations = [0.1, 0.5, 0.9]
        self.layer.mask = gradient

        let shimmer = CABasicAnimation(keyPath: "locations")
        shimmer.fromValue = [0.0, 0.1, 0.2]
        shimmer.toValue = [0.8, 0.9, 1.0]
        shimmer.duration = 1.5
        shimmer.fillMode = kCAFillModeForwards
        shimmer.isRemovedOnCompletion = false

        let group = CAAnimationGroup()
        group.animations = [shimmer]
        group.duration = 2
        group.repeatCount = HUGE
        gradient.add(group, forKey: "shimmer")

    }

}

let view = ShimmerView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
PlaygroundPage.current.liveView = view

view.backgroundColor = .blue
view.startShimmering()
Run Code Online (Sandbox Code Playgroud)

这是最终结果:

闪光的GIF

(gif为闪光灯设置了三次动画效果,这就是为什么每三分之一的"微光"延迟更短.)

  • 值得一提的是,闪烁动画(CABasicAnimation)不能有repeatCount = .infinity,只有动画组。 (3认同)

Lil*_*ard 5

我自己没有尝试过,但我相信您可以将动画包装在动画组中,将组的持续时间设置为比实际动画的持续时间长,然后将组设置为重复。

如果这不起作用,您可以改用 keypath 动画,其中大部分 keypath 是正常动画的再现,而 keypath 的其余部分只是将动画值固定到开始或结束值。

如果你想要一个随机延迟,你唯一的选择是实际运行一个计时器(或使用 a CAAnimationDelegate)每次设置一个新动画。