繁体   English   中英

同时使用平移和滑动手势识别器

[英]Using Pan and Swipe gesture recognisers simultaneously

我在ViewController的底部有一个视图(类似于Google Maps Bottom Sheet)。 目标是:

  1. 平移时,视图朝平移方向移动(基本上跟随手指),平移结束时,视图变为全屏显示。 到目前为止一切顺利。

  2. 添加滑动手势。 向上滑动时,视图应全屏显示。

问题是,按照定义,滑动手势是平移手势,而不是相反。 因此,除非我平移的速度非常慢,否则即使我仍在屏幕上拖动,滑动手势也会触发并且视图将变为全屏。

只是平移看起来并不像我正在寻找的那种滑动。 im描述的滑动手势仅应在用户暂时“轻拂”视图时触发。 如果他们继续平移,则平移手势应优先。

任何想法如何实现这一目标? 作为参考,您可以在android或ios上检查一下Google地图上的图钉。

如果不显示它很难描述,所以它是否有助于我非常开放地澄清事情。

更新

  1. 我认为,按我所描述的那样会覆盖平移的滑动的区别是:a)花费了很短的时间才能完成b)手势以用户将手指从屏幕上移开而结束c)(可能错了)遍历不应太大。 对我来说听起来很像轻弹。

如果您无法用明确定义的术语来描述两个手势之间的差异,那么将很难告诉UIGestureRecognizer如何做到。 另外,如果您的手势过于相似或过于复杂,您的用户可能会难以确定如何与屏幕进行正确交互。

话虽如此,您可以通过检查手势的速度来区分“滑动”和“摇动”。 您应该可以使用UIGestureRecognizerDelegate方法并达到所需的效果。

好的,我已经实现了所需要的。 简短的答案是我正在寻找“轻拂”手势而不是平移手势。 通常,它是添加自定义手势的一种方法,但是当我为ios复制google maps底部表单组件时,自定义手势似乎是唯一的方法。

使用Navillus的注释,我在平移识别器中添加了速度和手势结束检查。 结果看起来像这样:

if(recognizer.state == .ended){
        if(recognizer.velocity(in: self).y > CGFloat(500) ){
            self.pullUpViewSetMode_SUMMARY()
            return;
        }

        if(recognizer.velocity(in: self).y < CGFloat(-500) ){
            self.pullUpViewSetMode_FULL()
            return;
        }
}
//the rest of the pan handling code, namely translating the view up and up follows here

希望这对某人有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM