重复之间的 CABasicAnimation 延迟
CABasicAnimation delay between repeat
下面的代码创建了一个 "shimmer" 效果并且效果很好。 (反射光在光滑表面上移动的样子。)它目前设置为永远重复,这很好,但是,我希望在每个微光之间有一个暂停。我可以延迟效果的开始,但我似乎无法弄清楚如何延迟每个 运行。延迟时间随机加分。
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")
}
我自己没有尝试过,但我相信您可以将动画包装在动画组中,将组的持续时间设置为比真实动画的持续时间长,然后将组设置为重复。
如果这不起作用,您可以改用关键路径动画,其中大部分关键路径是正常动画的再现,其余关键路径只是将动画值固定到开始或终值。
如果你想要一个随机的延迟,你唯一的选择是实际上 运行 一个计时器(或使用 CAAnimationDelegate
)每次都设置一个新的动画。
正如 Kevin 的回答中提到的,您可以使用 CAAnimationGroup
为微光动画的结尾添加延迟。
"shimmer" 动画的持续时间将比组的动画长。这两个持续时间之间的任何差异将是动画之间的延迟。
这是执行此操作的代码,为 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()
这是最终结果:
(gif 使微光动画三次,这就是为什么每三次 "shimmer" 延迟更短的原因。)
下面的代码创建了一个 "shimmer" 效果并且效果很好。 (反射光在光滑表面上移动的样子。)它目前设置为永远重复,这很好,但是,我希望在每个微光之间有一个暂停。我可以延迟效果的开始,但我似乎无法弄清楚如何延迟每个 运行。延迟时间随机加分。
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")
}
我自己没有尝试过,但我相信您可以将动画包装在动画组中,将组的持续时间设置为比真实动画的持续时间长,然后将组设置为重复。
如果这不起作用,您可以改用关键路径动画,其中大部分关键路径是正常动画的再现,其余关键路径只是将动画值固定到开始或终值。
如果你想要一个随机的延迟,你唯一的选择是实际上 运行 一个计时器(或使用 CAAnimationDelegate
)每次都设置一个新的动画。
正如 Kevin 的回答中提到的,您可以使用 CAAnimationGroup
为微光动画的结尾添加延迟。
"shimmer" 动画的持续时间将比组的动画长。这两个持续时间之间的任何差异将是动画之间的延迟。
这是执行此操作的代码,为 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()
这是最终结果:
(gif 使微光动画三次,这就是为什么每三次 "shimmer" 延迟更短的原因。)