iOS开发-CMMotionManager传感器陀螺仪
之前开发中遇到需要使用陀螺仪判断是否拍照时候水平判断,如果没有水平拍照,则给出提示。方便用户拍照合适的题目图片。
一、CMMotionManager
CMMotionManager是什么
CMMotionManager 是 Core Motion 库的核心类,负责获取和处理手机的运动信息,它可以获取的数据有
- 陀螺仪,标识设备在三个主轴上的瞬时旋转
- 加速度,标识设备在三维空间中的瞬时加速度
- 磁场信息,标识设备相对于地球磁场的方位
设备运动数据,标识关键的运动相关属性,包括设备用户引起的加速度、姿态、旋转速率、相对于校准磁场的方位以及相对于重力的方位等,这些数据均来自于 Core Motion 的传感器融合算法,从这一个数据接口即可获取以上三种数据,因此使用较为广泛
二、CMMotionManager陀螺仪代码
陀螺仪判断是否拍照时候水平判断
代码如下
#import <Foundation/Foundation.h>
#import <CoreMotion/CoreMotion.h>
@interface SDSensorManager : NSObject
@property (nonatomic, copy) void (^updateDeviceMotionBlock)(CMDeviceMotion *data);
+ (instancetype)shareInstance;
- (void)startGyroscope;
- (void)stopGyroscope;
@end
#import "SDSensorManager.h"
static SDSensorManager *shareInstance = nil;
@interface SDSensorManager ()
@property (nonatomic, strong) CMMotionManager *motionManager;
@end
@implementation SDSensorManager
+ (instancetype)shareInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shareInstance = [[SDSensorManager alloc] init];
shareInstance.motionManager = [[CMMotionManager alloc]init];
});
return shareInstance;
}
- (void)startGyroscope {
if (_motionManager.deviceMotionAvailable) {
_motionManager.deviceMotionUpdateInterval = 1/30;
__weak typeof(self)mySelf = self;
[_motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:^(CMDeviceMotion *data, NSError *error) {
if (mySelf.updateDeviceMotionBlock) {
mySelf.updateDeviceMotionBlock(data);
}
}];
}
}
- (void)stopGyroscope {
[_motionManager stopDeviceMotionUpdates];
self.updateDeviceMotionBlock = nil;
}
@end
开启判断陀螺仪,根据设备的水平旋转判断是否给出相应的提示。
/**
启动陀螺仪
*/
- (void)startSenorManager {
__weak typeof(self) weakSelf = self;
[SDSensorManager shareInstance].updateDeviceMotionBlock = ^(CMDeviceMotion *data){
DebugLog(@"gravity.x == %f", data.gravity.x);
DebugLog(@"gravity.y == %f", data.gravity.y);
CGFloat gravityX = data.gravity.x;
CGFloat gravityY = data.gravity.y;
BOOL hXShow = NO;
BOOL hYShow = NO;
if (gravityX > 0.20 || gravityX < -0.20) {
// 水平倾斜了
hXShow = YES;
}
if (gravityY > 0.20 || gravityY < -0.20) {
// 竖直倾斜了
hYShow = YES;
}
BOOL showCampass = NO;
if (hXShow || hYShow) {
// 水平倾斜了,可显示CampassImageView
if (weakSelf.showExampleImage || weakSelf.showFrontImageView.image) {
// 已经显示了example图片了,则不显示
showCampass = NO;
} else {
showCampass = YES;
}
}
weakSelf.compassImageView.hidden = !showCampass;
};
[[SDSensorManager shareInstance] startGyroscope];
}
关闭陀螺仪,在不需要使用的时候,关闭陀螺仪。
/**
关闭陀螺仪
*/
- (void)stopSenorManager {
[[SDSensorManager shareInstance] stopGyroscope];
}
三、小结
iOS开发-CMMotionManager传感器陀螺仪,使用CMMotionManager判断陀螺仪、加速度、磁场信息等数据。
学习记录,每天不停进步。