我正在寻找一种将部分隐藏的工具面板从屏幕上滑出的方法,就像 JetBlue iPhone 应用程序一样。我知道如何使用常规的滑动手势识别器来做到这一点,但是该应用程序有一定的阈值,之后面板“捕捉”到屏幕上的位置,否则它会隐藏在屏幕外。
如何实现这种滑动显示,但使用阈值类型的手势识别器?是否有任何开源项目可以进行这种 UI 操作?
我正在寻找一种将部分隐藏的工具面板从屏幕上滑出的方法,就像 JetBlue iPhone 应用程序一样。我知道如何使用常规的滑动手势识别器来做到这一点,但是该应用程序有一定的阈值,之后面板“捕捉”到屏幕上的位置,否则它会隐藏在屏幕外。
如何实现这种滑动显示,但使用阈值类型的手势识别器?是否有任何开源项目可以进行这种 UI 操作?
我编写的应用程序中有一个类似的界面元素。我的界面元素是整个工具面板的 UIViewController。我在抓手插图上放置了一个 UIButton,将按钮的类型更改为自定义,使其在视觉上消失。我将 Touch Drag Inside 和 Touch Drag Outside 连接到一个 IBAction,它根据拖动的移动位置调整面板的位置。我将 Touch Up Inside 和 Touch Up Outside 连接到一个 IBAction,该 IBAction 最终确定了视图的定位。如果修饰事件发生在离底部太近的地方,我只需关闭面板。如果它发生在高于该阈值的任何地方,我会打开面板。我使用 UIView 的动画方法来平滑这些过渡。在 JetBlue 应用程序中看到的过度扩展元素可以在拖动事件处理程序中完成。随着面板越来越接近极限,随着触摸的每一次移动,打开的视图越来越小。然后在最终确定中,只需将面板动画返回到它的首选结束位置。
JetBlue 应用程序与我的应用程序不同之处在于我有一个小的抓手区域,但 JetBlue 的应用程序允许您滑动整个面板来调整位置。为了匹配该功能,我会调整我的实现以用按钮完全覆盖面板。每个都会响应我的拖动事件,并且拖动会设置一个标志。然后我的修饰事件处理程序将检查是否设置了标志。如果是这样,请完成面板的拖动。否则,请执行与每个按钮相关的适当操作。
如果您已经可以使用手势实现基础知识,那么您就快到了!
老实说,虽然我在我的应用程序中完全做到了这一点,但我使用了老式的 touchesBegan、touchesMoved 等。
在手势方面,您必须使用UIPanGestureRecognizer
才能完全控制拖动。UISwipeGestureRecognizer
只识别滑动。
无论如何,在某一点之后,您只需将面板平移到人拖动距离的一小部分。
CGRect newPanelFrame = panel.frame;
if (newPanelFrame.origin.y + dragOffset > 275) {
newPanelFrame.origin.y += dragOffset / 2.0;
}
panel.frame = newPanelFrame;
在touchesEnded:withEvent:
或if (gestureRecognizer.state == UIGestureRecognizerStateEnded)
CGRect newPanelFrame = panel.frame;
if (newPanelFrame.origin.y > 275) {
newPanelFrame.origin.y = 275;
}
panel.frame = newPanelFrame;
我从来没有打扰过的原因UIPanGestureRecognizer
是因为我永远无法弄清楚如何获得非累积翻译(translationForView: 是累积的),如果你想在阈值之后从本质上减慢拖动速度,这是必要的。
我只是在做一些研究以达到类似的效果,偶然发现了这篇文章,因此决定尝试 JetBlue。
在玩了一段时间的滑动面板之后,我实际上认为 JetBlue 的家伙实际上是以稍微不同的方式解决这个问题的。
JetBlue 应用程序中滑块的动作似乎比使用 UIGestureRecognizers 集合处理的要好得多;它能够根据用户滑动它的速度以不同的速度制作动画,并且橡皮筋也可以适当地补偿这一点。
因此,在这一点上,我实际上认为他们没有使用 UIGestureRecognizers,但该面板实际上只是一个与应用程序窗口底部对齐的标准 UIScrollView,并且有一些额外的逻辑(可能通过委托应用)只是确保滚动视图不可能在“打开”和“关闭”状态之间停止动画。