使用 [UIView animateWithDuration...]
来执行复杂的动画可能会很困难和难以控制,尤其是当尝试管理多个并发动画及其完成块时。Core Animation 提供了一些帮助,使用 CAAnimationGroup
,但现实情况下,使用 Core Animation 来完成这些任务既费时又繁琐。RZViewActions 提供了一个解决方案。
使用 CocoaPods(推荐)安装,只需将以下行添加到 Podfile
pod "RZViewActions"
在示例目录中有可用示例项目。您可以使用以下方式快速查看:
pod try RZViewActions
或从 GitHub 下载 zip 文件并手动运行。
RZViewActions 为 UIView 动画提供了额外的结构,并允许您以语义化的方式定义动画
RZViewAction *changeBg = [RZViewAction action:^{
self.view.backgroundColor = [UIColor blueColor];
} withDuration:1.0];
[UIView rz_runAction:changeBg withCompletion:^(BOOL finished) {
NSLog(@"The view changed background color over 1 second");
}];
这种简单的用法可能本身并没有太大用处,但它构成了更复杂动作的基础。请注意,动作可以被存储和多次重复使用。如果您存储了动作,请使用动画块内的弱引用来避免对任何可能保留动作所有权的对象进行保留。
可以将基本动作组合成序列,在运行序列中的每个动作之后,再运行序列中的下一个动作
RZViewAction *rotate = [RZViewAction action:^{
self.label.transform = CGAffineTransformMakeRotation(M_PI_2);
} withOptions:UIViewAnimationOptionCurveEaseInOut duration:3.0];
RZViewAction *wait = [RZViewAction waitForDuration:2.0];
RZViewAction *fade = [RZViewAction action:^{
self.label.alpha = 0.5f;
} withDuration:1.0];
RZViewAction *seq = [RZViewAction sequence:@[rotate, wait, fade]];
[UIView rz_runAction:seq withCompletion:^(BOOL finished) {
NSLog(@"The label rotated, and then faded out 2 seconds later");
}];
从上面动画的定义中,可以立即清楚地知道动画的意图,因为每个动作都是单独定义的,而不是嵌套在完成块中。
RZViewActions 也提供了分组动画,可以同时执行多个动作
RZViewAction *group = [RZViewAction group:@[rotate, fade]];
[UIView rz_runAction:group withCompletion:^(BOOL finished) {
NSLog(@"The label rotated over 3 seconds, and faded out during the first second");
}];
使用标准的 UIView 动画来实现分组行为非常困难,尤其是在尝试执行完成块时,但 RZViewActions 使得这些任务变得简单明了。
序列可以被添加到组中,组也可以被添加到序列中,这意味着您的视图动画可以是任意复杂的。然而,RZViewActions的自描述性意味着您的动画可以变得复杂,但您的代码仍然易于理解、易于调试,并且意图明确。
Rob Visentin, [邮箱地址保护]
RZViewActions可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。