UIEventSubtypeMotionShake

UIEventSubtypeMotionShake

如何在iOS中以编程方式触发震动事件?

我尝试了以下方法,但它一直崩溃...

+ (void)shake {
    NSLog(@"TEST");

    UIMotionEventProxy *m = [[NSClassFromString(@"UIMotionEvent") alloc] _init];

    m->_subtype = UIEventSubtypeMotionShake;
    m->_shakeState = 1;

    [[[UIApplication sharedApplication] keyWindow] motionBegan:UIEventSubtypeMotionShake withEvent:m];
    [[[UIApplication sharedApplication] keyWindow] motionEnded:UIEventSubtypeMotionShake withEvent:m];
}

苹果在Hardware > Shake Gesture下的模拟器中做什么?

最佳答案

更改UIMotionEventProxy类(添加两个setter方法)似乎可以解决问题。我仅添加了两种方法setShakeState_setSubtype,如下所示。

-(void)setShakeState:(int)fp8 {
    _shakeState = fp8;
}
-(void)_setSubtype:(int)fp8 {
    _subtype = fp8;
}

然后,我将代码更改为以下内容...
UIMotionEventProxy *m = [[NSClassFromString(@"UIMotionEvent") alloc] _init];

[m setShakeState:1];
[m _setSubtype:UIEventSubtypeMotionShake];

[[UIApplication sharedApplication] sendEvent:m];
[[[UIApplication sharedApplication] keyWindow] motionBegan:UIEventSubtypeMotionShake withEvent:m];
[[[UIApplication sharedApplication] keyWindow] motionEnded:UIEventSubtypeMotionShake withEvent:m];

对于模拟器和物理设备而言,似乎都可以正常工作。 Here是可以下载的主文件和头文件,如果有人想查看完整的UIMotionEventProxy文件。

10-08 00:53