如何为 CALayer 的位置设置动画?
How Do I Animate a CALayer's Position?
请看一下我用来将子层沿 y 轴向上移动 50 点的方法。特别注意最后一行(注释掉)。
@objc func animateButtonPressed(_ sender: UIButton) {
let initialValue = customView.sublayer.position.y
let finalValue = customView.sublayer.position.y - 50
let animation = CABasicAnimation(keyPath: "position.y")
animation.fromValue = initialValue
animation.toValue = finalValue
animation.duration = 2
customView.sublayer.add(animation, forKey: "Reposition")
//customView.sublayer.position.y = finalValue
}
使用如图所示的代码,我得到以下行为:
- 图层从初始位置慢慢移动到最终位置。
- 层然后跳回到初始位置。
- 图层保持在初始位置。
我读到的所有内容都告诉我 "jumping back" 的发生是因为我没有更新模型以反映最终值。因此,让我们通过取消注释最后一行来更新模型。现在的行为是:
- 层从初始位置跳到最终位置
- 层然后跳回到初始位置。
- 层然后慢慢移动到最终位置。
- 层保留在最终位置。
显然发生了跳跃,因为正在模型上设置最终位置。我觉得我陷入了困境。任何帮助将不胜感激。
可以在 GitHub
上找到说明该问题的工作项目
Xcode10.0,iOS12.2,Swift4.2
这是在我的书中开发和解释的规范形式。将动画层设置为其最终值之前但隐式动画关闭,如下所示:
@objc func animateButtonPressed(_ sender: UIButton) {
let initialValue = customView.sublayer.position.y
let finalValue = customView.sublayer.position.y - 50
CATransaction.setDisableActions(true) // <-- *
customView.sublayer.position.y = finalValue // <-- *
let animation = CABasicAnimation(keyPath: "position.y")
animation.fromValue = initialValue
animation.toValue = finalValue
animation.duration = 2
customView.sublayer.add(animation, forKey: "Reposition")
}
请看一下我用来将子层沿 y 轴向上移动 50 点的方法。特别注意最后一行(注释掉)。
@objc func animateButtonPressed(_ sender: UIButton) {
let initialValue = customView.sublayer.position.y
let finalValue = customView.sublayer.position.y - 50
let animation = CABasicAnimation(keyPath: "position.y")
animation.fromValue = initialValue
animation.toValue = finalValue
animation.duration = 2
customView.sublayer.add(animation, forKey: "Reposition")
//customView.sublayer.position.y = finalValue
}
使用如图所示的代码,我得到以下行为:
- 图层从初始位置慢慢移动到最终位置。
- 层然后跳回到初始位置。
- 图层保持在初始位置。
我读到的所有内容都告诉我 "jumping back" 的发生是因为我没有更新模型以反映最终值。因此,让我们通过取消注释最后一行来更新模型。现在的行为是:
- 层从初始位置跳到最终位置
- 层然后跳回到初始位置。
- 层然后慢慢移动到最终位置。
- 层保留在最终位置。
显然发生了跳跃,因为正在模型上设置最终位置。我觉得我陷入了困境。任何帮助将不胜感激。
可以在 GitHub
上找到说明该问题的工作项目Xcode10.0,iOS12.2,Swift4.2
这是在我的书中开发和解释的规范形式。将动画层设置为其最终值之前但隐式动画关闭,如下所示:
@objc func animateButtonPressed(_ sender: UIButton) {
let initialValue = customView.sublayer.position.y
let finalValue = customView.sublayer.position.y - 50
CATransaction.setDisableActions(true) // <-- *
customView.sublayer.position.y = finalValue // <-- *
let animation = CABasicAnimation(keyPath: "position.y")
animation.fromValue = initialValue
animation.toValue = finalValue
animation.duration = 2
customView.sublayer.add(animation, forKey: "Reposition")
}