原创:知识探索型文章
创作不易,请珍惜,之后会持续更新,不断完善
个人比较喜欢做笔记和写总结,毕竟好记性不如烂笔头哈哈,这些文章记录了我的IOS成长历程,希望能与大家一起进步
温馨提示:由于简书不支持目录跳转,大家可通过command + F 输入目录标题后迅速寻找到你所需要的内容
目录
- 一、CMMotionManager
一、CMMotionManager
- 环境光传感器:感应光照强度
- 距离传感器:感应靠近设备屏幕的物体
- 磁力计传感器:感应周边磁场
- 内部温度传感器:感应设备内部温度(非公开)
- 湿度传感器:感应设备是否进水(非微电子传感器)
- 陀螺仪:感应持握方式
- 加速计:感应设备运动
iOS 中常见传感器如上所示,其中陀螺仪、加速计和磁力计的数据获取均依赖于 CMMotionManager
。CMMotionManager
是 Core Motion
库的核心类,负责获取和处理手机的运动信息,它可以获取的数据有:
- 加速度:标识设备在三维空间中的瞬时加速度
- 陀螺仪:标识设备在三个主轴上的瞬时旋转
- 磁场信息:标识设备相对于地球磁场的方位
- 设备运动数据:标识关键的运动相关属性
其中设备运动数据包括设备用户引起的加速度、姿态、旋转速率、相对于校准磁场的方位以及相对于重力的方位等,这些数据均来自于Core Motion
的传感器融合算法,从这一个数据接口即可获取以上三种数据,因此使用较为广泛。
CMMotionManager
有 push
和 pull
两种方式获取数据,push
方式实时获取数据,采样频率高,pull
方式仅在需要数据时采集数据,Apple 更加推荐这种方式获取数据。
push
方式将 CMMotionManager
采集频率interval
设置好以后,CMMotionManager
会在一个操作队列里从特定的 block
返回实时数据更新,这里以设备运动数据 DeviceMotion
为例。首先要注意尽可能在 app 中只创建一个 CMMotionManager
对象,多个 CMMotionManager
对象会影响从加速计和陀螺仪接受数据的速率。其次,在启动接收设备传感器信息前要检查传感器是否硬件可达,可以用
deviceMotionAvailable
检测硬件是否正常,用 deviceMotionActive
检测当前 CMMotionManager
是否正在提供数据更新。暂停更新也很容易,直接调用 stopXXXUpdates
即可。
CMMotionManager *motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1/15.0;
if (motionManager.deviceMotionAvailable) {
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler: ^(CMDeviceMotion *motion, NSError *error){
double x = motion.gravity.x;
double y = motion.gravity.y;
double z = motion.gravity.z;
NSLog(@"roll:%f, pitch:%f, yew:%f", motion.attitude.roll, motion.attitude.pitch, motion.attitude.yaw);
NSLog(@"x:%f, y:%f, z:%f", x, y, z);
}];
}
仍以 DevideMotion
为例,pull
方式代码如下。但是这样的方式获取的数据实时性不高,第一次获取可能没有数据,同时要注意不能过于频繁的获取,否则可能引起崩溃。
CMMotionManager *motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1/15.0;
if (motionManager.deviceMotionAvailable) {
[motionManager startDeviceMotionUpdates];
double x = motionManager.deviceMotion.gravity.x;
double y = motionManager.deviceMotion.gravity.y;
double z = motionManager.deviceMotion.gravity.z;
NSLog(@"x:%f, y:%f, z:%f", x, y, z);
下面是 CMMotionManager
监听的各类运动信息的简单描述。首先需要明确,iOS 设备的运动传感器使用了如下的坐标系,对于iPhone手机来说,画面上下为y
轴,左右为x
轴,贯穿屏幕为z
轴,向上,向右,手机的前面分别是各轴的正方向。 DeviceMotion
信息具体对应 iOS 中的 CMDeviceMotion
类,它包含的数据有:
attitude
attitude
用于标识空间位置的欧拉角(roll
、yaw
、pitch
)和四元数(quaternion
)。其中绕 x
轴运动称作 pitch
(俯仰),绕 y
轴运动称作 roll
(滚转),绕 z
轴运动称作 yaw
(偏航)。当设备正面向上、顶部指向正北、水平放置时,pitch
、yaw
和 roll
值均为 0,其他变化如下:
- 设备顶部上扬,
pitch
由 0 递增pi/2
,顶部下沉,由 0 递减pi/2
- 设备顶部左偏 180 度范围内,
yaw
由 0 递增pi
,右偏递减 - 设备左部上旋,
roll
由 0 递增pi
,左部下旋,roll
由 0 递减
rotationRate
rotationRate
标识设备旋转速率,具体变化如下:
-
pitch
增加,x > 0
,pictch
减少,x < 0
-
roll
增加,y > 0
,row
减少,y < 0
-
yaw
增加,z > 0
,yaw
减少,z < 0
gravity
gravity
用于标识重力在设备各个方向的分量,具体值的变化遵循如下规律:重力方向始终指向地球,而在设备的三个方向上有不同分量,最大可达 1.0,最小是 0.0。
userAcceleration
userAcceleration
用于标识设备各个方向上的加速度,注意是加速度值,可以标识当前设备正在当前方向上减速 or 加速。
magneticField & heading
magneticField
用于标识设备周围的磁场范围和精度,heading
用于标识北极方向。但是要注意,这两个值的检测需要指定 ReferenceFrame
,它是一个 CMAttitudeReferenceFrame
的枚举,有四个值。
距离传感器
距离传感器可以检测有物理在靠近或者远离屏幕,使用如下:
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange:) name:UIDeviceProximityStateDidChangeNotification object:nil];
- (void)proximityStateDidChange:(NSNotification *)note
{
if ([UIDevice currentDevice].proximityState) {
NSLog(@"Coming");
} else {
NSLog(@"Leaving");
}
}
网友评论