CoreMotion.framework框架介绍
CoreMotion.framework
是iOS中的一个核心运动框架,它能够满足我们手机许多应用的一些需求,比如:
- 指南针
- 加速计:微信摇一摇
- 游戏中根据重力感应的操作
- 计步器:知道我们每天走了多少步
一、加速计
检测设备在X、Y、Z轴上的加速度 (哪个方向有力的作用,哪个方向运动了)
根据加速度数值,就可以判断出在各个方向上的作用力度
注:重力不可忽略!!
在iOS5之前我们用UIAccelerometer来获取加速度,用法非常简单,不过iOS5之后就过期了,就用CoreMotion.framework了。
注:必须真机测试,不适用于模拟器
使用方法
加速计的数据获取方式有两种:push和pull
push
:
提供一个线程管理器NSOperationQueue和一个回调Block,CoreMotion自动在每一个采样数据到来的时候回调这个Block,进行处理。在这种情况下,Block中的操作会在你自己的主线程内执行。
pull
:
你必须主动去向CMMotionManager要数据,这个数据就是最近一次的采样数据。你不去要,CMMotionManager就不会给你。
首先引入CoreMotion.framework框架框架
#import <CoreMotion/CoreMotion.h>
创建一个管理类的对象
@property (nonatomic, strong) CMMotionManager *motionManager;
1、使用push方式获取加速计数据:
- (void)accelerometerPush
{
// 1.初始化运动管理对象
self.motionManager = [[CMMotionManager alloc] init];
// 2.判断加速计是否可用
if (![self.motionManager isAccelerometerAvailable]) {
NSLog(@"加速计不可用");
return;
}
// 3.设置加速计更新频率,以秒为单位
self.motionManager.accelerometerUpdateInterval = 0.1;
// 4.开始实时获取
[self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
//获取加速度
CMAcceleration acceleration = accelerometerData.acceleration;
NSLog(@"加速度 == x:%f, y:%f, z:%f", acceleration.x, acceleration.y, acceleration.z);
}];
}
2、使用pull方式获取加速计数据:
- (void)accelerometerPull
{
// 1.初始化运动管理对象
self.motionManager = [[CMMotionManager alloc] init];
// 2.判断加速计是否可用
if (![self.motionManager isAccelerometerAvailable]) {
NSLog(@"加速计不可用");
return;
}
// 3.开始更新
[self.motionManager startAccelerometerUpdates];
}
//在需要的时候获取值
- (void)getAccelerometerData
{
CMAcceleration acceleration = self.motionManager.accelerometerData.acceleration;
NSLog(@"加速度 == x:%f, y:%f, z:%f", acceleration.x, acceleration.y, acceleration.z);
}
二、陀螺仪
陀螺仪的主要作用,是基于角动量守恒的原理,沿着某个特定的坐标轴测量旋转速率。在使用中,陀螺仪的转子在高速旋转时,始终指向一个固定的方向,当运动物体的运动方向偏离预定方向时,陀螺仪就可以感受出来。
注:必须真机测试,不适用于模拟器
使用方法
陀螺仪的数据获取方式同样也有两种:push和pull,跟加速计的方式一样!
首先引入CoreMotion.framework框架框架
#import <CoreMotion/CoreMotion.h>
创建一个管理类的对象
@property (nonatomic, strong) CMMotionManager *motionManager;
1、使用push方式获取陀螺仪数据:
- (void)gyroPush
{
// 1.初始化运动管理对象
self.motionManager = [[CMMotionManager alloc] init];
// 2.判断陀螺仪是否可用
if (![self.motionManager isGyroAvailable]) {
NSLog(@"陀螺仪不可用");
return;
}
// 3.设置陀螺仪更新频率,以秒为单位
self.motionManager.gyroUpdateInterval = 0.1;
// 4.开始实时获取
[self.motionManager startGyroUpdatesToQueue:[[NSOperationQueue alloc] init] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
//获取陀螺仪数据
CMRotationRate rotationRate = gyroData.rotationRate;
NSLog(@"加速度 == x:%f, y:%f, z:%f", rotationRate.x, rotationRate.y, rotationRate.z);
}];
}
2、使用pull方式获取陀螺仪数据:
- (void)gyroPull
{
// 1.初始化运动管理对象
self.motionManager = [[CMMotionManager alloc] init];
// 2.判断陀螺仪是否可用
if (![self.motionManager isGyroAvailable]) {
NSLog(@"陀螺仪不可用");
return;
}
// 3.开始更新
[self.motionManager startGyroUpdates];
}
//在需要的时候获取值
- (void)getGyroData
{
CMRotationRate rotationRate = self.motionManager.gyroData.rotationRate;
NSLog(@"加速度 == x:%f, y:%f, z:%f", rotationRate.x, rotationRate.y, rotationRate.z);
}
三、demo
这里有我一个封装好可以直接使用摇一摇的demo,欢迎参考!!!