ios - 禁用手势以下拉表单/页面模式呈现

标签 ios uigesturerecognizer ios13

在 iOS 13 中,使用表单和页面样式的模态演示可以通过向下平移手势关闭。这在我的一张表单中是有问题的,因为用户绘制到这个干扰手势的框中。它会将屏幕向下拉,而不是画一条垂直线。

如何在呈现为工作表的模态视图 Controller 中禁用垂直滑动以消除手势?

设置 isModalInPresentation = true 仍然允许下拉表单,只是不会关闭。

最佳答案

一般来说,您不应尝试禁用滑动关闭功能,因为用户希望所有表单/页面工作表在所有应用程序中的行为都相同。相反,您可能需要考虑使用全屏演示样式。如果您确实想使用无法通过滑动关闭的工作表,请设置 isModalInPresentation = true,但请注意,这仍然允许工作表被垂直下拉,并且在释放时会弹回触摸。查看UIAdaptivePresentationControllerDelegate当用户试图通过滑动等操作将其关闭时使用react的文档。

如果您的应用程序的手势或触摸处理受到滑动关闭功能的影响,我确实从 Apple 工程师那里收到了一些关于如何解决该问题的建议。

如果您可以阻止系统的平移手势识别器开始,这将防止手势解除。有几种方法可以做到这一点:

  1. 如果您的 Canvas 绘图是使用手势识别器完成的,例如您自己的 UIGestureRecognizer 子类,请在工作表的关闭手势执行之前进入 began 阶段。如果您识别的速度与 UIPanGestureRecognizer 一样快,您将获胜,并且工作表的关闭手势将被颠覆。

  2. 如果您的 Canvas 绘图是使用手势识别器完成的,请使用 -shouldBeRequiredToFailByGestureRecognizer:(或相关的委托(delegate)方法)设置动态失败要求,您返回 NO 如果传入的手势识别器是 UIPanGestureRecognizer

  3. 如果您的 Canvas 绘图是通过手动触摸处理(例如 touchesBegan:)完成的,请覆盖触摸处理 View 上的 -gestureRecognizerShouldBegin,并返回 NO 如果传入的手势识别器是 UIPanGestureRecognizer

事实证明,我的设置 #3 运行良好。这允许用户在绘图 Canvas 之外的任何地方向下滑动以关闭(如导航栏),同时允许用户在不移动工作表的情况下进行绘图,正如人们所期望的那样。

我不建议尝试找到禁用它的手势,因为它似乎是动态的,并且可以在例如在不同尺寸类别之间切换时重新启用,这可能会在未来的版本中改变。

关于ios - 禁用手势以下拉表单/页面模式呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56718552/

相关文章:

objective-c - 使用 Storyboard 时触发双击时避免单击 UIGestureRecognizer

ios - 在 iOS 13 中恢复场景的 UI 状态,同时仍然支持 iOS 12。没有 Storyboard

swift - BackgroundTask iOS 13 Swift 与场景

objective-c - iPad UIBarButtonItem 不服从色调

iphone - 归档 iphone 时应用程序大小加倍

ios - 从未调用过的 UICollectionViewDelegateFlowLayout 方法

ios 重装应用后恢复数据

ios - 将 UICollectionview 中单元格的移动限制在 CollectionView 的范围内

swift - addTarget 和 addGestureRecognizer 之间的不同行为

ios - 在没有导航栏的情况下更改状态栏背景颜色(iOS 13)