CATransaction 完成块成功或失败

Posted

技术标签:

【中文标题】CATransaction 完成块成功或失败【英文标题】:CATransaction complete block success or failure 【发布时间】:2014-05-23 21:45:13 【问题描述】:

我正在使用 CATransaction 处理 Core Animation。我使用setCompletionBlock 来捕捉动画何时完成,以便我可以处理视图控制器中的数据,但我希望动画是可中断的。例如。当我打电话时

[self.layer removeAllAnimations]

动画应该停止,但是 setCompletionBlock 也应该知道如果动画成功或失败。

对于 UIView 动画,这是可能的,因为在完成块中传递了一个 finished 变量,而对于 CAAnimationGroup,这也可能是通过传递给委托的 finished 变量。我如何使用CATransaction 完成相同的操作?

【问题讨论】:

【参考方案1】:

使用键值编码,您可以将任何您喜欢的变量传递到当前事务中,以便稍后由完成块获取。 CATransaction、CAAnimation、CALayer,它们都接受任意键值对,您可以随心所欲地创建和使用它们。

https://developer.apple.com/library/ios/documentation/graphicsimaging/Reference/CATransaction_class/Introduction/Introduction.html#//apple_ref/occ/clm/CATransaction/setValue:forKey:

【讨论】:

我使用了将任意键/值对附加到 CAAnimation 对象和 CALayer 对象的技巧,效果很好。但是,CATransaction 只不过是类方法。我不知道与 CATransaction 的实例交互的方法,也不知道如何将键/值对附加到像 CATransaction 这样的类。你能解释一下吗? 不涉及实例;你说[CATransaction setValue:@YES forKey:@"cancelled"],稍后用if ([CATransaction valueForKey:@"cancelled"]) 接听。你有没有看过我提供的文档链接? 是的,它似乎适用于嵌套的 CATransactions。简直糟透了,这是一个手动过程,您必须检查以确保子层的每个更改也被取消。虽然这是答案,但出于上述原因,我决定不使用它。 UIView 和 CAAnimationGroup 会为您跟踪它,所以我现在坚持使用它们,直到我不再使用它们为止。 我确实阅读了文档,但显然不够仔细。我想我记得 CALayer 和 CAAnimation 通用的协议声明,它赋予它添加新键/值对的能力。最后我设法错过了这一点。

以上是关于CATransaction 完成块成功或失败的主要内容,如果未能解决你的问题,请参考以下文章

我可以取消 CATransaction 完成块吗?

iOS 在调用完成块之前会在 viewDidDisappear 之后等待 CATransaction

将动画添加到子视图时立即调用 CATransaction 完成块

AFHTTPRequestOperation 不会调用成功或失败块的可能场景都有哪些?

应用程序进入后台后未调用 AFNetworking 成功/失败块

如何以小块上传带有ajax的文件并检查失败,重新上传失败的部分。