循环中的UIView动画

时间:2011-05-31 22:23:50

标签: objective-c iphone core-animation

动画在循环中不起作用的原因是什么?我知道你可以做命令:

[UIView setAnimationRepeatCount: someNumber];

这是正常工作,直到我把实际不同的pdf加载。所以之前,只有一个pdf总是被加载,当我做动画说5次去最后一个文档时,动画看起来是正确的。但是现在我有5个不同的pdf,它将使用CurlUp将页面翻转5次,但它将继续显示列表中的第1个pdf,然后在最后加载正确的pdf。所以我想我可以在循环中完成它,跟踪数组中的位置,并在我翻阅页面时在每个位置加载每个pdf,这样用户就可以感觉到它们在pdf堆栈中的位置。但是当我把核心动画代码放在一个循环中时,它基本上只显示了一次动画,但确实找到了正确的文档。

1 个答案:

答案 0 :(得分:5)

根据我对你所做的事情的理解,听起来你实际上是在同时运行所有5个动画。在for循环中执行动画块时,runloop不会在每个循环之间进行迭代,只会运行最后一个动画。

您需要使用的是使用完成呼叫和"链"他们在一起。所以你运行第一个动画,然后在完成调用你运行第二个,然后在那个调用第三个,等等。编码更冗长,但这将工作。

在这种情况下使用块会更容易,然后所有动画代码将放在一个地方,而不是必须在每个动画的一堆方法中展开它们。您只需嵌套块,在第一个动画的完成块中,您将生成第二个,然后是第三个,等等。

这是使用块方法的示例。这有点难以阅读,但你会得到这个想法。您可以创建一个动画块并在每个完成方法中重复使用它,但我不知道这样做的所有捕获,当您第一次尝试时,这更容易阅读理解它。

请注意,我还没有尝试过这个或测试过它,但我认为它会做你想要的。

    [UIView animateWithDuration:1.0 animations:^(void) {
        // Animation changes go here
        // blah.alpha = 1.0
        // blah.position = CGPointMake
        // etc
    } completion:^(BOOL finished) {
        // Start next animation which will run with this one finishes
        [UIView animateWithDuration:1.0 animations:^(void) {
            // Animation changes go here
            // blah.alpha = 1.0
            // blah.position = CGPointMake
            // etc
        } completion:^(BOOL finished) {
            // Start next animation which will run with this one finishes
            [UIView animateWithDuration:1.0 animations:^(void) {
                // Animation changes go here
                // blah.alpha = 1.0
                // blah.position = CGPointMake
                // etc
            } completion:^(BOOL finished) {
                // Start next animation which will run with this one finishes
                [UIView animateWithDuration:1.0 animations:^(void) {
                    // Animation changes go here
                    // blah.alpha = 1.0
                    // blah.position = CGPointMake
                    // etc
                } completion:nil];
            }];
        }];
    }];