【问题标题】:Using Pan and Swipe gesture recognisers simultaneously同时使用平移和滑动手势识别器
【发布时间】:2023-04-01 03:00:01
【问题描述】:

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

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

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

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

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

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

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

更新

  1. 我认为,正如我所描述的那样,滑动会覆盖平移的区别在于它 a) 需要很短的时间才能完成 b) 手势以用户将手指从屏幕上抬起 c) 结束 c) (可能是错误的) 遍历的区域不应该太大。对我来说听起来很像电影..

【问题讨论】:

  • 你试过shouldRecognizeSimultaneouslyfunc gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true }
  • 你也可以使用 shouldRequireFailureOf 方法。 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true }

标签: ios uigesturerecognizer uipangesturerecognizer uiswipegesturerecognizer


【解决方案1】:

如果您无法用明确定义的术语来描述这两种手势之间的区别,那么您将很难告诉UIGestureRecognizer 如何这样做。此外,如果您的手势过于相似或过于复杂,您的用户可能难以弄清楚如何与屏幕正确交互。

话虽如此,您可以通过检查手势的velocity 来区分“滑动”和“平移”。你应该可以玩转UIGestureRecognizerDelegate 方法并达到你想要的效果。

【讨论】:

  • 我猜我在寻找系统似乎不支持的“轻弹”手势。然而,我知道自定义手势通常是一个 nono,因为我试图复制谷歌地图中提供的功能(当点击 pin 时)以带来一些熟悉的应用程序地图部分的东西,除了自定义之外我没有看到太多其他方式。换句话说,也许滑动手势并不能解决我正在查看的问题。
  • 这篇文章可能对您有所帮助stackoverflow.com/questions/9898627/…。最终,假设每个手势都有明显的区别特征,这些手势可以做任何你想做的事情。但是,您将不得不使用委托方法来实现效果,并且可能需要进行大量调整。
  • 从您的更新来看,您似乎很清楚自己想要什么,这是很好的第一步。
【解决方案2】:

好的,我已经实现了所需要的。简短的回答是我正在寻找“轻弹”手势而不是平移手势。通常,添加自定义手势是一种不可行的做法,但由于我正在为 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

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多