ios6/io7 画面适配


                             
               
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     
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值