swift - isRemovedOnCompletion 和 kCAFillModeForwards 有什么区别

标签 swift core-animation

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

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

最佳答案

您不应为此目的滥用 isRemovedOnCompletionkCAFillModeForwards。我看过这本书和很多例子都使用了这个“技巧”,但这是错误的。这是有史以来在互联网上传播的最严重的错误信息模因之一!这只是弥补你错误构建动画的一个拐杖。

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

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
)

View 以动画方式向右移动 100 点,然后以动画方式移动 100 点回到其原始位置 — 然后 100 点回到右侧。原因是我们分配给 View 中心 x 的最后一个实际值是向右 100 点,所以当动画结束并且“动画电影”被甩掉时, View 仍然显示向右坐 100 点。

解决方案是将 View 移回其原始位置,由您自己完成!您可以在 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 的误用都是基于未能做到这一点。无论是在 View 动画还是显式层动画中,程序员都忽略了为动画属性赋予它在动画结束时将具有的值。所以困惑的程序员所做的就是作弊,将问题掩盖起来。 kCAFillModeForwards 意思是“动画结束时保持在它的端点”。将 isRemovedOnCompletion 设置为 false 意味着动画永不结束!这是一个糟糕的想法;它给渲染引擎带来了不必要的压力,完全是误导和不必要的。基本上,您是用动画位置覆盖 View /图层的真实位置。这是错误的。永远不要效仿那些例子。了解如何正确编写动画并执行此操作。

关于swift - isRemovedOnCompletion 和 kCAFillModeForwards 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52914924/

相关文章:

swift - 暂停和重新启动辅助同步线程

ios - 向NotificationCenter观察者添加参数UIbutton

ios - 在 Storyboard中为 'tile' 创建更大的翻转 View

cocoa - 核心动画——片状窗口滑动

ios - ( numberOfRowsInSection ) ' Type ' ViewController' 不符合协议(protocol) 'UITableViewDataSource'

swift - 如何使用位置将 Swift 子字符串替换为不等于子字符串?

ios - 更改 UITableView 中几个选定的表格 View 单元格文本的颜色

cocoa - 混合使用 Quartz 和 OpenGL?

objective-c - 具有 CATransaction 的 CALayer 动画在 View 调整大小时之前表现不同

objective-c - 警告:“未找到'-renderInContext'方法”