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