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.roll
let rollDegrees = roll * 180 / Double.pi
//偏航
let yaw = motion!.attitude.yaw
let yawDegrees = yaw * 180 / Double.pi
//俯仰
let pitch = motion!.attitude.pitch
let pitchDegrees = pitch * 180 / Double.pi
print("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.x
let y = motion!.userAcceleration.y
let z = motion!.userAcceleration.z
if (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) {
// 往下晃动
}
})
}