isRemovedOnCompletion 和 kCAFillModeForwards 有什么区别

What's the difference between isRemovedOnCompletion and kCAFillModeForwards

我很困惑 isRemovedOnCompletionkCAFillModeForwards[=18= 之间有什么区别]层动画。我正在阅读一本关于动画的书,其中建议仅使用 kCAFillModeForwards 来保持显示最后一帧。

但它对我不起作用,所以我进行了搜索,我可以看到其他人建议结合使用 kCAFillModeForwards 和isRemovedOnCompletion 以保持显示最后一帧。上一个解决方案对我有用,但我仍然很困惑,它们之间有什么区别?

您不应为此目的滥用 isRemovedOnCompletionkCAFillModeForwards。我看过这本书,很多例子都用这个"trick",但它是错误的。这是有史以来在互联网上传播的最严重的错误信息模因之一!弥补你动画构造错误的拐杖而已

例如,考虑这个简单的代码:

let opts : UIView.AnimationOptions = .autoreverse
let xorig = self.v.center.x
UIView.animate(withDuration:1, delay: 0, options: opts, animations: {
    self.v.center.x += 100
    }, completion: nil
)

视图向右移动 100 点,然后将 100 点移动回其原始位置 — 然后 跳跃 100 点返回右侧。原因是我们分配给视图中心 x 的最后一个实际值是向右 100 点,所以当动画结束并且 "animation movie" 被甩掉时,视图显示仍然坐着 100指向右边。

解决方法是自己将视图移回原来的位置!您可以在 completion: 函数中执行此操作:

let opts : UIView.AnimationOptions = .autoreverse
let xorig = self.v.center.x
UIView.animate(withDuration:1, delay: 0, options: opts, animations: {
    self.v.center.x += 100
    }, completion: { _ in
        self.v.center.x = xorig
})

所有对 kCAFillModeForwardsisRemovedOnCompletion 的误用都是基于未能做到这一点。无论是在视图动画还是显式层动画中,程序员都忽略了为动画 属性 赋予它在动画结束时将具有的值。所以困惑的程序员所做的就是作弊,将问题掩盖起来。 kCAFillModeForwards 表示 "keep the animation at its endpoint when it ends"。将 isRemovedOnCompletion 设置为 false 意味着动画 永远不会 结束!这是一个糟糕的想法;它给渲染引擎带来了不必要的压力,完全是误导和不必要的。基本上你用动画位置覆盖 view/layer 的真实位置。那是错误的。永远不要效仿那些例子。了解如何正确编写动画并执行此操作。