【问题标题】:How Do I Animate a CALayer's Position?如何为 CALayer 的位置设置动画?
【发布时间】:2019-04-18 00:21:52
【问题描述】:

请看一下我用来将子层沿 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
}

使用如图所示的代码,我得到以下行为:

  1. 图层从初始位置缓慢移动到最终位置。
  2. 层然后跳回到初始位置。
  3. 图层保持在初始位置。

我阅读的所有内容都告诉我,发生“跳回”是因为我没有更新模型以反映最终值。因此,让我们通过取消注释最后一行来更新模型。现在的行为是:

  1. 图层从初始位置跳转到最终位置。
  2. 层然后跳回到初始位置。
  3. 然后图层缓慢移动到最终位置。
  4. 图层保持在最终位置。

跳跃显然正在发生,因为最终位置是在模型上设置的。我觉得我处于第 22 阶段。任何帮助将不胜感激。

可以在 GitHub 上找到说明问题的工作项目

Xcode 10.0、iOS 12.2、Swift 4.2

【问题讨论】:

标签: ios12 swift4.2 xcode10.1


【解决方案1】:

这是我的书中开发和解释的规范形式。将动画层设置为其最终值 beforehand 但隐式动画已关闭,如下所示:

@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")
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多