我有一个应用程序,底部有一个可拖动的UIView。可拖动的视图不完全在屏幕外,并且具有用户可以向上或向下拖动的“拉片”。上下拖动当前有效,但我想给它提供与Apple通知滑出抽屉相同的行为。
例如,如果我将视图向上拖出50%并从屏幕上移开我的手指,那么我希望可拖动的视图继续向上移动。同样,如果用户只拖出视图,比如说向上30%,那么视图应该回落到默认位置。
理想情况下,虽然我可以上下拖动,但动作并非“有机”....
现在,我正在通过UIPanGestureRecognizer完成向上和向下拖动,以防万一与问题相关。
它是否可能与可拖动视图的Y位置的某些聪明的数学有关,然后使用一些CAAnimations进行其余的移动?
可视化可能有点困难,所以我在下面添加了一些屏幕。
Default screen with the a view at the bottom
The view dragged up via the tab on the right
谢谢!
答案 0 :(得分:7)
当您的UIPanGestureRecognizer
状态变为UIGestureRecognizerStateEnded
时,请使用velocityInView:
消息查找手势的速度。
如果速度接近于零,则根据视图的位置和视图的先前状态打开或关闭视图。例如,如果视图已关闭且已拉出超过10%,请将其打开。如果它是打开的并且已被拉超过10%,请关闭它。否则,将其移回其手势前位置。
如果速度不接近零,请使用Y分量的符号来确定视图的新状态。如果符号为正,请关闭视图。如果符号为负,请打开视图。
你必须尝试弄清楚“接近于零”的定义是什么感觉最好。
在任何情况下,您都希望在手势结束后使用较短的持续时间(可能介于.1和.25秒之间)将视图设置为最终位置。您可能希望根据速度和视图需要移动的距离来选择持续时间。系统通知面板执行此操作。 (尝试慢慢地将其向下拖动到快速。它会以不同的速度动画到最终位置,具体取决于放开时拖动它的速度。)
您需要尝试找到最佳动画曲线(UIViewAnimationOptionCurveEaseOut
等),并且您可能希望使用不同的曲线,具体取决于您是否打开或关闭视图和速度手势。