在 iOS 上使用传感器检测设备旋转
status
category
date
summary
slug
icon
tags
password
Reverse 专注沙漏中,最主要的倒转手机场景需要监测设备的方向变化,最常见的实现方式要求用户不能打开方向锁,为了解决这个问题,我改为用传感器检测加速度实现。
现有方案
传统的实现方式,需要依赖
UIDevice.current.orientation
属性:旋转之后可以对 View Size 的宽高进行比较判断(但要注意和 iPad 进行区分),横屏播放时自动隐藏 Home Indicator 就采用了这种实现方式:
这种实现方式要求用户在控制中心将旋转方向锁置为关闭状态,但我们又无法获取该开关的状态。就连我自己测试的时候,也经常忘记关闭方向锁,总要尝试几次倒转手机,发现没有反应之后,才想起这回事。
传感器
我们还可以通过运动传感器,手动获取运动状态,然后进行方向判断:
首先看一下各个方向轴的正负方向:

然后补充一下上面对方向进行判断的细节,以 XOY 平面为例,即手机垂直于水平面:

小球受到 X 和 Y 轴正负共四个方向的弹簧牵引,哪个方向的弹簧受到力的作用,哪个轴的加速度就可以被计算出来。例如正放手机(Portrait)时,Y 轴负方向(即小球下侧)的弹簧受力最大,超过了我们所设置的加速度限制,所以通过
acceleration.y <= -self.motionLimit
即可判断。然后顺时针旋转九十度(LandscapeLeft),这时以 X 轴正向(即正放时小球右侧)的弹簧受力最为明显,已经超过了临界值,所以我们可以通过acceleration.x >= self.motionLimit
判断这时的方向。总结
但这种实现方式完全通过加速度进行判断,用户体验上仍然有缺陷,例如沿某个轴快速来回移动,虽然屏幕朝向没有变,但仍然会触发加速度变化和检测,不过可以通过完善判断的边界条件来逐步改善。除了用户体验上的差别,还要考虑一些其他维度,例如耗电量(暂未验证)、用户习惯和隐私等等。
Loading...