2014-01-16 32 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,如果你想在動畫過程中允許使用的互動。