4

我有一个应用程序,其底部放置了一个可拖动的 UIView。可拖动视图不是完全在屏幕外,它有一个“拉标签”,用户可以向上或向下拖动。目前可以上下拖动,但我想给它与 Apple 通知滑出抽屉相同的行为。

例如,如果我将视图向上拖动 50% 并将手指从屏幕上移开,那么我希望可拖动视图继续自行向上移动。同样,如果用户只将视图拖出,比如向上拖动 30%,那么视图应该回落到其默认位置。

理想情况下,虽然我可以向上/向下拖动,但动作不是很“有机”....

现在,我正在通过 UIPanGestureRecognizer 完成向上和向下拖动,以防万一这与问题相关。

是否可能是一些巧妙的数学运算,使用可拖动视图的 Y 位置,然后使用一些 CAAnimations 进行其余的移动?

这可能有点难以想象,所以我在下面添加了一些屏幕。

底部带有视图的默认屏幕

通过右侧的选项卡向上拖动的视图

谢谢!

4

1 回答 1

7

当您UIPanGestureRecognizer的状态变为 时UIGestureRecognizerStateEnded,使用velocityInView:消息来查找手势的速度。

如果速度接近于零,则根据视图的位置和视图的先前状态打开或关闭视图。例如,如果视图已关闭并且已拉出超过 10%,则将其打开。如果它是打开的并且已经拉入超过 10%,请关闭它。否则,将其移回其手势前位置。

如果速度不接近于零,则使用 Y 分量的符号来确定视图的新状态。如果符号为正,则关闭视图。如果符号为负,则打开视图。

您将不得不进行试验,以确定“接近零”的确切定义是什么感觉最好。

在任何情况下,您都希望在手势结束后使用较短的持续时间(可能在 0.1 到 0.25 秒之间)将视图动画化到其最终位置。您可能需要根据速度和视图需要行进的距离来选择持续时间。系统通知面板会执行此操作。(尝试将其缓慢或快速地拖动到中途。它会以不同的速度动画到最终位置,具体取决于您松开时拖动它的速度。)

您将想要尝试找到最佳动画曲线(UIViewAnimationOptionCurveEaseOut等),并且您可能想要使用不同的曲线,具体取决于您是打开还是关闭视图以及手势的速度。

于 2012-02-16T09:09:11.427 回答