在iOS4之前,使用UIAccelermeter获取加速计的数据,这种方法由于简单,沿用至今。
加速计坐标系如图所示,在相应轴向受力时会有数据变化。
【过期方法】
①定义UIAccelerometer对象,设置代理,采样间隔,然后系统会自动调用代理方法。
UIAccelerometer *ac = [UIAccelerometer sharedAccelerometer]; ac.delegate = self; ac.updateInterval = 1 / 30.0;②然后遵循协议UIAccelerometerDelegate。
③然后调用代理方法:acceleration对象的x、y、z就是三轴数据。
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{ NSLog(@"%f %f %f",acceleration.x,acceleration.y,acceleration.z); }
【新方法】
新的方法在CoreMotion框架中。
新方法支持两种数据获取方式,push和pull,push指的是持续获取数据,pull指的是需要时主动获取数据。
1.Push方法:
创建对象、保存对象(防止对象释放无法继续执行)、设置采样间隔,然后调用相应方法,通过block回调。
// 创建manager,判断加速计是否可用,设置采样时间,开始采样。 CMMotionManager *manager = [[CMMotionManager alloc] init]; _manager = manager; if(!manager.isAccelerometerAvailable){ NSLog(@"加速计不可用"); return; } manager.accelerometerUpdateInterval = 1 / 30.0; // push方式 [manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { // 采集到数据时调用 if(error) NSLog(@"%@",error); NSLog(@"%lf %lf %lf",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z); }];
①调用startAccelerometerUpdates方法,然后就可以通过manager的accelerometerData对象得到数据。
// 创建manager,判断加速计是否可用,设置采样时间,开始采样。 CMMotionManager *manager = [[CMMotionManager alloc] init]; _manager = manager; if(!manager.isAccelerometerAvailable){ NSLog(@"加速计不可用"); return; } manager.accelerometerUpdateInterval = 1 / 30.0; // push方式,实时采集;pull方式,需要时主动获取。 [manager startAccelerometerUpdates]; // pull 方式
②手动获取,例如触摸输入时获取数据。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ CMAcceleration acceleration = _manager.accelerometerData.acceleration; NSLog(@"%lf %lf %lf",acceleration.x,acceleration.y,acceleration.z); }