屏幕适配
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