CoreMotion是iOS系统目前用于处理加速度计,陀螺仪,计步器和环境相关事件。 Core Motion的报告来自iOS设备的板载硬件的运动和环境相关数据,包括加速度计和陀螺仪,以及计步器,磁力计和气压计。
为了以特定的时间间隔接收运动数据,应用程序调用一个“start”方法,该方法接受一个操作队列(NSOperationQueue的实例)和一个特定类型的块处理程序来处理这些更新。运动数据被传递到块处理程序。更新频率由“interval”属性的值决定。
Accelerometer加速度计使用方式:
- 设置accelerometerUpdateInterval属性以指定更新间隔。
- 调用startAccelerometerUpdates(to queue, withHandler handler)方法,传入一个CMAccelerometerHandler类型的块。
- 加速度计数据作为CMAccelerometerData对象传递到块。
Gyroscope陀螺仪使用方式:
- 设置gyroUpdateInterval属性以指定更新间隔。
- 调用startGyroUpdates(to queue, withHandler handler)方法,传入一个类型CMGyroHandler的块。
- 旋转速率数据作为CMGyroData对象传递到块中。
Magnetometer磁强计使用方式:
- 设置magnetometerUpdateInterval属性以指定一个更新间隔。
- 调用startMagnetometerUpdates(to queue, withHandler handler)方法,传递一个CMMagnetometerHandler类型的块。
- 磁场数据作为CMMagnetometerData对象传递到块中。
Device motion设备运动使用方式:
- 设置deviceMotionUpdateInterval属性以指定更新间隔。
- 调用startDeviceMotionUpdates(to queue, withHandler handler) 或startDeviceMotionUpdates(using referenceFrame) 或 startDeviceMotionUpdates(using referenceFrame, to queue, withHandler handler)方法,传入一个CMDeviceMotionHandler类型的块。
- motion数据作为CMDeviceMotion对象传递到块中。
检查服务的可用性:
属性 | 类型 | 作用 |
accelerometerAvailable | BOOL | 设备上是否有加速度计 |
gyroAvailable | BOOL | 设备上是否有陀螺仪 |
magnetometerAvailable | BOOL | 设备上是否有磁强计 |
deviceMotionAvailable | BOOL | 动作服务在设备上是否可用 |
检查功能的活跃状态:
属性 | 类型 | 作用 |
accelerometerActive | BOOL | 当前是否正在进行加速度计更新 |
gyroActive | BOOL | 确定当前是否正在进行陀螺仪更新 |
magnetometerActive | BOOL | 确定当前是否正在进行磁力计更新 |
deviceMotionActive | BOOL | 确定应用程序是否从设备动作服务接收更新 |
更新间隔:
属性 | 类型 | 作用 |
accelerometerUpdateInterval | TimeInterval | 加速度计更新间隔 |
gyroUpdateInterval | TimeInterval | 陀螺仪更新间隔 |
magnetometerUpdateInterval | TimeInterval | 磁力计更新间隔 |
deviceMotionUpdateInterval | TimeInterval | 设备动作服务接收更新间隔 |
CMDeviceMotion属性介绍
- attitude:通俗来讲,就是告诉你手机在当前空间的位置和姿势。
- gravity:重力信息,其本质是重力加速度矢量在当前设备的参考坐标系中的表达。
- userAcceleration:加速度信息。
- rotationRate:计时的旋转速率,是陀螺仪的输出。
if (motionManager.isDeviceMotionAvailable) {motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: { (motion, error) in//翻滚let roll = motion!.attitude.rolllet rollDegrees = roll * 180 / Double.pi//偏航let yaw = motion!.attitude.yawlet yawDegrees = yaw * 180 / Double.pi//俯仰let pitch = motion!.attitude.pitchlet pitchDegrees = pitch * 180 / Double.piprint("Roll:%.2f", rollDegrees)print("Yaw:%.2f", yawDegrees)print("Pitch:%.2f", pitchDegrees)//重力加速度在各个方向的分量let gX = motion!.gravity.x;let gY = motion!.gravity.y;let gZ = motion!.gravity.z;print("重力X:%f -- Y:%f -- Z:%f", gX, gY, gZ);//检测到晃动let x = motion!.userAcceleration.xlet y = motion!.userAcceleration.ylet z = motion!.userAcceleration.zif (fabs(x)>2.0 || fabs(y)>2.0 || fabs(z)>2.0) {print("检测到晃动");}//带方向的晃动if (data.userAcceleration.x < -1.5f) {// 往左晃动}if (data.userAcceleration.x > 1.5f) {// 往右晃动}if (data.userAcceleration.y < -1.5f) {// 往上晃动}if (data.userAcceleration.y > 1.5f) {// 往下晃动}})
}