使用CMDeviceMotion

时间:2017-02-20 17:29:25

标签: ios objective-c accelerometer core-motion

我正在尝试复制类似于Runtastic's Fitness Apps的健身应用。

  

仰卧起坐

     

这是我们的第一个使用手机内置加速计检测运动的应用程序。您需要将手机放在胸前,然后足够快地坐起来,让加速度计记录运动,并将应用程序计为1个仰卧起坐。一定要做足够的仰卧起坐!

我做了一个类似于这个问题here的原型应用,试图实现一种计算仰卧起坐的方法。

- (void)viewDidLoad {
    [super viewDidLoad];

    int count = 0;

    motionManager = [[CMMotionManager alloc]init];

    if (motionManager.deviceMotionAvailable)
    {
        motionManager.deviceMotionUpdateInterval = 0.1;

        [motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {

            // Get the attitude of the device
            CMAttitude *attitude = motion.attitude;

            // Get the pitch (in radians) and convert to degrees.
            double degree = attitude.pitch * 180.0/M_PI;

            NSLog(@"%f", degree);

            dispatch_async(dispatch_get_main_queue(), ^{
                // Update some UI

                if (degree >=75.0)
                {
                    //it keeps counting if the condition is true!
                    count++;
                    self.lblCount.text = [NSString stringWithFormat:@"%i", count];
                }
            });   
        }];

        NSLog(@"Device motion started");
    }    
    else
    {
        NSLog(@"Device motion unavailable");
    }
}

if条件语句有效,好像我把设备放在胸前并做一个正确的仰卧起坐,但是这个if语句的问题是它只会继续计数,我希望它只计算在设备已经回到原来的位置。

任何人都可以为此提出逻辑实现吗?

1 个答案:

答案 0 :(得分:0)

一个简单的布尔标志就是这个诀窍:

__block BOOL situp = NO;


if (!situp)
{
    if (degree >=75.0)
    {
        count++;
        self.lblCount.text = [NSString stringWithFormat:@"%i", count];
        situp = YES;
    }
}

else
{
    if (degree <=10.0)
    {
        situp = NO;
    }
}

这里不是最好的逻辑实现,但它完成了工作......