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

相关文章

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

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

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

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

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

Weex入门教程之4,获取当前全局环境变量和配置信息(屏幕高度、宽度等)

$getConfig() 获取当前全局环境变量和配置信息。 Returns: config (object): 配置对象;bundleUrl (string): bundle 的 url;debug (boolean): 是否是调试模式;env (object): 环境对象; weexVersion (string): Weex sdk 版本;appName (string): 应用名字;

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

Linux的系统性能监测参数获取方法介绍

目前的工程需要简单的监测一下Linux系统的:CPU负载、内存消耗情况、几个指定目录的磁盘空间、磁盘I/O、swap的情况还有就是网络流量。   Linux下的性能检测工具其实都有很多。   mrtg(http://people.ee.ethz.ch/~oetiker/webtools/mrtg/)就是一个很不错的选择。不过用mrtg就要装sysstat、apache、snmp、pe

家庭和学生用户笔记本电脑配置方案

2.6.1  家庭和学生用户笔记本电脑配置方案   2.6.1  家庭和学生用户笔记本电脑配置方案   普通家庭用户、学生用户主要用于上网、娱乐、学习等,这类用户要求笔记本电脑的各方面 功能比较均衡。在选购此类笔记本电脑时,主要考虑外观设计方面要比较时尚,而且性能上也要 够强,一些大型复杂的软件以及目前的主流游戏都要能够流畅地运行才行。   对于CPU方面,可以考虑目前主流的第二