Touchposé是一款适用于iOS的类库,当设备连接到镜像显示器时可以渲染屏幕触摸。Touchposé会在您的应用UI上添加一个透明的叠加层;所有触摸事件都会在该叠加层上渲染半透明的圆形——这对于使用投影仪演示应用非常有用(需要iPad 2或iPhone 4S)。
要将Touchposé用于您的应用中,请将示例项目中的QTouchposeApplication.m
和QTouchposeApplication.h
复制到您的项目中。
Touchposé应该适用于大多数应用(但请阅读以下注意点)。它通过一个公开的类QTouchposeApplication
和几个私有类实现。QTouchposeApplication
重写了‑sendEvent:
方法,并负责在叠加视图中渲染触摸。为确保叠加视图在视图层次结构中始终保持在最顶层,采取了一些复杂的实现技巧。这是通过拦截对-didAddSubview:
和-becomeKeyWindow
的调用来实现,使用的是方法替换。方法替换是由Objective-C运行时支持的,但它通常被认为是一种危险的做法,尤其是在对您不拥有的类进行操作时。此外,它只适用于您是唯一进行替换的情况——如果其他类也在同一类上替换方法,可能会导致问题。我的建议是,当您希望在一个投影仪上向观众演示应用时,仅将此代码用于私有的构建中。
要使用Touchposé与某个应用,指示使用QTouchposeApplication
代替UIApplication
。这是通过在UIApplicationMain
中指定应用程序类来实现的。
int main(int argc, char *argv[])
{
@autoreleasepool
{
return UIApplicationMain(argc, argv,
NSStringFromClass([QTouchposeApplication class]),
NSStringFromClass([QAppDelegate class]));
}
}
这样就完成了;不需要其他步骤。默认情况下,只有在实际连接到外部设备时才会显示触摸事件。如果您希望总是显示触摸事件,将QTouchposeApplication
的alwaysShowTouches
属性设置为YES
。
当显示警报视图时,在警报视图外部发起的触摸事件不会被显示。警报视图内部的触摸事件会正确显示(即使移动到警报视图外部也会显示)。
在iOS 5之前的版本中,Touchposé会干扰屏幕键盘的性能。作为解决方案,当运行iOS 5之前的版本并在显示键盘时,Touchposé会自动禁用。请注意,即使在iOS 5上,触摸也不会显示在键盘上。这不是很重要,因为键盘已经有视觉效果来指示触摸发生的位置。
在触摸结束时不总能清除手指触摸视图。这似乎是由iOS中的一个错误引起的:我们不会收到所有UITouch
实例结束的通知。关于此问题的讨论请参阅这里。我没有对此问题进行深入的调查——它似乎只发生在iOS 5之前的版本。
Touchposé遵守Apache许可证,版本2.0。