代码之家  ›  专栏  ›  技术社区  ›  Ben Dowling

iOS触摸事件通知(专用API)

  •  8
  • Ben Dowling  · 技术社区  · 11 年前

    有可能 simulate touch events on iOS ,并且您可以在后台使用CTTelephonyCenterAddObserver和CFNotificationCenterAddObserver接收各种系统范围的通知,例如:

    不过,我还没有找到一种在后台获取触摸通知的方法。是否有可以与CFNotificationCenterAddObserver一起使用的“触摸事件”、可以使用的不同通知中心或完全不同的方法?

    我会对低级别的触摸信息(如x、y坐标和触摸类型)感到满意,但更高级别的信息(如按键、后退按钮等)会更好!

    1 回复  |  直到 11 年前
        1
  •  18
  •   Community Egal    7 年前

    你可以在中使用IOHID的东西 物联网工具包 以获得x,y坐标。

    #include <IOHIDEventSystem.h>
    

    创建IOHIDEventSystemClient:

    void *ioHIDEventSystem = IOHIDEventSystemClientCreate(kCFAllocatorDefault);
    

    寄存器回调:

    IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
    IOHIDEventSystemClientRegisterEventCallback(ioHIDEventSystem, handle_event, NULL, NULL);
    

    注销回调:

    IOHIDEventSystemClientUnregisterEventCallback(ioHIDEventSystem, handle_event, NULL, NULL);
    IOHIDEventSystemClientUnscheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
    

    回调:

    void handle_event (void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) {
       if (IOHIDEventGetType(event)==kIOHIDEventTypeDigitizer){
           IOHIDFloat x=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerX);
           IOHIDFloat y=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerY);
           int width = [[UIScreen mainScreen] bounds].size.width;
           int height = [[UIScreen mainScreen] bounds].size.height;
           NSLog(@"click : %f, %f", x*width, y*height) ;
       }
    }
    

    此外,您还可以查看: IOHIDEventSystemCreate on iOS6 failed . 希望这能有所帮助。

    编辑:请查看日志中的结果。在iPhone 4和5上进行了测试。

    void handle_event (void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) {
        NSLog(@"handle_event : %d", IOHIDEventGetType(event));
    if (IOHIDEventGetType(event)==kIOHIDEventTypeDigitizer){
        IOHIDFloat x=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerX);
        IOHIDFloat y=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerY);
        NSLog(@" x %f : y %f", x, y);
    //2013-03-28 10:02:52.169 MyIOKit[143:907] handle_event : 11
    //2013-03-28 10:02:52.182 MyIOKit[143:907]  x 0.766754 : y 0.555023
    }
    }