0

嵌套动画

简而言之,嵌套动画允许同时运行 2 个独立的动画。但是,如果我有一个由动画和非动画代码组成的复杂代码怎么办?我的意思是以下情况:

[UIView animateWithDuration:...
animations:^{

    ...//code1 - with animation
    ...//code2 - also contains code which shouldn't be animated
}];

Code2看起来像以下方法的调用:

- (void)someMethod {

    ...//code3 - without animation
    [self someMethod2Animated:NO completion:^{

        [self someMethod2Animated:YES completion:^{

            NSLog(...);
        }];
    }];
}

WheresomeMethod2执行相同的代码,但可能在animatedWithDuration:animations:completion:取决于给定BOOL变量的内部。

如果我运行这段代码,我会看到所有代码部分都是动画的。我试图将 的持续时间设置code2为零,但它没有效果(代码仍然是动画的)。

你能建议如何在不重写所有代码的情况下解决这个问题吗?我听说过一些解决方案,ReactiveCocoa但似乎它们仅适用于网络/单独的异步请求。

已编辑

PromiseKit 2.0 允许将封闭的动画块转换为一系列块,但它不支持我需要的 iOS 7。

4

2 回答 2

0

UIView animateWithDuration 非常适合非常简单(非交互式)的动画。对于您正在做的事情,您应该深入研究 CAAnimation。UIView animateWithDuration 将对块内任何地方发生的任何视图更改进行动画处理。

您基本上是在寻找有条件地链接您的动画。这是关于链接动画的一个很好的答案。 如何在 iOS 应用程序中链接不同的 CAAnimation

于 2015-06-16T17:40:25.373 回答
0

我发现的最佳解决方案是RZViewActions。我的情况的优点:

  • 与没有嵌套块的对象一样操作动画;

  • 串行和并行动画是“序列”和“组”,它们也是从简单的动画数组创建的对象;

  • 只需进行演示,删除[self.spinner startAnimating];,运行并多次单击屏幕即可。即使没有任何特殊代码,也会同时执行许多动画(以防下animateWithDuration:一个动画会杀死前一个未完成的动画)。

第二种解决方案可能是 PromiseKit 2.0。它可以在 iOS 7 下运行,但它需要一些魔法才能添加到项目中。

于 2015-06-18T08:25:59.500 回答