通过CMMotionManager提示用户拍照摆正手机

719 阅读2分钟

正如封面提所示 , 之前看到网上的文章都是说iPhone陀螺仪的Y轴是朝上的 , 经过这次需求我发现Y轴是朝下的 , 然后如果Home键朝下竖直方向放置手机陀螺仪的y值一直是-1左右 , x值一直是0左右 , 所以我大概猜测陀螺仪的位置应该就在手机听筒的正上方的样子!

下面的案例是一个监听让手机正向放置或者横向放置的方法 , 允许一些容错在里面 这里设置的是0.15的角度容错~ 如果倾斜角度过大就提示请您摆正手机之类的提示并且按钮置为不可交互, 否则就容错允许拍照~ 比较粗糙的一个思路, 在这边记录一下~ 最后达到的效果就是只要纵向偏置或者横向偏置超过这个敏感值就会提示用户要摆正手机~

#import <CoreMotion/CoreMotion.h>   // 陀螺仪类库
#define SENSITIVE 0.15  // 陀螺仪的敏感值 , 在这个范围内都允许交互按钮~


@interface DisplayRecognitionViewCtrl ()

@property (nonatomic, strong) TakeAPictureView *cameraView;//自定义相机
@property (nonatomic, strong) UIButton *cameraBtn;//拍照按钮
@property (nonatomic, strong) UIButton *cancleBtn;//拍照取消按钮
@property (nonatomic, copy) NSString *currentUUID;//唯一标识符
@property (nonatomic, strong) FileData *imgData;//图片数据
@property(nonatomic, strong) CMMotionManager *motionManager;    //陀螺仪控制器对象

@end

#pragma mark - 旋转小陀螺~
/// 旋转操作
/// @param motion 陀螺仪对象
/// fabs(x)是求x的绝对值:
/// 我感觉陀螺仪应该是在手机听筒位置放置 , 除去Z轴 , 那么正确的XY轴方向应该是X轴朝向右 , 而Y轴的正方向其实是朝下的!和UI的正方向是一致的!
- (void)deviceMotion:(CMDeviceMotion *)motion {
    // 只做XY平面方向的旋转 , 不做Z轴方向的考量:
    double x = motion.gravity.x;
    double y = motion.gravity.y;
    NSLog(@" x = %.2f  , y = %.2f" , x , y);
    // 1. Home键朝下侧 , x在0.15范围内晃动 , y始终小于0:
    // 2. Home键朝左侧 , y向上下0.15范围浮动 , x始终大于0
    // 3. Home键朝右侧 , y向上下0.15范围浮动 , x始终小于0
    if ((fabs(x) < SENSITIVE && y < 0) ||
        (fabs(y) < SENSITIVE && x > 0) ||
        (fabs(y) < SENSITIVE && x < 0) ) {
        self.cameraBtn.userInteractionEnabled = YES;
    } else {
        // Home键朝上 , x在0.15范围内晃动 , y始终大于0: (fabs(x) < SENSITIVE && y > 0) 这种情况也不允许, 这是在倒置手机的情况下拍照~
        self.cameraBtn.userInteractionEnabled = NO;
        [self showMsg:@"请您摆正手机~"];
    }
}