为啥我应该使用基于块的动画而不是开始/结束动画?

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 开始和结束的时间大约在同一时间时动画会抖动?

为啥 NavigationView 中的动画从左上角开始?

如何为 CALayer 使用基于块的动画?

在后退按钮上,为啥 Firefox 直接跳到我以前的滚动位置而不是动画

UIView 动画完成块在其他动画开始时触发

停止动作脚本动画