CoreMotion是iOS系统目前用于处理加速度计,陀螺仪,计步器和环境相关事件。 Core Motion的报告来自iOS设备的板载硬件的运动和环境相关数据,包括加速度计和陀螺仪,以及计步器,磁力计和气压计。
为了以特定的时间间隔接收运动数据,应用程序调用一个“start”方法,该方法接受一个操作队列(NSOperationQueue的实例)和一个特定类型的块处理程序来处理这些更新。运动数据被传递到块处理程序。更新频率由“interval”属性的值决定。
Accelerometer加速度计使用方式:
Gyroscope陀螺仪使用方式:
Magnetometer磁强计使用方式:
Device motion设备运动使用方式:
属性 | 类型 | 作用 |
accelerometerAvailable | BOOL | 设备上是否有加速度计 |
gyroAvailable | BOOL | 设备上是否有陀螺仪 |
magnetometerAvailable | BOOL | 设备上是否有磁强计 |
deviceMotionAvailable | BOOL | 动作服务在设备上是否可用 |
属性 | 类型 | 作用 |
accelerometerActive | BOOL | 当前是否正在进行加速度计更新 |
gyroActive | BOOL | 确定当前是否正在进行陀螺仪更新 |
magnetometerActive | BOOL | 确定当前是否正在进行磁力计更新 |
deviceMotionActive | BOOL | 确定应用程序是否从设备动作服务接收更新 |
属性 | 类型 | 作用 |
accelerometerUpdateInterval | TimeInterval | 加速度计更新间隔 |
gyroUpdateInterval | TimeInterval | 陀螺仪更新间隔 |
magnetometerUpdateInterval | TimeInterval | 磁力计更新间隔 |
deviceMotionUpdateInterval | TimeInterval | 设备动作服务接收更新间隔 |
- 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) {
- // 往下晃动
- }
- })
- }
检测手机屏幕方向
- 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
- }
- }
- }