标签:
我们知道有一些iOS的应用,会有一些特殊的要求,比如:
1. 电子罗盘指南针之类的应用:让我们知道方向。
2. 运动类型软件:让我们知道我们跑步多少公里。
3. 社交软件中的摇一摇功能。
4. 游戏中扮演角色类中根据设备的晃动等进行操作。
其实,他们多半是使用了iOS中的一个核心运动框架CoreMotion.framework
CoreMotion
框架,主要是为了访问加速度计和陀螺仪的相关数据。CMAccelerometerData
CMGyroData
CMDeviceMotion
实际上,这个设备motion值就是通过加速度和旋转速度进行变换算出来的
attitude
:通俗来讲,就是告诉你手机在当前空间的位置和姿势gravity
:重力信息,其本质是重力加速度矢量在当前设备的参考坐标系中的表达userAcceleration
:加速度信息rotationRate
:即时的旋转速率,是陀螺仪的输出CMMotionManager
管理对象-(void)stopAccelerometerUpdates;//停止获取加速度计数据
-(void)stopGyroUpdates;//停止获取陀螺仪数据
-(void)stopDeviceMotionUpdates;//停止获取设备motion数据
Push
方式: NSOperationQueue
和一个回调Block
,CoreMotion
自动在每一个采样数据到来的时候回调这个Block
,进行处理。在这种情况下,Block
中的操作会在你自己的主线程内执行。Pull
方式: CMMotionManager
要数据,这个数据就是最近一次的采样数据。你不去要,CMMotionManager
就不会给你。- (void)useAccelerometerPull{
//初始化全局管理对象
CMMotionManager *manager = [[CMMotionManager alloc] init];
self.motionManager = manager;
//判断加速度计可不可用,判断加速度计是否开启
if ([manager isAccelerometerAvailable] && [manager isAccelerometerActive]){
//告诉manager,更新频率是100Hz
manager.accelerometerUpdateInterval = 0.01;
//开始更新,后台线程开始运行。这是Pull方式。
[manager startAccelerometerUpdates];
}
//获取并处理加速度计数据
CMAccelerometerData *newestAccel = self.motionManager.accelerometerData;
NSLog(@"X = %.04f",newestAccel.acceleration.x);
NSLog(@"Y = %.04f",newestAccel.acceleration.y);
NSLog(@"Z = %.04f",newestAccel.acceleration.z);
}
- (void)useAccelerometerPush{
//初始化全局管理对象
CMMotionManager *manager = [[CMMotionManager alloc] init];
self.motionManager = manager;
//判断加速度计可不可用,判断加速度计是否开启
if ([manager isAccelerometerAvailable] && [manager isAccelerometerActive]){
//告诉manager,更新频率是100Hz
manager.accelerometerUpdateInterval = 0.01;
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//Push方式获取和处理数据
[manager startAccelerometerUpdatesToQueue:queue
withHandler:^(CMAccelerometerData *accelerometerData, NSError *error)
{
NSLog(@"X = %.04f",accelerometerData.acceleration.x);
NSLog(@"Y = %.04f",accelerometerData.acceleration.y);
NSLog(@"Z = %.04f",accelerometerData.acceleration.z);
}];
}
}
- (void)useGyroPush{
//初始化全局管理对象
CMMotionManager *manager = [[CMMotionManager alloc] init];
self.motionManager = manager;
//判断陀螺仪可不可以,判断陀螺仪是不是开启
if ([manager isGyroAvailable] && [manager isGyroActive]){
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//告诉manager,更新频率是100Hz
manager.gyroUpdateInterval = 0.01;
//Push方式获取和处理数据
[manager startGyroUpdatesToQueue:queue
withHandler:^(CMGyroData *gyroData, NSError *error)
{
NSLog(@"Gyro Rotation x = %.04f", gyroData.rotationRate.x);
NSLog(@"Gyro Rotation y = %.04f", gyroData.rotationRate.y);
NSLog(@"Gyro Rotation z = %.04f", gyroData.rotationRate.z);
}];
}
}
以上代码必须是真机上才能正常运行,利用上面的知识我们可以做类似于这样的效果:
标签:
原文地址:http://blog.csdn.net/liuting5521826/article/details/51177203