为啥我应该使用基于块的动画而不是开始/结束动画?
Posted
技术标签:
【中文标题】为啥我应该使用基于块的动画而不是开始/结束动画?【英文标题】:Why should I use the block-based animation rather than begin/end animation?为什么我应该使用基于块的动画而不是开始/结束动画? 【发布时间】:2012-10-30 08:21:41 【问题描述】:如您所知,Apple 鼓励我们在 ios 4.0 上使用一种称为基于块的动画的新方法。
我真的很想知道基于块的动画比开始/结束样式动画更好。 性能? 并发? 编码效率和便利性?
【问题讨论】:
非常开放的问题。 “因为块规则”怎么样? 因为块可以放在事件队列中,并且由运行时更有效地管理。 【参考方案1】:我当时也想知道这个。
但是在使用这样的基于块的动画之后:
[UIView animateWithDuration:0.5 ... ^
// animated custom view vertically
completion:^
[UIView animateWithDuration:0.5 ... ^
// animate the fade in alpha of buttons
];
];
它以简洁的方式提供完成处理程序。您还可以将子动画块相互嵌套。
对于 BeginAnimation/EndAnimation,我不记得究竟如何为完成处理程序执行回调,但您通常会执行以下操作:
// 开始动画 // 设置委托 // 为每个 beginAnimation 创建委托回调函数
现在想象一下,如果您想嵌套 3 层或 4 层动画,例如复制 CSS 灯箱效果:
1) 淡入灯箱容器
2) 展开宽度
3) 展开高度
4) 淡入淡出
您必须处理一些非常混乱的 if-else 条件。
您的工作流程如下:
"这个 beginAnimation 完成后,它会向我的回调方法发送一条消息,向下滚动 Xcode 找到回调委托方法,然后在回调方法中调用另一个 UIView beginAnimation,向上滚动 Xcode 找到下一个 beginAnimation .. 。”
使用基于块的动画,每个进程都封装在一个块中,您可以将其嵌套在另一个块中。如果您决定要更改顺序,则显示如下:
1) 淡入灯箱容器
2) 这次在 Width 之前扩展 Height
3) 这次在高度之后展开宽度
4) 淡入淡出
使用 beginAnimation 方法,您将开始拔毛。
希望对您有所帮助。
【讨论】:
【参考方案2】:非常方便。
使用块几乎无法提高性能。所以这不太可能。我原以为动画的所有块语法都是调用旧方法(或通过调用类似的内部方法有效地做到这一点),然后在 beginAnimation 和 commitAnimation 之间运行块。
所以,方便。无论如何,我建议单独使用它。它更易于使用,并且可以轻松嵌套动画并在完成时执行操作,因为您无需创建其他方法来在完成时调用 - 它只是另一个块。
【讨论】:
以上是关于为啥我应该使用基于块的动画而不是开始/结束动画?的主要内容,如果未能解决你的问题,请参考以下文章
为啥当 CATransactions 开始和结束的时间大约在同一时间时动画会抖动?