iOS7下view默认是全屏模式,与iOS6有很大的不同,这样view的坐标值与以前不一样了,如果程序中有Navigation Bar,        
以前是从Navigation Bar底部开始计算y值的,现在却是从Status Bar开始计算y值。              
对此,苹果公司给出了如下解决方案:                      
 - (void)viewDidLoad                          
 {                            
     if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {                
         self.edgesForExtendedLayout = UIRectEdgeNone;                  
     }                            
 }                            
现在坐标就是开始从Navigation Bar开始计算了。然而这种情况只适合在Navigation Bar的情况,如果没有Navigation Bar,         
坐标仍然是从Status Bar顶部开始计算的。                      
如果底部有Tab Bar的情况呢,如果要兼容以前的frame设置,那么就需要设置UIViewController的edgesForExtendedLayout为UIRectEdgeNone。    
                             
如果我们的代码没有用storyboard, 没有用xib,纯代码的情况,如果要适配iOS7,那么上面只是介绍了有Navigation Bar, Tool Bar的情况,    
如果只是单纯的View,那么我们的代码运行在iOS7上,会有向上20px偏移,这需要手动修改:            
 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {                  
     self.view.bounds = CGRectMake(0, -20, self.view.frame.size.width, self.view.frame.size.height );            
 }                            
                             
上面的方法需要对所有的UIViewController进行设置,比较麻烦,还有一种较为简单的方法,就是设置window,这样可以影响所有的subview    
 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {                  
     [application setStatusBarStyle:UIStatusBarStyleLightContent];                  
     self.window.clipsToBounds =YES;                      
     self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);          
     self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);          
 }                            
不过这种方法有问题,当屏幕旋转时,Status Bar位置将不动。所以不推荐用这种方法,              
可以写一个UIViewController的category方法,然后调用方法一中的代码。这样对全工程进行修改以适配iOS7.          
                             
                             
使用xib进行布局                          
                             
新建一个UIViewController的子类,叫TestViewController,选中创建xib文件。                
然后在AppDelegate中将window的rootViewController换成我们新建的TestViewController实例            
现在我们在xib中拖入一个button,frame为(177, 0, 73, 44)                   
                             

                           
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
由于iOS7中扁平化设计了,button没有了边框,等一下我们会用xcode5+ios7来运行本程序,为了更清楚的看清frame,        
在此将button的边框显示出来,然后关连一个UIButton的变量textBtn到代码中,并用代码再生成一个button          
                             
 _testBtn.layer.borderWidth = 1;                        
 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];                
 btn.frame = CGRectMake(0, 0, 100, 44);                      
 btn.layer.cornerRadius = 0;                        
 btn.layer.borderColor = [UIColor blackColor].CGColor;                    
 btn.layer.borderWidth = 1;                        
 [btn setTitle:@"Test" forState:UIControlStateNormal];                    
 [self.view addSubview:btn];                        
运行程序,效果如图                          

                           
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
然后用xcode5打开用iOS7的效果:                       

                           
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
对比可以看出,iOS7是全屏的模式。 这样一来,从iOS6中升级过来的程序,布局就不正确了,有20px的偏移,          
上面介绍了用代码解决的方法,在这儿我们先用代码的方法来试试,在viewWillAppear中加入以下代码:          
 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {                  
     self.view.bounds = CGRectMake(0, -20, self.view.frame.size.width, self.view.frame.size.height );            
 }                            
再运行程序,效果如下:                         
                             

                           
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
其中代码加入的button,下移了20px, 可是xib中拖入的button还是以status bar顶部y=0开始计算frame.这可能是由于用到了auto layout,    
 所以xib有自己的frame计算方式. 代码生成的没有用auto layout约束,则受到了上面代码的影响。我们禁用xib的autolayout试试,再运行:     
                             

                           
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
这下由于没有auto layout的作用,都开始从status bar下面开始计算frame了。                
                             
如果程序中的view全是xib,没有用代码生成,那么还有一种解决方法,条件是xib中没有开启autolayout,而且不用代码控制self.view.bounds    
然后在在xcode5中选择我们的xib,并选择view中拖入的button,选择它的Size inspector,如图:             
                             

                           
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
对比一下就会发现,右边较之前版本多了一些内容,多了一个ios6/ios7 Deltas.它就是用来做iOS6的xib适配到iOS7用的。        
由于iOS7中,全屏的模式,所以需要设置+20,这样才从status bar底部开始显示。现在将button的y值设为20.如图:        
                             
 
   
 
                 
                   
                   
                   
                   
                   
                   
                   
                   
                   
                   
                   
                   
                   
                   
                   
                   
                   
                   
                   
                             
xcode5+ios7运行效果如图:                        
                             
 
   
 
                   
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                             
由于它的frame是从20开始的,细心的读者可能会有疑问了,如果我们运行在iOS7以前的设备上,由于frame是从20开始的,不是我们想要的效果。  
是从status bar下面20px.                        
                             
现在我们在将Deltas中y值设为-20.再运行到iOS6的设备上,效果如下:                 
                             
 
   
 
                   
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                     
                             
以上是在非autolayout模式下适配iOS7,下面来介绍一下autolayout下的适配工作。              
                             
我们用xcode4.6.3创建一个simgle view application. 选中Use storyboard.                
拖一个UIButton到view中。 由于开启了autoLayout, 在xcode4.6.3中,自动会有两个auto layout约束,分别是水平与垂直的约束:      
                             
 
   
 
   
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
运行程序效果:                          
                             
 
   
 
                     
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                             
可以看到是垂直方向上距status bar底部是45px,距右边是186px.                  
                             
现在我们用xcode5打开这个工程。会提示Upgrade storyboard,我们点击Upgrade. Upgrade后,会发现,垂直方向上有变化了,      
约束是从顶部开始,不是从status bar底部开始计算。这和我们想要的结果不一样,我们还是希望约束是从status bar底部开始计算。      
                             
仔细看看storyboard中的View Controller,会发现多了两项内容,分别是Top Layout Guide,Bottom Layout Guide.         
                             
 
   
 
   
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
                             
现在选中button,按住control键,然后拖到Top Layout Guide上,在弹出的对话框选择Vertical spacing            
                             
 
   
 
                     
                       
                       
                       
                       
                       
                       
这样又建立了一个垂直约束,你会发现这个约束是从Status bar底部开始计算的。这个约束有点像是我们需要的,        
 
   
 
   
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
                             
但是这个约束距status bar是25px,我们想要的是45px. 那只需要修改一下,将25px改为45px,你会发现有storyboard中有红色提示,      
这说明约束条件发生了冲突,因为垂直约束的值都为45,显示冲突了。                

                           
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
由于我们只需要status bar底部开始计算的那个约束,所以我们将旧的那个删掉即可。              
                             
 
   
 
   
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
                             
现在分别选择iOS6/iOS7来运行。都是距status bar下面45px显示button. 适配工程完成。              
                             
                             
                             
                             
                             
更多自动布局auto layout参考 http://www.cocoachina.com/applenews/devnews/2013/1203/7462.html          

ios6/io7 画面适配相关推荐

  1. iPhone6/6 Plus适配详解

    花了点时间, 重新整理了下iPhone的相关适配, 总结如下: iOS6之前, 屏幕适配一般使用autosize,设置视图与父视图的尺寸关系 缺陷:(Autosizing布局的不足) 1. 不能设置视 ...

  2. 瑞芯微RK2918、全志A10和AML8726-M3方案ICS系统运行效果对比

    为什么80%的码农都做不了架构师?>>>    6月12日注:由于对比时AML8726-M3方案的专用Flash插件还未出现,所以下文中关于网页应用和在线视频能力方面的对比不作为参考 ...

  3. iOS开发之项目经验总结

    在项目上线之后,终于有时间对自己的项目进行总结.不是什么特别重要的经验,但是如果我们的项目中缺少了这些会麻烦很多. 首先是创建基类,没有看过多少大神的代码,只是自己总结了点关于创建基类的经验.首先是v ...

  4. 腾讯游戏深度定制 ROG游戏手机3天生高能释放

    作为 一年一度的电竞盛宴,7月23日,ROG 2020新品发布会如约而至,其中ROG游戏手机3的正式发布成为整个发布会最大亮点.在成功打造了ROG游戏手机2之后,ROG游戏手机3同样由腾讯游戏深度定制 ...

  5. node.js 腾讯镜像站_史上最强Sx05RE游戏整合镜像发布!FBA4ARM永久闭源并停止发布!...

    先来说第一件事. 经过两个多星期的编程和整合,史上最强Sx05RE游戏整合镜像终于发布了!此次的整合镜像在官方Sx05RE 2.3.1的基础上,添加了独立NDS模拟器Drasitc以及独立程序Open ...

  6. IOS学习路线(2014-05-08)

    2019独角兽企业重金招聘Python工程师标准>>> 黑马最新IOS就业班(14年7月-12月份)培训视频教程 第一阶段:UI基础(17天) 计算器案例 介绍类前缀.简单介绍新建工 ...

  7. 电视+私人影院+KTV+游戏厅,爽!

    大概每个人都有这样一个梦想: 周末喊上朋友们,躺在懒人沙发上,打开投影仪,追综艺.看球赛,手边还有满满的零食和饮料,简直美翻了! 不得不说,对于很多家庭.租房年轻人,投影仪带来的幸福感,电视再大也给不 ...

  8. 4K电视与4K显示器的选择

    目前主流的电脑显示器分辨率是1920x1080,也就是常说的FHD标准,不过在智能手机都开始朝2560x1440前进了,PC显示器显然还需要更进一步的强化,下一代的标准就是4K分辨率,也就是Utlra ...

  9. 一个=电视+私人影院+KTV+游戏厅,爽!

    大概每个人都有这样一个梦想: 周末喊上朋友们,躺在懒人沙发上,打开投影仪,追综艺.看球赛,手边还有满满的零食和饮料,简直美翻了! 不得不说,对于很多家庭.租房年轻人,投影仪带来的幸福感,电视再大也给不 ...

最新文章

  1. AI一分钟 | AI单挑医学专家;中国AI企业破4000家
  2. 一次插拔U盘引发的学案
  3. DRUID连接池的实用 配置详解
  4. 在 远程桌面 权限不足无法控制 UAC 提示时,可使用 计划任务 绕开系统的 UAC 提示...
  5. C语言课后习题(17)
  6. idea 优化_JVM优化:如何利用VisualVM对高并发项目进行性能分析
  7. [转载] python-numpy如何初始化数组值全为nan
  8. 怎样设置电脑壁纸_怎样把C盘设置成禁止安装任何软件?教你两个方法,告别电脑卡顿...
  9. java堆空间此许可证无效_关于jvm:Java无法为对象堆错误保留足够的空间
  10. 基于JQUERY的WEB在线流程图设计器GOOFLOW 0.5版 数据值解析
  11. ubuntu 安装sougou 输入法
  12. 《大学》与威斯敏斯特大教堂的无名墓碑
  13. adb命令刷机vivox20_vivo手机如何双清?vivo双wipe刷机教程
  14. DSP芯片TMS320F2812之ADC模块的说明及使用步骤
  15. 函数式程序设计为什么至关重要
  16. 如何让DIV中的内容左边的靠左对齐,右边的靠右对齐?
  17. Golang Http RoundTrip解析
  18. 东京大学招生海报上的那些事(下)
  19. VoIP(网络电话)
  20. spoj#GCJ1C09C - Bribe the Prisoners

热门文章

  1. 适合上班族的25个副业
  2. 2022课堂云 艺术的启示 章节习题
  3. 进阶篇_一切指针都是纸老虎(指针详析)
  4. 【数据结构初阶】双向带头循环链表原来是纸老虎,结构复杂,操作简单
  5. 技术漫谈|DOE实验设计系列:关键工艺参数的如何识别、定义?
  6. 移动端浏览器预览word、excel、ppt
  7. python怎么操作打印机打印文字
  8. Mysql最新版8.0.21下载安装配置教程
  9. 2022年大数据开发实习面经总结,已拿顺丰、哔哩哔哩offer
  10. jpa findById 不需sql但是 dao integer接口是需要的