Core Motion不仅能够提供实时的加速度值和旋转速度值,更重要的是苹果在其中集成了很多牛逼的算法
Core Motion框架(封装了 加速计 陀螺仪 计步器)
Core Motion获取数据的两种方式
1.push(实时采集所有数据(采集频率高))
2.pull(在有需要的时候,再主动采集数据)
导入CoreMotion框架 创建一个全局的管理者
#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
@property(nonatomic,strong)CMMotionManager*manager;
@end
@implementation ViewController
-(CMMotionManager *)manager{
if (!_manager) {
//1.创建运动管理者
self.manager = [[CMMotionManager alloc]init];
}
return _manager;
}
陀螺仪
/**
push
*/
-(void)pushGyroUpdates{
//1.判断陀螺仪是否可用
if (!self.manager.isGyroAvailable) return;
//2.设置采样间隔(push)
self.manager.gyroUpdateInterval = 1/30.0;
[self.manager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
if (error) return ;
//获取采样信息(获取的是角速度(x,y,z))
CMRotationRate rotationRate = gyroData.rotationRate;
NSLog(@"%f__%f__%f",rotationRate.x,rotationRate.y,rotationRate.z);
}];
}
/**
pull
*/
-(void)pullGyroUpdates{
//2.判断陀螺仪是否可用
if (!self.manager.isGyroAvailable) return;
//3.开始采样
[self.manager startGyroUpdates];
}
加速计
/**
push
*/
-(void)pushAccelerometer{
//2.判断加速计是否可用
if (!self.manager.isAccelerometerAvailable) return;
//3.设置采样间隔(push)
self.manager.accelerometerUpdateInterval = 1/30.0;
//4.开始采样
[self.manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
if (error) return ;
//获取加速计信息(获取的是线性速度)
CMAcceleration acceleration = accelerometerData.acceleration;
NSLog(@"%f__%f__%f",acceleration.x,acceleration.y,acceleration.z);
}];
}
/**
pull
*/
-(void)pullAccelerometer{
//2.判断加速计是否可用
if (!self.manager.isAccelerometerAvailable) return;
//3.开始采样
[self.manager startAccelerometerUpdates];
}
pull方式下获取陀螺仪和加速计采样信息
#pragma mark pull下获取采样信息
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//获取加速计信息(获取的是线性速度)
CMAcceleration acceleration = self.manager.accelerometerData.acceleration;
NSLog(@"%f__%f__%f",acceleration.x,acceleration.y,acceleration.z);
//获取陀螺仪信息(获取的是角速度)
CMRotationRate rotationRate = self.manager.gyroData.rotationRate;
NSLog(@"%f__%f__%f",rotationRate.x,rotationRate.y,rotationRate.z);
}
计步计
-(void)StepCounterAction{
//1.判断计步器是否可用
if (![CMStepCounter isStepCountingAvailable])return;
//2.创建计步器对象
CMStepCounter *stepCounter = [[CMStepCounter alloc]init];
//3.开始计步(参数2updateOn表示: 走多少步调用一次这个方法)
[stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {
if (error) return ;
//一共走了多少步
NSLog(@"%ld",numberOfSteps);
}];
}
方法调用
- (void)viewDidLoad {
[super viewDidLoad];
// 加速计
[self pushAccelerometer];//push方式
[self pullAccelerometer];//pull方式
//陀螺仪
[self pushGyroUpdates];//push方式
[self pullGyroUpdates];//pull方式
//计步计
// [self StepCounterAction];
}
网友评论