iOS 13 undo/redo 个手势的手势识别器在哪里?

Where are the gesture recognizers for the iOS 13 undo/redo gestures?

iOS13 中的新功能,三个手势被解释为要求撤消和重做:

检测这些手势的手势识别器在哪里?我该怎么做才能覆盖它们、关闭它们,或者在它们和我自己的手势之间进行仲裁?

检测用户何时执行 undo/redo 手势:

是系统统一的,所以使用UndoManager(More details)或NSUndoManager完全免费。所以如果你像使用摇动一样实现它,它也适用于手势。

更改手势的行为(以防止与应用程序的其他手势冲突)

您可以使用此变量更改它的配置:

public protocol UIResponder {
    var editingInteractionConfiguration: UIEditingInteractionConfiguration
}

它是一个枚举:

public enum UIEditingInteractionConfiguration {
    case `default` // System behavior 
    case none // Disable
}

所以它会是 禁用 比如:

override var editingInteractionConfiguration: UIEditingInteractionConfiguration { .none }

来源:

WWDC 2019 - Modernizing Your UI for iOS 13 - 37:00

注意iOS13还有很多手势,比如捏3个手指会复制选定的文本并捏住它们 out 将粘贴它。所有这些都连接到旧式操作(例如经典的 shake 操作)以及此协议,您可以在任何 responder.

中覆盖它

Apple 调用了所有这些 Editing Gestures 你可以看到 the session here

注:

该会话中的某些信息并非完全真实,(例如 UIResponder 不是 protocol,实际上是 class)正如评论中提到的@matt .但是我已经添加了这个答案的来源,你可以自己判断。

看起来有一个名为 UIUndoGestureRecognizer 的私人 class 附加到 UIEditingOverlayGestureView,后者位于 UITextEffectsWindow 内的 UIInputSetContainerView 中。 (为了解决这个问题,我在 UndoManagerregisterUndo 处理程序中放置了一个断点,并尝试用三个手指向左滑动,然后在生成的堆栈跟踪和汇编代码中四处寻找,直到找到手势识别器实例。)

您可能会使用 UIGestureRecognizerDelegate 中的方法在您的手势识别器和这些系统识别器之间进行仲裁,并且您可以在视图控制器或视图中覆盖 editingInteractionConfiguration 或查看 return .none 为了完全关闭它们。