4

我有一個可拖動的UIView放在底部的應用程序。可拖動的視圖並不完全在屏幕外,它有一個「拉片」,用戶可以向上或向下拖動。目前可以上下拖動,但我想給它的行爲與Apple通知滑出抽屜相同。拖動一個UIView部分路徑,然後它自己移動

例如,如果我將視圖向上拖動50%並將其從屏幕上移開,那麼我希望可拖動的視圖繼續向上移動。同樣,如果用戶只拖出視圖,比如向上30%,那麼視圖應該回落到其默認位置。

理想的情況下,而我能做的拖動上/下,運動心不是很「有機」 ......

現在,我完成通過UIPanGestureRecognizer的向上和向下拖動,以防萬一這與問題有關。

這可能是沿着可拖動視圖的Y位置的一些聰明的數學的線,然後用一些CAAnimations做其餘的移動?

這可能有點難以形象化,所以我在下面添加了一些屏幕。

Default screen with the a view at the bottom

The view dragged up via the tab on the right

謝謝!

回答

7

當您的UIPanGestureRecognizer的狀態變爲UIGestureRecognizerStateEnded時,請使用velocityInView:消息來查找手勢的速度。

如果速度接近零,則根據視圖的位置和視圖的前一狀態來打開或關閉視圖。例如,如果視圖已關閉且已被拉出超過10%,請將其打開。如果它是開放的並已被拉超過10%,請關閉它。否則,將其移回到其預先手勢位置。

如果速度未接近零,則使用Y分量的符號來確定視圖的新狀態。如果符號爲正,請關閉視圖。如果符號爲負值,請打開視圖。

你將不得不嘗試弄清楚「接近零」的定義是什麼感覺最好。

在任何情況下,您都會希望在姿勢結束後使用短時間(可能介於.1和.25秒之間)將視圖設置爲其最終位置的動畫效果。您可能想要根據速度和視圖需要傳播的距離來選擇持續時間。系統通知面板執行此操作。 (嘗試將它緩慢地向下拖動,以快速拖動它,以不同的速度動畫到其最終位置,具體取決於放開時拖動它的速度。)

您需要嘗試查找最佳動畫曲線( UIViewAnimationOptionCurveEaseOut等),並且您可能想要使用不同的曲線,具體取決於您是打開還是關閉視圖以及手勢的速度。

+0

謝謝你的回答。澄清一下,當你說移動視圖時,你的意思是應用CAAnimation或類似的東西? – kurisukun 2012-02-16 09:11:18

+0

使用'[UIView animateWithDuration:...]'方法之一就足夠了。您可能不需要下拉到核心動畫級別。 – 2012-02-16 09:16:53

+0

非常好的答案,謝謝Rob – 2012-11-09 08:13:31