CoreMotion框架的使用

作者: 指头飞血 | 来源:发表于2017-07-07 10:02 被阅读803次

    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];
    }
    

    相关文章

      网友评论

        本文标题:CoreMotion框架的使用

        本文链接:https://www.haomeiwen.com/subject/qullhxtx.html