我正在处理两个视图在屏幕上某处相遇的应用程序。当它们相遇时,碰撞检测器就会触发这种方法。它应该识别适当的基础,然后将两个视图发送给它。它确实如此,但它会立即发生,而不是持续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];
}];
}
}
}
}
}
}
我认为唯一的要求是箭头是UIView的子类,而setCenter是由UIView而不是子类实现的。 –
那么,箭头是UIView的子类,并且setCenter在子类中不会混淆,我收集的是您正在说的内容。 UIView,而不是spriteView必须处理中心的设置。运动发生。它只是瞬间发生。 –
如果添加NSLog(“完成:%@”,完成?@“是”:@“否”);'到完成块?我猜想它会说,“不”。 –