本文主要是介绍iOS 监测用户将屏幕朝下翻转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
这一段时间在做一个功能,是能够监测到用户将屏幕面朝下翻转的动作,利用这个动作来作为开关,可以很方便的打开或关闭某些控件。
关于CoreMotion
CoreMotion 库是iOS 用来封装传感器的库类,其中包括加速计、陀螺仪和电磁感应器。
加速计可以用来监测设备是否是在运动、设备的朝向。
陀螺仪可以用来监测设备的旋转。
电磁感应可以用来监测南北磁极。
关于CMMotionManager
我们这边用到类CMMotionManager,这个类对以上三者提供了方便访问的接口。
使用这个类,要先导入CoreMotion
这个framework,然后#import <CoreMotion/CoreMotion.h>
。
- 根据官方建议将CMMotionManager封装成单例:
An app should create only a single instance of the CMMotionManager class. Multiple instances of this class can affect the rate at which an app receives data from the accelerometer and gyroscope.
+ (instancetype)sharedInstance {static HSYDeviceMotionHandler* instance = nil;static dispatch_once_t onceToken = 0;dispatch_once(&onceToken, ^{instance = [[HSYDeviceMotionHandler alloc] init];});return instance;
}
- 打开监听
- 初始化
CMMotionManager
; - 检查设备是否有传感器;
- 设置刷新速度,也就是每隔多长时间取得一次数据;这边我把刷新时间设置为0.1秒刷新一次;
static const NSTimeInterval HSYUpdateInterval = 0.1;
- 设置block,系统每刷新一次数据,会调用一次block;
- 在block中获取数据;
- 初始化
- (void)startHandling {if (!self.manager) {self.manager = [[CMMotionManager alloc] init];}if (self.manager.deviceMotionAvailable) {[self pushApproach];} else {[self.delegete hsyDeviceMotionNotAvailable];}
}
- (void)pushApproach {HSYDeviceMotionHandler *__weak weakSelf = self;self.manager.deviceMotionUpdateInterval = HSYUpdateInterval;[self.manager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {}];
}
- 停止监听
- (void)stopHandling {if (!self.manager) {return;}if (self.manager.deviceMotionActive) {[self.manager stopDeviceMotionUpdates];}
}
旋转速度监测
- 使用block中的参数motion获取;x是绕着x轴旋转的速度;y是绕y轴旋转的速度;
CMRotationRate rotationRate = motion.rotationRate;
weakSelf.rX = rotationRate.x;
weakSelf.rY = rotationRate.y;
- 判断是否到达所设定的速度;这边我把速度制定为3.5,这是一个很小的速度,也就是说稍微转一下设备就判断到达设定的速度;
static const double HSYMaxRotationRate = 3.5;
- (BOOL)isAchieveRotationRate {if (self.rX >= HSYMaxRotationRate || self.rX <= - HSYMaxRotationRate) {return YES;}if (self.rY >= HSYMaxRotationRate || self.rY <= - HSYMaxRotationRate) {return YES;}return NO;
}
重力感应监测
- 也是使用block中的参数motion获取;z是z轴上的重力分量;
CMAcceleration accrleration = motion.gravity;
weakSelf.aZ = accrleration.z;
- 如果z小于0,则说明屏幕朝上,大于0屏幕朝下;假如屏幕完朝下,那么z的值在0.98~0.99左右;我这边把值设置在0.85,也就是说屏幕不用苛刻地完全朝下,也能监测到;
static const double HSYGrativy = 0.85;
- (BOOL)isFaceDown {if (self.aZ >= HSYGrativy) {return YES;}return NO;
}
结合两者
- 用户手持设备的时候不可能完全没有动作,为了防止用户不小心触发,我把旋转监测和重力监测结合起来。这样一来不管是用户不小心晃动设备,还是无意间把设备盖在桌子上,都不会轻易触发。也就是如果用户是有意识地要翻转设备,才会同时触发两者;
if (weakSelf.isAchieveRotationRate && weakSelf.isFaceDown) {[weakSelf.delegete hsyDeviceMotionDidVerticalFlip];
}
总结
- 使用CMMotionManager对设备进行动作监听;
- 监测设备旋转速度大于某个速度;
- 监测设备屏幕是否朝下;
- 结合两者判断用户是否正在翻转设备;
这篇关于iOS 监测用户将屏幕朝下翻转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!