2012-12-03 134 views
2

我正在处理两个视图在屏幕上某处相遇的应用程序。当它们相遇时,碰撞检测器就会触发这种方法。它应该识别适当的基础,然后将两个视图发送给它。它确实如此,但它会立即发生,而不是持续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]; 
        }]; 
       } 
      } 
     } 
     } 
    } 
} 
+0

我认为唯一的要求是箭头是UIView的子类,而setCenter是由UIView而不是子类实现的。 –

+0

那么,箭头是UIView的子类,并且setCenter在子类中不会混淆,我收集的是您正在说的内容。 UIView,而不是spriteView必须处理中心的设置。运动发生。它只是瞬间发生。 –

+1

如果添加NSLog(“完成:%@”,完成?@“是”:@“否”);'到完成块?我猜想它会说,“不”。 –

回答

0

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

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

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

+0

太好了。一旦一切正常,请继续评论。我真的很好奇,看看这是否能解决所有问题。谢谢! – picciano

+0

完成块仍然是一个块,对吧?意味着它在自己的线程中运行。也许这就是为什么这两种动画中只有一种能够奏效。每个动画线程一个动画?所以我可能应该在完成块中设置一个标志,并在完成块完成后从运行线程中启动两个动画。我会接下来尝试。 –

+0

@picciano,我解决了另一半的问题。第一个动画是创建碰撞的动画,由重复定时器驱动。代码中有一个跳过涉及碰撞箭头的错误。结果是两个动画试图同时发生在同一个对象上。主动画现在可以正确地跳过返回底部的动画。奇迹般有效。 –

0

根据该文件,你必须使用beginAnimations:context:commitAnimations方法动画center财产。

+0

酒吧对变换做出了相同的陈述,但它使用animationWithDuration进行动画就好了。我认为酒吧只是没有赶上这些变化。 (但是,使用beginAnimations确定脚手架很容易。) –

+0

我会说试试看。这听起来像是为其他人解决了问题。这个类的API文档的其他部分已经更新,我怀疑这个有一些独特的东西,有时需要旧式动画。 – picciano

+0

这就是我在其他代码中移动箭头的方式,但在这种情况下我没有使用旋转变换,并且在这里看到有关使用setCenter的人的另一篇文章,所以我想我会尝试它。 –