2010-10-29 57 views
1

我有一個UIView,可以用我用UIPanGestureRecognizer實現的手指拖動。這允許我水平拖動視圖;左還是右。如何使拖動的UIView減速?

使我的看法,而從UIPanGestureRecognizer收到以下狀態(使用translationInView:法):移動

  • UIGestureRecognizerStateBegan
  • UIGestureRecognizerStateChanged

現在會發生什麼,是視圖一旦手指離開屏幕表面就停止移動,這會產生非自然的效果。

我想要的是,通過平穩停止,拖動視圖將從狀態UIGestureRecognizerStateEnded開始減速。

UIScrollView類和子類(UIWebView,UITableView等)使用這種行爲。

我已經嘗試了幾種方法,通過計算速度,觸摸發生的時間和停止距離等,但老實說,我有一種無處可去獲得自然行爲的感覺。我甚至試圖使用像Chipmunk這樣的物理引擎。但是我發現這對我試圖實現的東西來說很複雜,我很確定應該有更好的(如果不是更簡單的話)解決方案。

非常感謝!

傑里米

+0

您是否使用過UIScrollView decelarationRate? – westsider 2010-10-29 16:25:30

+0

我沒有使用UIScrollView,也沒有使用子類。我只是想實現一個減速機制。 – jchatard 2010-10-29 16:30:17

+0

你是如何解決這個問題的? – nico 2011-03-31 02:44:57

回答

1

在你的手勢識別,讓這個當你的手指離開屏幕時,你開始一個動畫繼續滾動了一下,對於一個持續時間短,具有「緩出」轉變。

也許是這樣的:

[UIView beginAnimations:@"FingerOff" context:nil]; 
[UIView setAnimationDuration:0.25f]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationCurve:UIAnimationViewEaseOut]; 
[myView setFrame:newFrame]; 
[UIView commitAnimation]; 

可以替代SETFRAME別的東西 - 無論建立你想怎麼滾動或視圖 - 甚至一個setCenter。使其比當前位置更「滾動」一點。

+0

我會看看你的代碼並回復你。 – jchatard 2010-11-02 17:28:08

+0

我剛剛嘗試過,我認爲我仍然需要根據手勢的速度來估計停止距離。因爲這種舉動在其他方面並不自然。 – jchatard 2010-11-04 10:43:25

+0

是的 - 您需要調整動畫時間和「newFrame」才能使其正確。 – Brad 2010-11-04 13:44:08