removeOnCompletion = NO 到底是做啥的?

Posted

技术标签:

【中文标题】removeOnCompletion = NO 到底是做啥的?【英文标题】:What exactly does removedOnCompletion = NO do?removeOnCompletion = NO 到底是做什么的? 【发布时间】:2011-01-20 12:43:34 【问题描述】:

CAAnimation 提供了 removedOnCompletion 属性,默认为 YES。

让我们认识到这些事实:

A) 核心动画只影响表现树,而不影响模型树。动画完成后,您最终会看到模型树中设置的任何内容。例如,您可以将 fillMode 设置为 kCAFillModeBoth,一旦动画完成,这会将值从 Presentation Tree 交换到 Model Tree。这会导致您的动画无法恢复(这很可能是您想要的)。

B) 我做了一个实验。 removedOnCompletion = NO 将 NOT 具有与 kCAFillModeBoth 或 kCAFillModeForwards 相同的效果。更准确地说:它对动画完成后的结果完全没有影响。不管它是否被“移除”,它似乎根本不会影响 Presentation Tree。

要解释 removeOnCompletion 的真正作用,文档在这方面太薄弱了。我不明白。谁能解释一下究竟要删除什么,不删除有什么好处?

我的猜测是,Apple 正在谈论动画对象本身,它通过 -addAnimation:forKey: 添加到层中......但再次强调:保留它有什么意义?

【问题讨论】:

关于 WWDC 的精彩视频:developer.apple.com/videos/play/wwdc2017/235 【参考方案1】:

removedOnCompletion:

基本上,当动画完成时,动画会从层的动作中移除。

YES - 如果您打算只使用一次动画,则不需要使用委托方法在完成时从图层中移除动画。

fillMode:

此属性控制动画完成时视觉上发生的情况,具体取决于指定的填充模式类型。

【讨论】:

【参考方案2】:

如果removedOnCompletion 为YES,动画将在完成时被移除,并且根本没有任何东西可以“向前填充”。所以如果你想使用fillMode,你必须将removedOnCompletion设置为NO

【讨论】:

是的,填充模式没有显示任何影响,因为我们正在移除动画,因此对象返回到原始状态【参考方案3】:

即使动画停止,视图的表示层也会受到动画的影响。移除动画时,表示层会恢复为视图模型层的值,所以你会得到一个指向0的结果。

【讨论】:

【参考方案4】:

removedOnCompletion = YES 真的只是一个捷径。在大多数情况下,我不鼓励使用它,而是同时设置模型值。

尽管您不使用它们但仍然存在的动画可能会消耗能量和带宽并使您的逻辑混乱,因为您无法再检查 animationKeys 来轮询(如果您需要的话)它们是否已经完成了。

【讨论】:

以上是关于removeOnCompletion = NO 到底是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

iOS UIScrollView clipToBounds = NO 未检测到子视图

No_data_found 异常也传播到外部块?

在 Asp:Chart 中设置 no-repeat 到 backimage

socket接收到数据增加no

No.24 统计1到100的和

iPhone 4 iOS 5 电池电量监控是不是需要将 setBatteryMonitoringEnabled:NO 添加到定期电池检查?