2014-01-16 79 views
2

我需要在我创建的游戏中让我的角色跳跃(将origin.y增加50并反向)。最平滑的方式背靠背UIAnimations

到目前为止,我所遇到的这样的方式有两种:

方法1:

[UIView animateWithDuration:1.0 
         delay:0.0 
        options:UIViewAnimationOptionAutoreverse 
       animations:^{ 
        CGRect frame = self.kevinImageView.frame; 
        frame.origin.y -= 50; 
        self.kevinImageView.frame = frame; 
       } completion:^(BOOL finished){ 
        CGRect frame = self.kevinImageView.frame; 
        frame.origin.y = 135; 
        self.kevinImageView.frame = frame; 
       }]; 

问题:在每一个完整的跳跃动画(上下)的结束ImageView跳起来然后回落(可能由于调用completion块所需的微小量)。这是显而易见的,我宁愿不这样做。

方法2:

[UIView animateWithDuration:1.0 
       animations:^{ 
        CGRect frame = self.kevinImageView.frame; 
        frame.origin.y -= 50; 
        self.kevinImageView.frame = frame; 
       } completion:^(BOOL finished){ 
        [UIView animateWithDuration:1.0 
             animations:^{ 
              CGRect frame = self.kevinImageView.frame; 
              frame.origin.y += 50; 
              self.kevinImageView.frame = frame; 
             }]; 
       }]; 

问题:如果我点击的观点(我用的是UITapGuestureRecognizer)和ImageView是在完成动画(去背下来),该Image View会弹回而不是完成其动画。再次不是一个重大问题,但我应该能够避免的事情。

有没有什么方法可以解决这两个问题,或者解决其中一种方法的方法?

+0

>>在你的方法2中,你错过了完成块。你添加了吗? – Rashad

+0

@Rashad在第二个动画? – carloabelli

+0

在你的第二个动画中,你错过了完成块(在方法2中)。 – Rashad

回答

1

你可以禁用你的UITapGuestureRecognizer当动画还在运行?然后在动画结束时启用

if (!self.isAnimationRunning) { 
     self.isAnimationRunning = YES; 
     [UIView animateWithDuration:1.0 
      animations:^{ 
       CGRect frame = self.kevinImageView.frame; 
       frame.origin.y -= 50; 
       self.kevinImageView.frame = frame; 
      } completion:^(BOOL finished){ 
       [UIView animateWithDuration:1.0 
            animations:^{ 
             CGRect frame = self.kevinImageView.frame; 
             frame.origin.y += 50; 
             self.kevinImageView.frame = frame; 
            } completion:^(BOOL finished){ 
         self.isAnimationRunning = NO; 
        }]; 
      }]; 
} 
+0

嗯...为什么这个答案有投票? –

+0

我修改了你的想法,稍微处理了选项2.我在任何动画之前禁用了“UITapGestureRecognizer”,并在第二个“完成”块中重新启用它。 – carloabelli

+1

我也不知道为什么这个答案是投下来的。如果那个人解释他们的推理,这将会有所帮助。 – carloabelli

0

我对这个问题很感兴趣,所以我做了一个简单的演示来做背靠背动画。

我想也许你可以使用UIViewAnimationOptionAutoreverseUIViewAnimationRepeat选项来实现自动反向动画。

[UIView animateWithDuration:1.0 
      delay:0 
      options:UIViewAnimationOptionAutoreverse|UIViewAnimationRepeat 
      animations:^{ 
       [UIView setAnimationRepeatCount:1]; 
       self.kevinImageView.center = CGPointMake(self.kevinImageView.center.x ,self.kevinImageView.center.y - 25); 
      } completion:^(BOOL finished){ 
       self.kevinImageView.center = CGPointMake(self.kevinImageView.center.x ,self.kevinImageView.center.y + 25); 
      }]; 

,你还可以设置UIViewAnimationOptionAllowUserInteraction,如果你想在动画过程中允许使用的互动。