简单的 iPhone 动作检测

22

我需要检测陀螺仪/加速度计被激活的一定量程度,以便检测设备是否在运动。我对核心动态(Core Motion)一无所知。

也许有人可以向我指引一份初学者教程之类的东西。

提前感谢您的帮助。

2个回答

35

我认为你需要使用Core Motion。好消息是,对于你的问题域来说,使用它并不那么难。开始阅读事件处理指南,特别是处理已处理的设备动作数据部分。如果你只对知道轻微动作是否发生感兴趣,就像你所说的那样,可以省略旋转处理,并将信号处理集中在CMDeviceMotion.userAcceleration上。这是因为每次旋转也会产生加速度计信号。

按照CMDeviceMotionHandler中描述的方式创建一个,然后调用startDeviceMotionUpdatesToQueue:withHandler:。 你的CMDeviceMotionHandler应该执行以下操作:

float accelerationThreshold = 0.2; // or whatever is appropriate - play around with different values
CMAcceleration userAcceleration = deviceMotion.userAcceleration;
if (fabs(userAcceleration.x) > accelerationThreshold) 
    || fabs(userAcceleration.y) > accelerationThreshold
    || fabs(userAcceleration.z) > accelerationThreshold) {
    // enter code here
}

基本上就是这样。请记住,每个加速度都会有一个相应的对应物。这意味着,如果您施加一个力来使设备向右移动(即加速),则将有一个相应的减速来停止运动,并让该设备停留在新位置。因此,您的if条件将对每个单独的运动成立两次。


你提供的链接非常好!尽管我一直在搜索运动读数,并阅读所有相关的课程参考资料,但我就是找不到像那样的摘要 - 谢谢! - Oded Ben Dov
谢谢您以简单易懂的方式进行说明 :) - Luqman
1
这个链接已经失效了,“处理设备动作数据”能否请您更新一下链接? - bpolat
1
在本评论发布时,您可以在此处找到该文章的缓存副本:http://nathanmock.com/files/com.apple.adc.documentation.AppleiOS6.0.iOSLibrary.docset/Contents/Resources/Documents/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html。 - henryaz

2
viewDidAppear 方法中,成为第一响应者:
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

请确保您能成为第一响应者:

- (BOOL)canBecomeFirstResponder {
    return YES;
}

然后您可以实现运动检测。
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if (event.subtype == UIEventTypeMotion){
        //there was motion
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接