在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); }];
2.Pull方法:
①调用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); }