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开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT