屏幕适配

1、屏幕适配的发展过程:

代码计算frame -> autoreszing(父控件和子控件的关系) -> autolayout(任何控件都可以产生关系) -> sizeclass

 

没有屏幕适配,直接使用frame固定子控件的大小

屏幕大小一样,但是如果进行ipad开发,就需要考虑屏幕适配

屏幕大小不一样,需要考虑屏幕适配(使用autoresizing/autolayout实现)

autoresizing:ios7之前经常使用

autolayout:ios6开始出现,ios7之后大范围使用

sizeclass:ios8开始出现,解决横竖屏和iphone、ipad共同开发

 

 

2、autoreszing

- 需要去除autolayout选项,因为这两个属性冲突。view的autoresizesSubviews属性为yes时(默认为yes),autoresizing才会生效

- 从XCODE6开始,Storyboard&Xib默认是自动布局,因此我们需要手动调整,才能使用autoresizing

- autoresizing的局限性

     它只能描述父子控件之间的布局关系,而不能描述子控件与子控件之间的布局关系

 

 

3、autolayout

 

要先禁止autoresizing功能,设置view的下面属性为NO

NO;
    > 添加约束之前,一定要保证相关控件都已经在各自的父控件上

    > 不用再给view设置frame

 

使用autolayout不再需要设置子控件的frame

  • 通过使用父子控件之间的约束 或者 子控件与子控件之间的约束进行frame的设置。

 

-好处:

  • 你基本上可以不用考虑屏幕不同分辨率的问题,你终于可以不用在viewDidLoad方法里判断不同分辨率下,不同控件应该放在哪里,或者针对不同分辨率写不同的storyboard和xib
  • 你可以抛弃那些根据不同文字来计算tableViewCell、UILabel高度的代码了,因为autolayout会帮你自动计算好
  • 如果你的布局在横屏竖屏下变化不是特别大,你不用再为横着竖着写两套代码或者写两个storyboard/xib了

 

警告和错误

1)、警告(黄色提示)
        * 控件的frame不匹配所添加的约束, 比如比如约束控件的宽度为100, 而控件现在的宽度是110
      2)、错误(红色提示)
        * 缺乏必要的约束, 比如只约束了宽度和高度, 没有约束具体的位置

1个约束控件的宽度为100, 1个约束控件的宽度为110

 

 

4、sizeclass

仅仅是对屏幕进行了分类, 真正排布UI元素还得使用autolayout
* 不再有横竖屏的概念, 只有屏幕尺寸的概念
* 不再有具体尺寸的概念, 只有抽象尺寸的概念
* 把宽度和高度各分为3种情况
1) Compact : 紧凑(小)
2) Any : 任意
3) Regular : 宽松(大)
4) 符号代表
- : Compact
* : Any

+ : Regular