在开发过程中,我们通常会遇到获取 iPhone 绕自身的旋转角度 以及 获取 iPhone 与水平面的夹角 这类需求。打个比方,在项目中,我们需要集成一个相机拍摄照片的功能。前提条件是让只允许相机在横屏状态下进行拍摄,而竖屏状态下禁止拍摄。如果要实现这个需求,那么仅仅靠系统内置的相机 API 是无法实现的,那么我们就需要自定义相机。而本文就是解决在自定义相机时如何显示手机自身的状态,并拿到这个状态进而决定是否允许拍摄。

如下图,分别是在我自定义相机拍摄时横竖屏的一个界面展示状态,正好描述了上文描述的一个情景:

可以发现,在竖屏状态下时,会有一层灰黑色的蒙版,上面有提醒横屏拍摄的标识语,按钮也是禁用状态,只有退出按钮可用。而在横屏状态下时,拍照按钮可用,提示标语和蒙版均消失。那么,究竟怎么才能实现横竖屏的判定呢?

代码:

//

// PushViewController.m

// 陀螺仪

//

// Created by CoderZYWang on 2016/12/26.

// Copyright © 2016年 CoderZYWang. All rights reserved.

//

#import "PushViewController.h"

#import

@interface PushViewController ()

@property (nonatomic, strong) CMMotionManager *motionManager;

@end

@implementation PushViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

// 当前的view必须设置背景色,不然根本没法触发屏幕的点击事件

self.view.backgroundColor = [UIColor whiteColor];

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

[self useGyroPush]; // 界面点击时就会调用陀螺仪

}

- (void)viewDidDisappear:(BOOL)animated {

// 该界面消失时一定要停止,不然会一直调用消耗内存

[self.motionManager stopDeviceMotionUpdates]; // 停止所有的设备

// [self.motionManager stopAccelerometerUpdates]; // 加速度计

// [self.motionManager stopMagnetometerUpdates]; // 磁力计

// [self.motionManager stopGyroUpdates]; // 陀螺

}

- (void)useGyroPush{

//初始化全局管理对象

CMMotionManager *manager = [[CMMotionManager alloc] init];

self.motionManager = manager;

if ([self.motionManager isDeviceMotionAvailable]) {

manager.deviceMotionUpdateInterval = 1;

[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]

withHandler:^(CMDeviceMotion * _Nullable motion,

NSError * _Nullable error) {

// Gravity 获取手机的重力值在各个方向上的分量,根据这个就可以获得手机的空间位置,倾斜角度等

double gravityX = motion.gravity.x;

double gravityY = motion.gravity.y;

double gravityZ = motion.gravity.z;

// 获取手机的倾斜角度(zTheta是手机与水平面的夹角, xyTheta是手机绕自身旋转的角度):

double zTheta = atan2(gravityZ,sqrtf(gravityX * gravityX + gravityY * gravityY)) / M_PI * 180.0;

double xyTheta = atan2(gravityX, gravityY) / M_PI * 180.0;

NSLog(@"手机与水平面的夹角 --- %.4f, 手机绕自身旋转的角度为 --- %.4f", zTheta, xyTheta);

}];

}

}

@end

通过我们上面 block 回调的结果,我们可以精确的定位 iPhone 与水平面的夹角 以及 iPhone 绕自身旋转的角度。这样无论你的手机如何倾斜翻转,我们都能拿到它当前的一个状态。多次测试之后,就能获取到你想要设定的一个状态区间了。

ios 判断手机角度_iOS 【陀螺仪 之 iPhone绕自身的旋转角度 以及 iPhone与水平面的夹角】...相关推荐

  1. ios 判断手机角度_IOS 判断iPhone刘海屏

    如今Apple市场上,愈来愈流行刘海屏手机(与Android市场同样,往刘海屏手机方向发展趋势).windows 在iPhone手机角度上看,刘海屏出如今机型较新的手机上(相对较旧/老的iPhone上 ...

  2. ios 判断手机角度_iOS 角度获取及旋转

    获取当前角度 CGFloat radius = atan2f(view.transform.b, view.transform.a); CGFloat degree = radius * (360/ ...

  3. iOS 判断手机型号(已更新至iPhone 14 Pro Max)

    iOS 判断手机型号(已更新至iPhone 14 Pro Max) 判断手机型号代码如下: #import <sys/utsname.h> #pragma mark -- 判断手机型号 + ...

  4. iOS 判断手机型号及系统版本(包括iPhone 11系列)

    iPhoneX推出已经有很长时间了,从最初的简单适配到前一段时间拿到真机开始做更优化的适配,我在部分地方用到了判断手机型号及系统版本的方法,下面分享一下. 首先需要导入头文件 #import < ...

  5. ios 判断数字大小_iOS开发积累2

    3.设备的CPU架构简介 模拟器: 4s~5 : i386 5s~6plus : x86_64 真机: 3gs~4s : armv7 5~5c : armv7s (静态库只要支持了armv7,就可以跑 ...

  6. iOS 判断手机型号及系统版本(最新)持续更新

    添加头文件 #import <sys/utsname.h> + (NSString *)getPhoneModel { struct utsname systemInfo; uname(& ...

  7. ios获取手机序列号_iOS获取手机型号、iOS获取当前app的名称和版本号

    //需要#import + (NSString*)deviceModelName {structutsname systemInfo; uname(&systemInfo); NSString ...

  8. ios 判断数字开头_iOS 正则表达式判断纯数字及匹配11位手机号码的方法

    第一种使用正则表达式 判断 //是否是纯数字 + (BOOL)isNumText:(NSString *)str{ NSString * regex = @"(/^[0-9]*$/)&quo ...

  9. ios 判断数字开头_iOS 判断首字母是否大写 判断身份证 判断纯数字 判断纯汉字...

    对NSArray过滤 NSArray *array = [[NSArray alloc]initWithObjects:@"beijing",@"shanghai&quo ...

最新文章

  1. 两条链路实现负载均衡和容错的设计
  2. 四、spring中高级装配(2)
  3. JPA persistence.xml SQL脚本定义
  4. iservice封装有哪些方法_5w大功率led白光灯珠参数,5w大功率led灯珠有哪些?
  5. BGD-py实现学习【1】[转载]
  6. java 程序执行原理
  7. 机器学习面试概念重点汇总
  8. 入门嵌入式HTML/CSS/脚本引擎 sciter
  9. 一图看懂阿里云原生发布
  10. ADO.NET基础复习(二)
  11. 阿里云的ACP认证与ACE认证含金量高吗?
  12. mybatis mysql begin end_mybatis批量操作
  13. 高盛发布VR/AR研究报告
  14. 协同办公笔记软件综合评测:飞书、语雀、Notion、FlowUs、Wolai
  15. matlab 二值图像黑白颠倒,白天不懂夜的黑,为你开启PS黑白颠倒魔法。
  16. python使用requests模块下载文件
  17. <<2020云南省青少年创意编程与智能设计大赛>>参赛作品之变身魔药实验编程设计说明
  18. ​大话中国骨干网(下)(转)​
  19. 一种Android输入框待输入字符去除文本监听回调的方案思路
  20. 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一)

热门文章

  1. kong的理解和使用
  2. 手游破解手段介绍及易盾保护方案
  3. VS2013 fatal error LNK1207: PDB 格式不兼容
  4. android朋友圈评论功能兼容沉浸式状态栏,九宫格图片显示
  5. gradle-7.1.1-all 百度网盘下载
  6. ajax 调用java类_在ajax中调用java方法
  7. cad卸载_如何卸载干净CAD?
  8. 人像后期ps摄影师插件大全_安装教程
  9. mysql如何进行视图恢复_mysql事务 视图 索引 备份和恢复
  10. 如何使用计算机上的相机,怎样使用数码相机 数码相机怎么连接电脑