iOS 监测用户将屏幕朝下翻转

2023-11-10 23:38

本文主要是介绍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 监测用户将屏幕朝下翻转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/386038

相关文章

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

mysql删除无用用户的方法实现

《mysql删除无用用户的方法实现》本文主要介绍了mysql删除无用用户的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 1、删除不用的账户(1) 查看当前已存在账户mysql> select user,host,pa

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核