2015-04-15 197 views
0

我試圖在我的應用中顯示一輛車在道路上的運動。爲此,我將車輛保持靜止不動,並不斷從上至下移動道路以形成效果。車道作爲子視圖添加到roadView,我試圖在roadView中動畫所有子視圖,如下面的代碼所示。連續動畫一組UIView子視圖

我面臨的問題是最接近底部的通道以比較快的速度移動,儘管我正在計算基於恆定速度的持續時間。

-(void)animateLanes { 

for (UIView *laneView in [self.roadView subviews]) { 

    if (laneView.tag < 10) { 
     float distance = self.view.frame.size.height - CGRectGetMaxY(laneView.frame); 
     float duration = distance/10; 

     [UIView animateWithDuration:duration animations:^{ 

      laneView.frame = CGRectMake(laneView.frame.origin.x, self.view.frame.size.height+laneView.frame.size.height, laneView.frame.size.width, laneView.frame.size.height); 


     } completion:^(BOOL finished) { 

      laneView.frame = CGRectMake(self.roadView.frame.size.width/2 - 10, -laneView.frame.size.height, 20, 40); 
      [self nextStep:laneView]; 
     }]; 
    } 
} 
} 

-(void) nextStep:(UIView *) laneView{ 

float distance = self.view.frame.size.height - CGRectGetMaxY(laneView.frame); 
float duration = distance/10; 

[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionRepeat animations:^{ 

    laneView.frame = CGRectMake(laneView.frame.origin.x, self.view.frame.size.height+laneView.frame.size.height, laneView.frame.size.width, laneView.frame.size.height); 
} completion:^(BOOL finished) { 
    laneView.frame = CGRectMake(self.roadView.frame.size.width/2 - 10, -laneView.frame.size.height, 20, 40); 

}]; 
} 
+1

這聽起來不太適合視圖動畫。考慮學習遊戲編程技術。 – matt

回答

1

我絕對會考慮SpriteKit這種事情。 SKScene中的更新循環將允許您確保一切正常運行。

但是,如果你這樣做,你不必做所有這些UIView動畫調用。這樣做:

//calculate duration and distance first, then: 
[UIView animateWithDuration:duration animations:^{  

    for (UIView *laneView in [self.roadView subviews]) { 
     laneView.frame = CGRectMake(laneView.frame.origin.x, self.view.frame.size.height+laneView.frame.size.height, laneView.frame.size.width, laneView.frame.size.height); 
    } 


} completion:^(BOOL finished) { 
    for (UIView *laneView in [self.roadView subviews]) { 
     laneView.frame = CGRectMake(self.roadView.frame.size.width/2 - 10, -laneView.frame.size.height, 20, 40); 
     [self nextStep:laneView]; 
    } 
}]; 

雖然我不建議做任何這一點。使用一個遊戲庫,即SpriteKit,因爲它易於集成和簡單。

+0

關於上面分享的片段,儘管我還沒有嘗試過,但我覺得我無法首先計算for循環之外的持續時間,因爲它對於每個車道視圖都會有所不同。不過,我會考慮研究sprite套件來達到這個目的。 – user2990765

0

SpriteKit使這種類型的任務IMO更有意義。邏輯將是類似的,對象將屬於SKScene實例,它有一個方便的更新方法完美的你所瞄準的循環效果。