在ios中获取设备当前方向的枚举有UIInterfaceOrientation和UIDeviceOrientation

,前者包含枚举

Unknown//未知

Portrait//屏幕竖直,home键在下面

PortraitUpsideDown//屏幕竖直,home键在上面

LandscapeLeft//屏幕水平,home键在左边

LandscapeRight//屏幕水平,home键在右边

后者的设备方向枚举为:

Unknown//未知

Portrait//屏幕竖直,home键在下面

PortraitUpsideDown//屏幕竖直,home键在上面

LandscapeLeft//屏幕水平,home键在左边

LandscapeRight //屏幕水平,home键在右边

FaceUp //屏幕向上摆放在桌面

FaceDown//屏幕向下摆放在桌面

两者都包含了相关方向,一般情况下使用前者的四个方向即可,但是在使用前者UIInterfaceOrientation的时候,发现存在一个bug。如,我要通过监听来获得屏幕的当前方向,代码是这样的

 NSNotificationCenter.defaultCenter().addObserver(self, selector: "orientChange:", name: UIDeviceOrientationDidChangeNotification, object: nil)
    func orientChange(noti:NSNotification){
switch self.interfaceOrientation{
case .LandscapeLeft:
println("LandscapeLeft")
case .LandscapeRight:
println("LandscapeRight")
case .Portrait:
println("Portrait")
case .PortraitUpsideDown:
println("PortraitUpsideDown")
case .Unknown:
println("Unknown")
default:
println("default")
} }

此时屏幕旋转,控制台就会打印出当前的设备方向,一般情况下,打印的都是正确的,但是如果旋转的过快,比如我的旋转方向顺序为

Portrait->LandscapeRight->PortraitUpsideDown
控制台打印的顺序应该是
Portrait->LandscapeRight->PortraitUpsideDown

但是设备在旋转过快的时候打印的结果是

Portrait->LandscapeRight->LandscapeRight
这会导致UI变的不可接受。虽然这种情况一般不出现,但是如果被用户发现,却是不可饶恕的错误
于是我拿UIDeviceOrientation进行了测试,
UIDeviceOrientation不管旋转的速度多快,都能很好的识别出设备的真实方向。
所以由此得出建议,在能使用
UIDeviceOrientation的情况下,不要去使用UIInterfaceOrientation

是不是就完了呢?就这一个bug吗 不是的,还有一个问题
不管在使用
UIDeviceOrientation 和UIInterfaceOrientation,如果旋转速度过快,还会导致一个致命的问题。那就是设备的长宽取出来是错误的 我使用的ipad是1024X768,这个可以通过view.bounds得到也可以通过UIScreen.mainScreen().bounds得到
我同样是从
Portrait->LandscapeRight->PortraitUpsideDown,我在每一个方向下打印出获得的屏幕长宽,
理论上应该是(768,1024)->(1024,768)->(768,1024),但是旋转过快会导致这样的结果,你可能已经猜到:(768,1024)->(1024,768)->(1024,768)

也就是说我们可以得到正确的屏幕方向,但是有时候却得不到正确的屏幕长宽,为此我想到的办法是手动去设置屏幕的长宽。因为屏幕的尺寸的大小不会变,所以不管是长还是宽,数字大的肯定是设备横放时候的宽度,较小的是高度,于是:
    //获取当前状态实际的屏幕尺寸
func getRealScreenSize(orientation:UIDeviceOrientation)->CGSize{
var size = UIScreen.mainScreen().bounds.size
var w = size.width,h = size.height
if size.width < size.height{
w = size.height
h = size.width
}
switch orientation{
case .LandscapeLeft,.LandscapeRight:
size = CGSize(width: w, height: h) case .Portrait,.PortraitUpsideDown:
size = CGSize(width: h, height: w)
default:
println("a")
}
return size
}

我用getRealScreenSize方法来替代view.bounds或UIScreen.mainScreen().bounds

通过这种方式便解决了以上的bug。可能还有很方便的底层api能做到,暂时我还没有发现

 


 




												

关于UIInterfaceOrientation的一个bug的更多相关文章

  1. Tomcat一个BUG造成CLOSE_WAIT

    之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...

  2. MySQL关于exists的一个bug

    今天碰到一个很奇怪的问题,关于exists的, 第一个语句如下: SELECT ) FROM APPLY t WHERE EXISTS ( SELECT r.APPLY_ID FROM RECORD ...

  3. 由一个bug引发的SQLite缓存一致性探索

    问题 我们在生产环境中使用SQLite时中发现建表报“table xxx already exists”错误,但DB文件中并没有该表.后面才发现这个是SQLite在实现过程中的一个bug,而这个bug ...

  4. Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?

    Win10左下角菜单打不开,好痛苦,点击右下角的时间也没反应,各种不爽,折磨了我好几天,重装又不忍心,实在费劲,一堆开发环境要安装,上网找了很多方法都不适用.今天偶然解决了,仔细想了下,难道是Win1 ...

  5. 你可能不知道的 NaN 以及 underscore 1.8.3 _.isNaN 的一个 BUG

    这篇文章并不在我的 underscore 源码解读计划中,直到 @pod4g 同学回复了我的 issue(详见 https://github.com/hanzichi/underscore-analy ...

  6. 标准模板库(STL)的一个 bug

    今天敲代码的时候遇到 STL 的一个 bug,与 C++ 的类中的 const 成员变量有关.什么,明明提供了默认的构造函数和复制构造函数,竟然还要类提供赋值运算符重载.怎么会这样? 测试代码 Tes ...

  7. 是uibutton跟tableviewcell同步使用一个bug

    这个问题是uibutton跟tableviewcell同步使用一个bug,不关delay一点毛事,证据就是点击事件没问题,so,搜到一个方法解决了这个问题.uibutton分类symbian2+ios ...

  8. 在chrome下-webkit-box布局的一个bug

    chrome,也就是webkit内核下作的检测, chrome版本是40, -webkit-box这种布局在移动端用的比较多,主要是因为pc端的浏览器内核参差不齐. 因为在写HTML的时候看上了-we ...

  9. 关于MySQL count(distinct) 逻辑的一个bug【转】

    本文来自:http://dinglin.iteye.com/blog/1976026#comments 背景 客户报告了一个count(distinct)语句返回结果错误,实际结果存在值,但是用cou ...

随机推荐

  1. Laya1.x Timer小记

    Timer是时钟管理类,在Laya初始化的时候会创建一个实例,通过Laya.timer访问. TimerHandler TimerHandler是对每一个定时任务的封装,每次调用frameOnce.f ...

  2. springboot 前后端分离开发 从零到整(四、更改密码操作)

    前端发送更改密码请求,头部携带token,服务端拦截器拦截头部token并解析,根据token中的信息来查询用户信息.需要登录才能进行的操作是由自己定的,有些操作可以直接放行.具体实现是: 上一章写到 ...

  3. 【坚持】Selenium+Python学习记录 DAY9

    2018/05/29 [来源:菜鸟教程](http://www.runoob.com/python3/python3-examples.html) 运算符重载 https://segmentfault ...

  4. 【坚持】Selenium+Python学习之从读懂代码开始 DAY6

    2018/05/23 Python内置的@property装饰器 [@property](https://www.programiz.com/python-programming/property) ...

  5. 如何在window服务器上搭建一个能代替ftp的传输工具

    通常对于服务器上的文件管理和数据传输都是利用ftp来实现,但随着存储技术的发展,数据资产的存储规模和复杂程度不断提高,传统的ftp传输显得有笨重.今天给大家介绍一款能够取代ftp的在线文档管理软件—— ...

  6. Redis源码阅读(四)集群-请求分配

    Redis源码阅读(四)集群-请求分配 集群搭建好之后,用户发送的命令请求可以被分配到不同的节点去处理.那Redis对命令请求分配的依据是什么?如果节点数量有变动,命令又是如何重新分配的,重分配的过程 ...

  7. Hyperledger Fabric CA User’s Guide——CA用户指南(一)

    Fabric CA用户指南 Hyperledger Fabric CA是一种用于Hyperledger Fabric的认证机构(CA). 它提供了如下特性: 登记身份(注册ID),或者连接到作为用户注 ...

  8. FinTech领域实践:乐维监控助力西南某上市城商行IT运维转型升级!

    FinTech领域实践:乐维监控助力西南某上市城商行IT运维转型升级! 项目背景 随着信息化的逐步深入,企业业务运营活动对IT的依赖程度越来越高,传统的局部.粗放.碎片化的IT运维管理模式已经无法满足 ...

  9. Digitalocean + ss 搭建加密通信代理服务器

    本文以 DigitalOcean + ss/ssr 配置加密通道***为例,记录了手动搭梯子的过程. 启动一个服务器实例的操作可以参考我的这篇博文,这里主要介绍 ss/ssr 的服务搭建过程. 首先 ...

  10. AtCoder | ARC102 | 瞎讲报告

    目录 ARC102 前言 正文 传送链接~ ARC102 前言 实在是太菜了....写完第一题就弃疗..感觉T3好歹也是道可做题吧!!然后T2怎么又是进制拆分! 正文 A 题意 给你两个数字\(n,k ...