Swift: 暂停沿路径移动的动画?
Swift: Pause an animation that is moving along a path?
我有一个泡泡动画,像这样:
func bubblePoint(_ value: CGFloat, midX: CGFloat) -> CGPoint {
let startY: CGFloat = UIScreen.main.bounds.height
let endY: CGFloat = -100
let rangeX: CGFloat = UIScreen.main.bounds.width * 0.1
let y = startY + (endY - startY) * value
let x = sin(value * 4 * .pi) * rangeX * (0.1 + value * 0.9) + midX * UIScreen.main.bounds.width
let point = CGPoint(x: x, y: y)
return point
}
func bubblePath(midX: CGFloat) -> UIBezierPath {
let path = UIBezierPath()
path.move(to: bubblePoint(0, midX: midX))
for value in stride(from: CGFloat(0.01), through: 1, by: 0.01) {
path.addLine(to: bubblePoint(value, midX: midX))
}
return path
}
func createAnimation(midX: CGFloat, duration: CFTimeInterval) -> CAKeyframeAnimation {
let animation = CAKeyframeAnimation(keyPath: "position")
animation.path = bubblePath(midX: midX).cgPath
animation.duration = duration
animation.repeatCount = Float.infinity
return animation
}
func createBubble(midX: CGFloat, duration: CFTimeInterval) -> (UIImageView, CAKeyframeAnimation) {
return (
view: UIImageView().then {
[=11=].image = image
},
animation: createAnimation(midX: midX, duration: duration)
)
}
let bubbles = createBubble(midX: 100, duration: 11, )
bubble.layer.add(animation, forKey: nil)
我想在用户转到另一个屏幕时暂停气泡(然后在用户返回时恢复动画)。我已经研究过像 this 这样的解决方案,但我不知道如何使用像我这样的路径的动画来做到这一点。这样做实用吗?
暂停(冻结)动画主要有两种方法。一种是将图层 speed
设置为零。另一种是将动画包装在 UIViewPropertyAnimator 中并暂停动画器(即使使用关键帧动画也可以这样做)。
但是请注意,当 "user goes to another screen" 时,动画可能会被完全删除。因此,您可能需要存储有关我们在动画中的位置的信息,并在您的视图控制器返回屏幕时从那里开始。
我有一个泡泡动画,像这样:
func bubblePoint(_ value: CGFloat, midX: CGFloat) -> CGPoint {
let startY: CGFloat = UIScreen.main.bounds.height
let endY: CGFloat = -100
let rangeX: CGFloat = UIScreen.main.bounds.width * 0.1
let y = startY + (endY - startY) * value
let x = sin(value * 4 * .pi) * rangeX * (0.1 + value * 0.9) + midX * UIScreen.main.bounds.width
let point = CGPoint(x: x, y: y)
return point
}
func bubblePath(midX: CGFloat) -> UIBezierPath {
let path = UIBezierPath()
path.move(to: bubblePoint(0, midX: midX))
for value in stride(from: CGFloat(0.01), through: 1, by: 0.01) {
path.addLine(to: bubblePoint(value, midX: midX))
}
return path
}
func createAnimation(midX: CGFloat, duration: CFTimeInterval) -> CAKeyframeAnimation {
let animation = CAKeyframeAnimation(keyPath: "position")
animation.path = bubblePath(midX: midX).cgPath
animation.duration = duration
animation.repeatCount = Float.infinity
return animation
}
func createBubble(midX: CGFloat, duration: CFTimeInterval) -> (UIImageView, CAKeyframeAnimation) {
return (
view: UIImageView().then {
[=11=].image = image
},
animation: createAnimation(midX: midX, duration: duration)
)
}
let bubbles = createBubble(midX: 100, duration: 11, )
bubble.layer.add(animation, forKey: nil)
我想在用户转到另一个屏幕时暂停气泡(然后在用户返回时恢复动画)。我已经研究过像 this 这样的解决方案,但我不知道如何使用像我这样的路径的动画来做到这一点。这样做实用吗?
暂停(冻结)动画主要有两种方法。一种是将图层 speed
设置为零。另一种是将动画包装在 UIViewPropertyAnimator 中并暂停动画器(即使使用关键帧动画也可以这样做)。
但是请注意,当 "user goes to another screen" 时,动画可能会被完全删除。因此,您可能需要存储有关我们在动画中的位置的信息,并在您的视图控制器返回屏幕时从那里开始。