Core Motion可以让开发者从各个内置传感器那里获取未经修改的传感数据,并观测或响应设备各种运动和角度变化。通过这些传感器可以获取加速度值,陀螺仪值,设备motion值等。
CoreMotionManager
CoreMotionManager类能够使用到设备的所有移动数据(motion data),Core Motion框架提供了两种对motion数据的操作方式,一个是"pull",另一个是"push",其中"pull"
方式能够以CoreMotionManager的只读方式获取当前任何传感器状态或是组合数据。"push"方式则是以块或者闭包的形式收集到你想要得到的数据并且会在特定周期内得到实时的更新。
push:提供一个线程管理器NSOperationQueue和一个回调Block,CoreMotion自动在每一个采样数据到来的时候回调这个Block,进行处理。在这种情况下,Block中的操作会在你自己的主线程内执行
pull:你必须主动去向CMMotionManager要数据,这个数据就是最近一次的采样数据。你不去要,CMMotionManager就不会给你,在这种情况下,Core Motion所有的操作都在自己的后台线程中进行,不会有任何干扰你当前线程的行为
Core Motion的基本使用:初始化->获取数据->处理数据->不需要时 停止获取数据, 为了保证性能,苹果建议在使用CoreMotionManager的时候采用单例模式。
-(void)stopAccelerometerUpdates;//停止获取加速度计数据
-(void)stopGyroUpdates;//停止获取陀螺仪数据
-(void)stopDeviceMotionUpdates;//停止获取设备motion数据
CoreMotion主要负责三种数据:
加速度值CMAccelerometerData
陀螺仪值CMGyroData
设备motion值CMDeviceMotion
CMDeviceMotion属性介绍:
attitude:通俗来讲,就是告诉你手机在当前空间的位置和姿势
gravity:重力信息,其本质是重力加速度矢量在当前设备的参考坐标系中的表达
userAcceleration:加速度信息
rotationRate:即时的旋转速率,是陀螺仪的输出
CMMotionManager *mManager = [[CMMotionManager alloc] init];
_mManager = mManager;
//加速度器检测
if ([mManager isAccelerometerAvailable]) {//是否可用
NSLog(@"Accelerometer is available");
}else{
NSLog(@"Accelerometer is not available");
}
if ([mManager isAccelerometerActive]) {//是否启动
NSLog(@"Accelerometer is active");
}else{
NSLog(@"Accelerometer is not actiove");
}
//陀螺仪检测
if ([mManager isGyroAvailable]) {
NSLog(@"Gryro is available");
}else{
NSLog(@"Gryro is not available");
}
if ([mManager isGyroActive]) {
NSLog(@"Gryo is active");
}else{
NSLog(@"Gryo is not active");
}
/************************获取加速度***********************/
//1.push 方式
if ([mManager isAccelerometerAvailable] ) {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
mManager.accelerometerUpdateInterval = 0.01;
[mManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
NSLog(@"X = %.04f, Y = %.04f, Z = %.04f",accelerometerData.acceleration.x, accelerometerData.acceleration.y, accelerometerData.acceleration.z);
}];
}
//2.pull方式 备注:pull方式获取acceletation数据,需要自己实现计时器功能
if ([mManager isAccelerometerAvailable]) {//是否可用
NSLog(@"111Accelerometer is available");
mManager.accelerometerUpdateInterval = 0.01;//频率100HZ
[mManager startAccelerometerUpdates];//开始更新
}
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateAccelerometer) userInfo:nil repeats:YES];
[timer fire];
/************************获取陀螺仪***********************/
if ([mManager isGyroAvailable]) {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
mManager.accelerometerUpdateInterval = 0.01;
[mManager startGyroUpdatesToQueue:queue withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
NSLog(@"X = %.04f, Y = %.04f, Z = %.04f",gyroData.rotationRate.x, gyroData.rotationRate.y, gyroData.rotationRate.z);
}];
}
参考:http://www.cocoachina.com/ios/20141103/10111.html
网友评论