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设备运动使用方式:文章来源:https://www.toymoban.com/news/detail-708225.html
- 设置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) {
// 往下晃动
}
})
}
检测手机屏幕方向文章来源地址https://www.toymoban.com/news/detail-708225.html
if (motionManager.isAccelerometerAvailable) {
motionManager.accelerometerUpdateInterval = 1.0
motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (accelerometerData, error) in
let x = (accelerometerData?.acceleration.x)!
let y = (accelerometerData?.acceleration.y)!
let z = (accelerometerData?.acceleration.z)!
if ((fabs(y) + 0.1) >= fabs(x)) {
if (y >= 0.1) {
print("竖向朝下")
self.shootingOrientation = UIDeviceOrientation.portraitUpsideDown
}
else {
print("竖向朝上")
self.shootingOrientation = UIDeviceOrientation.portrait
}
}
else {
if (x >= 0.1) {
print("横向朝右")
self.shootingOrientation = UIDeviceOrientation.landscapeRight
}
else if (x <= -0.1) {
print("横向朝左");
self.shootingOrientation = UIDeviceOrientation.landscapeLeft
}
else {
print("竖向朝上");
self.shootingOrientation = UIDeviceOrientation.portrait
}
}
if (fabs(z) < 0.5) {
print("手机立起");
self.isValidInterfaceOrientation = true
}
else {
print("手机平放");
self.isValidInterfaceOrientation = false
}
}
}
到了这里,关于iOS CoreMotion获取传感器数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!