如何等待动画 - 完成块

时间:2012-12-03 21:42:08

标签: ios animation uiview

我正在开发一个应用程序,其中两个视图在屏幕上的某个位置相遇。当它们相遇时,碰撞检测器就会触发这种方法。它应该识别适当的基础,然后将两个视图发送给它。它确实如此,但它会立即发生而不是4秒钟。我错过了什么? RADIUS在此代码之上定义。这与箭头不是UIView有什么关系吗? spriteView类是UIView的子类。

-(void)sendToBase:(spriteView *)arrow
{
   int teamNumber = arrow.teamNumber;
   // Find the location of the base.
   for (UIView *scaledView in self.view.subviews) {
      if (scaledView.tag == 100) {
         for (UIView *base in scaledView.subviews) {
            if (base.tag >= 1000) {
               if (teamNumber + 1000 == base.tag) {
                  // We found the right base.
                  CGPoint newCenter;
                  newCenter.x = base.center.x + arc4random() % (int) floor(RADIUS) - RADIUS/2.0;
                  newCenter.y = base.center.y + arc4random() % (int) floor(RADIUS) - RADIUS/2.0;
                  [UIView animateWithDuration:4.0 delay:0.0 options:UIViewAnimationCurveLinear animations:^{
                     [arrow setCenter:newCenter];
                  } completion:^(BOOL finished) {
                     // After walking back to base, remove and create new objects
                     [arrow removeFromSuperview];
                     [self addArrow:scaledView toTeam:teamNumber];
                  }];
               }
            }
         }
      }
   }
}

由于类型不匹配是问题的可能性,因此我修改了代码,结果相同。

-(void)sendToBase:(spriteView *)arrow
{
   UIView *uiSpriteView = (UIView *)arrow;
   int teamNumber = arrow.teamNumber;
   // Find the location of the base.
   for (UIView *scaledView in self.view.subviews) {
      if (scaledView.tag == 100) {
         for (UIView *base in scaledView.subviews) {
            if (base.tag >= 1000) {
               if (teamNumber + 1000 == base.tag) {
                  // We found the right base.
                  CGPoint newCenter;
                  newCenter.x = base.center.x + arc4random() % (int) floor(RADIUS) - RADIUS/2.0;
                  newCenter.y = base.center.y + arc4random() % (int) floor(RADIUS) - RADIUS/2.0;
                  [UIView animateWithDuration:4.0 delay:0.0 options:UIViewAnimationCurveLinear animations:^{
                     [uiSpriteView setCenter:newCenter];
                  } completion:^(BOOL finished) {
                     // After walking back to base, remove and create new objects
                     [arrow removeFromSuperview];
                     [self addArrow:scaledView toTeam:teamNumber];
                  }];
               }
            }
         }
      }
   }
}

2 个答案:

答案 0 :(得分:0)

根据文档,您必须使用beginAnimations:context:commitAnimations方法为center属性设置动画。

答案 1 :(得分:0)

我解决了问题(使用setCenter)。有两个动画正在进行中。

第一个动画发生在碰撞之前。 第二个动画是由于碰撞而发生的。

检测碰撞(从而产生第二个动画)的代码位于动画块而不是完成块中。当我将代码移动到完成块时,第二个动画工作。好吧,差不多。两个箭头中的一个正确动画。我现在可能会发现另一个问题,因为其中一个正在发挥作用。