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.buttonMask
或UIGestureRecognizer.buttonMask
.请注意,UIGestureRecognizer
的属性来自上次处理的事件。
.buttonMask
将显示在活动期间按下的按钮集。
结论
据我了解,您希望完成以下任务:
- 识别来自指点设备的点击
- 确定按下了哪个按钮
- 确定点击来自哪个设备。
对于#1,您可以使用UIApplicationSupportsIndirectInputEvents来获取新的UITouch.TouchType.indirectPointer
,这将允许您区分这些触摸。
对于 #2,您可以在UIEvent
或UIGestureRecognizer
上使用.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 生成的事件一样。您无法检查这些事件的来源。
注意:这是一项辅助功能,不应依赖启用该功能,并且无法检测它是否已启用或强制用户启用它。