实现背靠背UIAnimations的最流畅的方式

时间:2014-01-16 04:10:01

标签: ios objective-c uianimation

我需要让我的角色跳跃(在我正在制作的游戏中将origin.y增加50并反转)。

到目前为止,我遇到过两种方法:

方法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会跳起然后向下跳(可能是因为{{{{} 1}}块被调用)。这是显而易见的,我宁愿没有它。

方法2:

completion

问题:如果我点按视图(我使用[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位于完成动画中(向下返回),{{1}将快照回到底部而不是完成动画。这不是一个重大问题,而是我应该能够避免的事情。

我是否有任何方法可以解决这两个问题,或者解决其中一种方法?

2 个答案:

答案 0 :(得分: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;   
                   }];
             }];
}

答案 1 :(得分: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