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

时间:2017-09-05 07:50:34

标签: ios uigesturerecognizer uipangesturerecognizer uiswipegesturerecognizer

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

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

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

  3. 问题在于,根据定义,滑动手势是平移手势,而不是相反。因此,除非我的平移速度非常慢,否则即使我仍然在屏幕上拖动,滑动手势也会触发并且视图将全屏显示。

    简单地平移看起来不像我正在寻找的那种轻扫。滑动手势即时描述应该仅在用户暂时“轻弹”视图时触发。如果他们继续平移,那么平移手势应该优先。

    任何想法如何实现这一目标?作为参考,您可以检查点击Android或ios上谷歌地图上的图钉。

    如果没有显示它就有点难以描述,如果它有助于我非常公开地澄清事情。

    更新

    1. 我认为刷卡的区别在于它会覆盖平移,因为它a)花了很短的时间来完成b)手势结束时用户将手指抬离屏幕c)(可能是错误的) )遍历的区域不应该太大。听起来很像我的电影......

2 个答案:

答案 0 :(得分:0)

如果您无法用明确定义的术语描述两种手势之间的差异,那么很难告诉UIGestureRecognizer如何这样做。此外,如果您的手势太相似或太复杂,您的用户可能无法确定如何正确地与屏幕进行交互。

话虽如此,您可以区分"轻扫"和#34; pan"通过检查手势velocity。你应该可以使用UIGestureRecognizerDelegate方法来实现你想要的效果。

答案 1 :(得分:0)

好的,我已经实现了所需要的。简短的回答是我正在寻找一个“轻弹”手势而不是平移手势。通常它是一个nono来添加自定义手势,但是当我复制ios的谷歌地图底部组件时,看起来自定义手势是唯一的方法。

使用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

希望这有助于某人。