如何在iOS 13 objective-c中处理鼠标事件



iOS 13终于引入了对鼠标的支持。我一直在寻找有关如何处理鼠标事件的文档,但徒劳无功。在macOS 10+中,有NSEvent类 https://developer.apple.com/documentation/appkit/nsevent 作为AppKit的一部分。iOS 13 中对应的类是什么?有人可以指出我一些文档/示例吗?我已经尝试了 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html 的代码,但它在iOS 13中不起作用。我正在使用Xcode 11。我对获取鼠标事件信息特别感兴趣(例如,按下鼠标按钮,鼠标位置,按钮编号(。

- (void)mouseDown:(NSEvent *)theEvent {
[self setFrameColor:[NSColor redColor]];
[self setNeedsDisplay:YES];
}
- (void)mouseUp:(NSEvent *)theEvent {
[self setFrameColor:[NSColor greenColor]];
[self setNeedsDisplay:YES];
}

此功能似乎没有公共 API。

对于您想要的一些内容,从iPadOS 13.4开始!

iOS 13 上的所有"鼠标"事件都注册为常规触摸事件,只需 就像AssistiveTouch产生的事件一样。您无法检查 这些事件的来源。

这是正确的。让我们深入了解...

背景和链接

在 iPad 上,从 iPadOS 13.4 开始,支持触控板和鼠标,但未启用任何辅助功能。请注意,iPhone没有获得此本机支持。我在下面讨论的 API 仍然适用,但仅适用于启用了辅助触摸的指点设备支持的 iPhone。

我们在这里介绍事件和手势 API: https://developer.apple.com/videos/play/wwdc2020/10094/

如果您在开发者应用中查看该视频,则会包含该视频中的代码片段。

我在下面描述的一些兼容模式提示在这里详细介绍: https://developer.apple.com/documentation/bundleresources/information_property_list/uiapplicationsupportsindirectinputevents

(编辑(GameController.framework确实显示了我在下面提到的所有连接的鼠标,您可以为每个鼠标设置更改处理程序。 但是,无法从这些设备中看到 ID:

https://developer.apple.com/documentation/gamecontroller/gcmouse/3626182-mice https://developer.apple.com/videos/play/wwdc2020/10617/

指针移动和点击

指针移动由UIEvent.EventType.hover驱动。你用UIHoverGestureRecognizer来处理它.

对定点设备的单击将转换为UITouch实例。 作为兼容性,默认情况下,这些都是UITouch.TouchType.direct的。这与基于手指的触摸相同。

如果在应用程序的 info.plist 键中选择 UIApplicationSupportsIndirectInputEvents,则对点设备的单击将转换为UITouch.TouchType.indirectPointer。这将允许您将这些触摸与基于手指的触摸区分开来,并且您可以使用 API 专门针对这些触摸,例如UIGestureRecognizer.allowedTouchTypes

按钮面膜

使用 UIApplicationSupportsIndirectInputEvents,您将能够识别出来自指针设备的触摸。 要识别特定按钮,您需要查看UIEvent.buttonMaskUIGestureRecognizer.buttonMask.请注意,UIGestureRecognizer的属性来自上次处理的事件。

.buttonMask将显示在活动期间按下的按钮集。

结论

据我了解,您希望完成以下任务:

  1. 识别来自指点设备的点击
  2. 确定按下了哪个按钮
  3. 确定点击来自哪个设备。

对于#1,您可以使用UIApplicationSupportsIndirectInputEvents来获取新的UITouch.TouchType.indirectPointer,这将允许您区分这些触摸。

对于 #2,您可以在UIEventUIGestureRecognizer上使用.buttonMask

对于#3,目前没有API可以在iOS上实现此目的。

(编辑(一位同事提到GameController.framework可能会对此有所帮助。

https://developer.apple.com/documentation/gamecontroller

您将能够看到所有连接的鼠标GCMouse.mice(),并在它们连接时收到通知:

https://developer.apple.com/documentation/gamecontroller/gcmouse/3626182-mice

不幸的是,您也无法在此处看到鼠标的ID。不过,它还是给了你一些需要考虑的东西。

观看此视频,深入了解有关GameController.framework对指点设备和键盘的支持的更多详细信息:

https://developer.apple.com/videos/play/wwdc2020/10617/

此功能似乎没有公共 API。

iOS 13 上的所有"鼠标"事件都注册为常规触摸事件,就像 AssistiveTouch 生成的事件一样。您无法检查这些事件的来源。

注意:这是一项辅助功能,不应依赖启用该功能,并且无法检测它是否已启用或强制用户启用它。

最新更新