iOS加速计、陀螺仪(CoreMotion.framework)

https://www.jianshu.com/p/c4fff00b50ff?open_source=weibo_search

 

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,欢迎参考!!!

 
 
5人点赞
 
 


作者:my_杨哥
链接:https://www.jianshu.com/p/c4fff00b50ff
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2021-01-05 14:07  itlover2013  阅读(429)  评论(0编辑  收藏  举报