CoreMotion框架的使用

Core Motion不仅能够提供实时的加速度值和旋转速度值,更重要的是苹果在其中集成了很多牛逼的算法

Core Motion框架(封装了 加速计 陀螺仪 计步器)

Core Motion获取数据的两种方式

1.push(实时采集所有数据(采集频率高))
2.pull(在有需要的时候,再主动采集数据)

导入CoreMotion框架 创建一个全局的管理者

#import "ViewController.h"
#import 
@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 *)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];
}

你可能感兴趣的:(CoreMotion框架的使用)