2011-05-31 80 views
1

是否有动画不能在循环中工作的原因?我知道你可以做的命令:UIView循环中的动画

[UIView setAnimationRepeatCount: someNumber]; 

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

回答

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]; 
      }]; 
     }]; 
    }]; 
+0

请注意,使用块来设置动画需要4.0的最低OS目标,所以如果你试图定位任何3.X设备,那么你不能使用它。 – 2011-05-31 22:30:12

+0

这听起来像是我的问题的正确评估。你有没有“块?”的例子 – Crystal 2011-05-31 22:32:21

+0

以示例更新我的答案。试试看看它是否适合你。 – 2011-06-01 21:05:02