Dot*_*cer 2 core-animation swift
我对图层动画中isRemovedOnCompletion和kCAFillModeForwards之间的区别感到困惑。我正在阅读一本关于动画的书,其中建议只使用 kCAFillModeForwards 来保持最后一帧的呈现。
但它对我不起作用,所以我进行了搜索,我可以看到其他人建议结合 kCAFillModeForwards 和 isRemovedOnCompletion 以保持最后一帧呈现。最后一个解决方案对我有用,但我仍然很困惑,它们之间有什么区别?
您不应滥用isRemovedOnCompletion或kCAFillModeForwards用于此目的。我看过这本书,很多例子都使用了这个“技巧”,但这是错误的。这是有史以来在互联网上传播的最糟糕的错误信息模因之一!这只是弥补您错误构建动画的事实的拐杖。
例如,考虑这个简单的代码:
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
)
Run Code Online (Sandbox Code Playgroud)
视图向右移动 100 个点,然后将 100 个点移动回其原始位置——然后向右跳回100 个点。原因是我们分配给视图中心的最后一个实际值是向右 100 点,所以当动画结束并且“动画电影”被甩开时,视图显示仍然位于右侧 100 点。x
解决方案是将视图移回其原始位置,您自己!你可以在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
})
Run Code Online (Sandbox Code Playgroud)
所有对kCAFillModeForwards和 的滥用isRemovedOnCompletion都是基于没有做那种事情。无论是在视图动画还是显式层动画中,程序员都忽略了赋予动画属性在动画结束时将具有的值。因此,困惑的程序员所做的就是作弊,将问题扫地出门。kCAFillModeForwards意思是“当动画结束时将动画保持在它的终点”。设置isRemovedOnCompletion为false意味着动画永远不会结束!这是一个可怕的想法;它给渲染引擎带来了不必要的压力,完全是误导和不必要的。基本上,您正在用动画位置覆盖视图/图层的真实位置。那是错误的. 永远不要遵循这些例子。学习如何正确编写动画并这样做。
| 归档时间: |
|
| 查看次数: |
818 次 |
| 最近记录: |