iOS开发-CMMotionManager传感器陀螺仪

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判断陀螺仪、加速度、磁场信息等数据。

学习记录,每天不停进步。

猜你喜欢

转载自blog.csdn.net/gloryFlow/article/details/131968232