如何配置我的应用程序以检测抖动运动事件?

Posted

技术标签:

【中文标题】如何配置我的应用程序以检测抖动运动事件?【英文标题】:How do I configure my app to detect shake motion events? 【发布时间】:2012-09-07 09:11:04 【问题描述】:

所以让我首先说明一下我已经实现了哪些代码

-(BOOL)canBecomeFirstResponder 

    return YES;


- (void) viewWillAppear:(BOOL)animated 

    [super viewWillAppear:animated];
    [self becomeFirstResponder];


- (void) viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];
    [self becomeFirstResponder];


- (void)viewWillDisappear:(BOOL)animated 

    [self resignFirstResponder];
    [super viewWillDisappear:animated];


- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event

    if (motion == UIEventSubtypeMotionShake)
    
        NSLog(@"FUUU");
    


- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event

    if (motion == UIEventSubtypeMotionShake)
    
        NSLog(@"FUUU");
    

这一切都在 UIViewController 类中

- (void) applicationDidFinishLaunching:(UIApplication*)application我已经设置了

[application setApplicationSupportsShakeToEdit:YES];

然而它什么也没做,没有检测到任何单一的运动。我不确定还能做什么。这似乎对许多其他人有用,所以我很困惑为什么我与众不同......可能是因为它是通过 UINavigationController 吗?或者因为我通过 plist 加载主应用程序,而我的主应用程序看起来像这样

retVal = UIApplicationMain(argc, argv, nil, nil);

我完全被难住了。

【问题讨论】:

【参考方案1】:

为了检测摇动手势,您需要继承 UIView 并实现以下方法(不要在 UIViewController 上实现这些方法):

(BOOL)可以成为FirstResponder (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event

然后将子类视图添加到 UIViewController 并通过调用 -becomeFirstResponder 使其成为第一响应者。

【讨论】:

感谢您的回复,但我无法通过该方法使其正常工作,我将立即发布我的答案【参考方案2】:

您不需要设置[application setApplicationSupportsShakeToEdit:YES];,因为这是默认值,ios 仅将其用于摇动以撤消/重做。

如果您想在视图控制器中捕捉运动,您需要将此属性设置为 NO [application setApplicationSupportsShakeToEdit:NO]; 并自行处理。

如Event Handling Programming Guide 中所述。

希望这会有所帮助。

PS:以防万一,您在 viewDidAppear 方法中调用了错误的 super。这应该是:

- (void) viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];
    [self becomeFirstResponder];

【讨论】:

非常感谢您的及时回复并看到我的错字错误,我确实按照您的建议更改了它...但是没有骰子,仍然不起作用。 @Genhain 你收到回调 motionBegan 和 motionEnded 吗?即使您没有收到 UIEventSubtypeMotionShake 事件。 不,它甚至没有到达回调函数,这就是我如此困惑的原因【参考方案3】:

感谢大家的回复,但我最终使用了不同的方法,我在应用程序委托中访问了加速度计,然后通过 nsnotification 中心向当前显示的 ui 导航控制器发送 nsnotifcation

- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 

    [[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:nil userInfo:nil];

 

【讨论】:

以上是关于如何配置我的应用程序以检测抖动运动事件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-native-sensors 检测抖动设备事件?

如何使用 CMDeviceMotion 检测我的设备运行速度?

检测 iPhone 移动是不是改变方向?

Android Shake(Sensor) 服务,用于在应用程序后台进行抖动检测

iphone检测整个应用程序的抖动

我如何将 iphone 运动检测用于类似鸡蛋摇晃的应用程序?