关于UIInterfaceOrientation的一个bug
在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的更多相关文章
- Tomcat一个BUG造成CLOSE_WAIT
之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...
- MySQL关于exists的一个bug
今天碰到一个很奇怪的问题,关于exists的, 第一个语句如下: SELECT ) FROM APPLY t WHERE EXISTS ( SELECT r.APPLY_ID FROM RECORD ...
- 由一个bug引发的SQLite缓存一致性探索
问题 我们在生产环境中使用SQLite时中发现建表报“table xxx already exists”错误,但DB文件中并没有该表.后面才发现这个是SQLite在实现过程中的一个bug,而这个bug ...
- Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?
Win10左下角菜单打不开,好痛苦,点击右下角的时间也没反应,各种不爽,折磨了我好几天,重装又不忍心,实在费劲,一堆开发环境要安装,上网找了很多方法都不适用.今天偶然解决了,仔细想了下,难道是Win1 ...
- 你可能不知道的 NaN 以及 underscore 1.8.3 _.isNaN 的一个 BUG
这篇文章并不在我的 underscore 源码解读计划中,直到 @pod4g 同学回复了我的 issue(详见 https://github.com/hanzichi/underscore-analy ...
- 标准模板库(STL)的一个 bug
今天敲代码的时候遇到 STL 的一个 bug,与 C++ 的类中的 const 成员变量有关.什么,明明提供了默认的构造函数和复制构造函数,竟然还要类提供赋值运算符重载.怎么会这样? 测试代码 Tes ...
- 是uibutton跟tableviewcell同步使用一个bug
这个问题是uibutton跟tableviewcell同步使用一个bug,不关delay一点毛事,证据就是点击事件没问题,so,搜到一个方法解决了这个问题.uibutton分类symbian2+ios ...
- 在chrome下-webkit-box布局的一个bug
chrome,也就是webkit内核下作的检测, chrome版本是40, -webkit-box这种布局在移动端用的比较多,主要是因为pc端的浏览器内核参差不齐. 因为在写HTML的时候看上了-we ...
- 关于MySQL count(distinct) 逻辑的一个bug【转】
本文来自:http://dinglin.iteye.com/blog/1976026#comments 背景 客户报告了一个count(distinct)语句返回结果错误,实际结果存在值,但是用cou ...
随机推荐
- TPO-20-Apply for the undergraduate research fund
/* 加粗:语音部分 * 红色:单词部分 * 斜体:语法部分 * 下划线:信号词/句 */ 第 1 段 1.Listen to a conversation between a ...
- 【SIKIA计划】_04_C#中级教程 (2015版)笔记
IKIC#中级教程 (2015版)正常模式指的是不会影响程序的正常运行.1,在VS中我们使用Console.Write(或者WriteLine)方法向控制台输出变量的值,通过这个我们可以查看变量的值是 ...
- Lwip:原生态的Linux socket应用如何移植到Lwip上
lwIP - A Lightweight TCP/IP stack 在上一篇中,我们了解到在OpenFastPath上如何移植原生态的Linux Socket应用程序,那么,对于另外一个老牌的小型TC ...
- RAID系列技术详解
1.RAID 0 RAID 0是把n个物理磁盘虚拟成一个逻辑磁盘,即形成RAID 0的各个物理磁盘会组成一个逻辑上连续,物理上也连续的虚拟磁盘.一级磁盘控制器(指使用这个虚拟磁盘的控制器,如果某台主机 ...
- Workbook对象的方法总结(二)
(1).Worksheet 对象有 row_dimensions 和 column_dimensions 属性,控制行高和列宽. 例如: >>> sheet.row_dimensio ...
- ossec兼容的操作系统
OSSEC兼容以下操作系统和日志格式 操作系统 以下操作系统可安装OSSEC代理 l GNU/Linux (all distributions, including RHEL, Ubuntu, Sl ...
- Tornado之笔记集合
目录 一.基本使用 二.路由系统 三.视图函数 四.模版语言 五.cookie 六.CSRF 七.文件上传 八.异步非阻塞 九.RESTFUL 十.自定义组件 一.基本使用 1.最简使用 import ...
- 20172324《Java程序设计》第二周学习总结
20172324<Java程序设计>第2周学习总结 教材学习内容总结 了解了字符串及其拼接和转义序列的使用. Java的基本数据类型. 定义数据转换类型和实现其转换的方法. Scanner ...
- css3学习笔记二
接着是对图形移动.旋转.倾斜.放缩的处理. -moz-transform:translateX(x deg) translateY(x deg);/*图形会沿着XY轴移动*/ -moz-transfo ...
- python learning IO.py
f = open('test.txt', 'r') # 'r' 表示只读 s = f.read() # 调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示 ...