iOS开发-CoreMotion核心动作开发-陀螺仪CMRotationRate-加速计CMAcceleration-磁强计Magnetometer开发CoreMotion核心动作实践

本期内容:

  • CoreMotion 核心动作
  • CMMotionManager 核心动作管理类
  • CMAcceleration 加速度计
  • CMRotationRate 陀螺仪
  • Magnetometer 磁强计
  • Device motion设备运动
  • 使用DeviceMotion制作带有方向操作的晃动功能
  • 使用Accelerometer制作平衡球游戏

CoreMotion 核心动作

简介:CoreMotion是iOS系统目前用于处理加速度计,陀螺仪,计步器和环境相关事件。 Core Motion的报告来自iOS设备的板载硬件的运动和环境相关数据,包括加速度计和陀螺仪,以及计步器,磁力计和气压计。您可以使用此框架访问硬件生成的数据,以便在应用程序中使用它。例如,游戏可能使用加速度计和陀螺仪数据来控制屏幕上的游戏行为。

提示:
在iOS 10.0上或之后链接的iOS应用程序必须在其文件中包含用于所需数据类型的使用说明密钥。未能包含这些密钥将导致应用程序崩溃。要具体访问运动和健身数据,必须包含NSMotionUsageDescription,可以在Info.plist中添加字段来妥善解决。

在进行CoreMotion的具体操作之前我们需要详细的了解一下Api的构成


CMMotionManager 核心动作管理类

简介:CMMotionManager用于启动和管理运动服务的对象。 使用对象启动报告设备的板载传感器检测到的移动的服务。使用此对象可以接收四种类型的运动数据:CMMotionManager

  • 加速度计数据,指示设备在三维空间中的瞬时加速度。
  • 陀螺仪数据,表示设备三个主轴周围的瞬时旋转。
  • 磁强计数据,表明设备相对于地球磁场的方向。

设备运动数据,指示与运动相关的关键属性,例如设备的用户启动的加速度,其姿态,旋转速率,相对于校准磁场的方向以及相对于重力的方向。这些数据由Core Motion的传感器融合算法提供。经处理的设备运动数据给出设备的姿态,旋转速率,校准磁场,重力方向以及用户赋予设备的加速度。

提示:
在一般情况下,一个App仅可以创建一个CMMotionManager对象,因为此类的多个实例化之后,可能会影响从加速度计和陀螺仪接收数据的速率。

可以在指定的更新间隔接收实时传感器数据,或者让传感器收集数据并将其存储起来以供以后检索。对于这两种方法,当不再需要数据时,调用适当的停止方法(stopAccelerometerUpdates, stopgyroupdate, stopMagnetometerUpdates,和stopDeviceMotionUpdates)。

在使用的时候,在指定的时间间隔处理动作更新

为了以特定的时间间隔接收运动数据,应用程序调用一个“start”方法,该方法接受一个操作队列(NSOperationQueue的实例)和一个特定类型的块处理程序来处理这些更新。运动数据被传递到块处理程序。更新频率由“interval”属性的值决定。

  • Accelerometer加速度计使用方式:

    • 设置accelerometerUpdateInterval属性以指定更新间隔。
    • 调用startAccelerometerUpdatesToQueue:withHandler:方法,传入一个CMAccelerometerHandler类型的块。
    • 加速度计数据作为CMAccelerometerData对象传递到块。
  • Gyroscope陀螺仪使用方式:

    • 设置gyroUpdateInterval属性以指定更新间隔。
    • 调用startGyroUpdatesToQueue:withHandler:方法,传入一个类型ecmgyrohandler的块。
    • 旋转速率数据作为CMGyroData对象传递到块中。
  • Magnetometer磁强计使用方式:

    • 设置magnetometerUpdateInterval属性以指定一个更新间隔。
    • 调用startMagnetometerUpdatesToQueue:withHandler:方法,传递一个CMMagnetometerHandler类型的块。
    • 磁场数据作为CMMagnetometerData对象传递到块中。
  • Device motion设备运动使用方式:

    • 设置deviceMotionUpdateInterval属性以指定更新间隔。
    • 调用startdevicemotionupdatesingreferenceframe:或startdedevicemotionreferenceframe:toQueue:withHandler:或startDeviceMotionUpdatesToQueue:withHandler:方法,传入一个CMDeviceMotionHandler类型的块。
关于运动数据的周期性采样

为了通过定期采样处理运动数据,app调用不带参数的“start”方法,并定期访问属性为给定类型的运动数据保存的运动数据。这种方法是游戏等应用程序的推荐方法。处理块中的加速度计数据会带来额外的开销,并且大多数游戏应用程序在渲染帧时仅对最新的运动数据样本感兴趣。

  • 加速度计:调用startAccelerometerUpdates来开始更新,并通过读取accelerometerData属性定期访问CMAccelerometerData对象。

  • 陀螺仪:调用startgyroupdate开始更新,并通过读取gyroData属性定期访问CMGyroData对象。

  • 磁强计:调用startMagnetometerUpdates来开始更新,并通过读取magnetometerData属性定期访问CMMagnetometerData对象。

  • 设备运动:调用startDeviceMotionUpdatesUsingReferenceFrame:或startdedevicemotionupdates方法开始更新,并通过读取deviceMotion属性定期访问CMDeviceMotion对象。

检查设备的服务和功能

检查服务的可用性:

属性 类型 作用
accelerometerAvailable BOOL 设备上是否有加速度计
gyroAvailable BOOL 设备上是否有陀螺仪
magnetometerAvailable BOOL 设备上是否有磁强计
deviceMotionAvailable BOOL 动作服务在设备上是否可用

检查功能的活跃状态:

属性 类型 作用
accelerometerActive BOOL 当前是否正在进行加速度计更新
gyroActive BOOL 确定当前是否正在进行陀螺仪更新
magnetometerActive BOOL 确定当前是否正在进行磁力计更新
deviceMotionActive BOOL 确定应用程序是否从设备动作服务接收更新

使用样例如下:

#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()<UIAccelerometerDelegate>{
   
    CMMotionManager * motionManager;
}
@property(nonatomic,strong)UIDynamicAnimator *animator;

@end

@implementation ViewController

- (void)viewDidLoad {
   
    [super viewDidLoad];
    // 创建一个管理者对象
    motionManager = [[CMMotionManager alloc] init];
    // 判断设备是否支持
    [self isActived];
}

// 判断设备是否支持
- (void)isActived{
   
    // 判断设备是否支持加速度计
    if(motionManager.accelerometerAvailable){
   
        [motionManager startAccelerometerUpdates];
        NSLog(@"该设备支持加速度计");
    }else{
   
        NSLog(@"该设备不支取加速度");
    }
    
    // 判断设备是否支持陀螺仪
    if (motionManager.gyroAvailable){
   
        [motionManager startGyroUpdates];
        NSLog(@"该设备支持陀螺仪");
    }else{
   
        NSLog(@"该设备不支持陀螺仪");
    }
    
    // 判断设备是否支持磁强计
    if (motionManager.magnetometerAvailable){
   
        [motionManager startMagnetometerUpdates];
        NSLog(@"该设备支持磁强计");
    }else{
   
        NSLog(@"该设备不支持磁强计");
    }
    
    // 判断设备是否支持DeviceMotion
    if (motionManager.deviceMotionAvailable) {
   
        [motionManager startDeviceMotionUpdates];
        NSLog
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值