2012-07-26 73 views
1

我有一個用戶在某處拖動UIView的場景;我想將它返回到它開始的位置,並且我希望它沿着相同的軌道返回,並且速度與用戶拖動的速度相同。我想出了一個遞歸解決方案,看起來像這樣:UIView動畫以「倒帶」平移手勢:遞歸?

@property (...) NSMutableArray *dragTrack; // recorded during pan gesture 

- (void)goHome 
{ 
     [self backtrack: [self.dragTrack count] 
         withDelay: 1.0/[self.dragTrack count]]; 
       // interim version of delay; will implement accurate timing later 
} 

- (void)backtrack: (int)idx withDelay: (double)delay 
{ 
    if (idx > 0){ 
     [UIView animateWithDuration:0 delay:delay options: 0 
     animations: ^{ 
      self.center = [[self.dragTrack objectAtIndex:idx - 1] CGPointValue]; 
     } 
     completion:^(BOOL finished){ 
      [self backtrack: idx - 1 withDelay: delay]; 
     }]; 
    } else { 
     // do cleanup stuff 
    } 
} 

這工作,和遞歸深度似乎並不成爲一個問題 - 我拖軌道通常只有幾百幾個百分點長。 (我假設遞歸調用回調獲得tail調用優化的機會相當渺茫?)。但我仍然想知道:這是一個合理的/正常的/安全的解決方案,我試圖達到什麼目的?還是有更簡單的方法將時間戳和狀態集合傳遞給動畫並說「播放這些」?

回答

0

你是那裏不會導致遞歸。由於完成塊是異步調用的,因此它不會深入功能堆棧。您可以通過在那裏設置斷點並檢查堆棧跟蹤來查看它。
您可以想象NSTimer那裏觸發理論上無限次並且不引起遞歸。

對於第二個問題,您可以製作這樣的動畫。它被稱爲CAKeyframeAnimation,它是QuartzCore框架的一部分。它會要求你使用圖層而不是視圖,但它不是困難。

只需要注意一下你的代碼:嘗試使用選項UIViewAnimationOptionCurveLinear使動畫更加流暢。