Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何像JetBlue iPhone应用程序一样从屏幕外轻轻拖动面板_Iphone_Objective C_Ios_Uiview_Uiswipegesturerecognizer - Fatal编程技术网

如何像JetBlue iPhone应用程序一样从屏幕外轻轻拖动面板

如何像JetBlue iPhone应用程序一样从屏幕外轻轻拖动面板,iphone,objective-c,ios,uiview,uiswipegesturerecognizer,Iphone,Objective C,Ios,Uiview,Uiswipegesturerecognizer,我正在寻找一种方法,可以像JetBlue iPhone应用程序那样,将部分隐藏的工具面板滑离屏幕。我知道如何使用常规的滑动手势识别器来实现这一点,但该应用程序有一个特定的阈值,在该阈值之后面板会“捕捉”到屏幕上的位置,否则它会隐藏回屏幕外 我如何实现这种滑动来显示,但要使用阈值式手势识别器?有没有做过这种UI操作的开源项目?我写的一个应用程序中有一个类似的界面元素。My interface元素是整个工具面板的UIViewController。我把一个UIButton放在夹持器插图上,将按钮的类型

我正在寻找一种方法,可以像JetBlue iPhone应用程序那样,将部分隐藏的工具面板滑离屏幕。我知道如何使用常规的滑动手势识别器来实现这一点,但该应用程序有一个特定的阈值,在该阈值之后面板会“捕捉”到屏幕上的位置,否则它会隐藏回屏幕外


我如何实现这种滑动来显示,但要使用阈值式手势识别器?有没有做过这种UI操作的开源项目?

我写的一个应用程序中有一个类似的界面元素。My interface元素是整个工具面板的UIViewController。我把一个UIButton放在夹持器插图上,将按钮的类型更改为custom,这样它就可以在视觉上消失。我将“内部触摸拖动”和“外部触摸拖动”连接到iAction,iAction根据拖动移动的位置调整面板的位置。我将“内部补漆”和“外部补漆”连接到一个iAction,该iAction最终确定视图的位置。如果补漆事件发生得太靠近底部,我只需关闭面板。如果它发生在高于阈值的任何地方,我打开面板。我使用UIView的动画方法来平滑这些过渡。JetBlue应用程序中的over extension元素可以在drag事件处理程序中完成。随着面板越来越接近极限,随着触摸的每一次移动,打开视图的量越来越小。然后在最后定稿时,只需将面板动画设置回其首选的结束位置即可


JetBlue应用程序不同于我的应用程序,因为我有一个小的抓取区域,但JetBlue的应用程序允许您滑动整个面板以调整位置。为了匹配该功能,我将调整我的实现,使其完全覆盖面板上的按钮。每一个都会响应我的拖动事件,并添加一个标记,即拖动将设置一个标记。然后,我的修补事件处理程序将检查是否设置了该标志。如果是,请完成面板的拖动。否则,请执行与每个按钮相关的适当操作。

如果您已经可以通过手势实现基本功能,那么您就快成功了

老实说,虽然我在应用程序中已经做到了这一点,但我使用了老式的touchsbegind、touchsmove等

在手势方面,您必须使用
uipangestureerecognizer
,以便完全控制拖动<代码>UISweepGestureRecognitor仅识别刷卡

无论如何,在某一点之后,您只需平移面板,仅平移人员拖动距离的一小部分

CGRect newPanelFrame = panel.frame;
if (newPanelFrame.origin.y + dragOffset > 275) {
   newPanelFrame.origin.y += dragOffset / 2.0;
}
panel.frame = newPanelFrame;
touchesend:with事件:
if(gestureRecognizer.state==UIGestureRecognizerStateEnded)


我从未使用过
UIPanGestureRecognizer
的原因是,我从来都不知道如何获得非累积翻译(translationForView:is cumulative),这是必要的,如果你想在临界点后降低阻力。

我只是在做一些研究,以达到类似的效果,无意中发现了这篇文章,因此决定尝试一下捷蓝航空

在玩了一段时间滑动面板之后,我真的认为捷蓝航空的人实际上是以一种稍微不同的方式来做这件事的

JetBlue应用程序中滑块的运动似乎比你用一系列UIGestureRecognitors可以做的更好;它能够以不同的速度制作动画,这取决于用户滑动它的速度,橡皮筋也能适当地补偿这一点


因此,我实际上认为他们没有使用UIGestureRecognizers,但该面板实际上只是一个与应用程序窗口底部对齐的标准UIScrollView,并带有一些额外的逻辑(可能通过代理应用)这只是确保滚动视图不可能在“打开”和“关闭”状态之间停止动画设置。

如何从iAction方法中获取触摸事件的坐标?@samsam:iAction方法可以有三个签名中的一个,没有参数,一个参数(发送方)和两个参数(发送方和触摸事件)。只需使用包含触摸位置数据的触摸事件版本。
CGRect newPanelFrame = panel.frame;
if (newPanelFrame.origin.y > 275) {
   newPanelFrame.origin.y = 275;
}
panel.frame = newPanelFrame;