使用平移手势识别器关闭视图控制器

Posted

技术标签:

【中文标题】使用平移手势识别器关闭视图控制器【英文标题】:Using Pan gesture recognizer to bring down a view controller 【发布时间】:2017-02-10 01:28:25 【问题描述】:

我希望能够在我的主视图控制器上向下滑动,并将我的第二个视图控制器从上方拉下来。我希望这种转换是交互式的,因为您可以在 VC 之间来回切换,而不必完成整个转换(像带有分页的滚动视图一样跟随用户的手指)。

当在新的 snapchat 更新时在视图控制器之间滑动时可以看到这种效果。当您第一次打开应用程序时,您会在相机屏幕上。如果您向任何方向(上、下、左或右)滑动,相应的视图就会出现并覆盖相机屏幕。当您在视图之间滑动时,它们基本上都覆盖了主视图(不像我在网上找到的许多使用滚动视图来实现此效果的教程那样将其移到一边)。

本质上它看起来像一个垂直页面视图控制器,但不是在新视图控制器进入时将当前视图控制器移出屏幕,新视图控制器将覆盖当前视图控制器,直到它完全位于它之上。

据我了解,平移手势识别器可以解决问题。 有谁知道我该怎么做。我一直在寻找,似乎无法弄清楚。

【问题讨论】:

【参考方案1】:

我希望能够在我的主视图控制器上向下滑动,并将我的第二个视图控制器从上方拉下来。我希望这个过渡是交互式的

好的,你正在描述一个自定义的交互式过渡动画。如何实现这一点的确切细节取决于您希望这是一个推送转换还是一个当前(模态)转换。我认为这是一个演示(模态)过渡。

因此,您将从设置呈现的视图控制器的transitioningDelegate 开始。一切都从那里起飞。平移手势识别器将调用present, 并且将调用转换委托的委托方法:

animationController(forPresented:presenting:source:) interactionControllerForPresentation(using:)

您从第二种方法返回的交互控制器负责通过更新动画的“帧”(以及过渡协调器)来响应平移手势的每个变化。

如果这仅适用于 ios 10,这非常容易,因为您可以使用 UIViewPropertyAnimator。当手势结束并且您决定完成或取消动画时,它具有“快”到动画结束或开始的非凡能力。否则,您最好使用 UIPercentDrivenInteractiveTransition 对象来帮助您。

【讨论】:

这正是我所需要的,我了解它是如何工作的,但我无法弄清楚如何实现它。如果您不介意,请进一步解释一下。 它相当复杂。大多数现在我已经说了基础知识,你需要开始研究这个。如果您清楚这是呈现视图控制器还是推送视图控制器,这将有所帮助。查找示例或教程也很有用。 我没有交互式呈现视图控制器的示例,但我有一个用于不同类型转换的示例,所以下载并尝试一下:github.com/mattneub/Programming-iOS-Book-Examples/blob/master/… 那是一个标签栏控制器从侧面拖动以进入下一个视图。代码显示了手势和动画师之间的相互作用。 谢谢!!我去看看

以上是关于使用平移手势识别器关闭视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

平移手势识别器的三层混淆

使平移手势识别器仅在向下滑动时在桌面视图的顶部进行响应

将平移手势识别器限制为特定圆圈

解决两个平移手势识别器之间的冲突

带有平移手势冲突的滚动视图和侧边菜单

一起识别长按和平移手势识别器