自动布局(屏幕适配)
一 Autoresizing
1.只能设置父子控件之间的关系,同级间的控件的关系就没有办法.
2.默认左和上的固定优先
3.用代码方式创建出来的控件,默认是启用了Autoresizing,并且默认是子控件四边的间距固定,但只有左上角的两个有效(UIViewAutoresizingNone)
4.代码实现:用view.autoresizingMask(位移枚举),可多选,多选用'|'符号
二 AutoLayout
StoryBoard中的使用:
1.既能控制父子之间的关系,又可以控制兄弟之间的关系
2.与Autoresizing是互斥的,不能同时使用
3.两个核心概念:
1)参照:参照其他控件或者父控件来设置当前控件的位置和大小
2)约束(constraint):通过添加约束来限制控件的位置和大小
4:错误:
1)约束缺少;2)约束冲突
5.注意:每添加一个约束,计算他能确定该控件的frame的哪个值
6.核心公式:
first item ==/<=/>= second item * multipller + costant
7.Autolayout代码实现
注意点:
1)先禁止autoresizing功能,即设置为no;
2)不用再设置frame
3)添加约束之前,确保相关控价一定在格子的父控件上
规则:
1)对于两个同层级view之间的约束,添加到它们最近的父view上
2)对于两个不同层级view之间的约束关系,添加到它们最近的共同父view上
3)对于有层次关系的两个view之间的约束,添加到层次较高的父view上
Masonry:
1.
距离左边50:子控件的左边==父控件的左边的间距(偏移)50:
make.left.equalTo(self.view.mas_left).offset(50);
简化:
1)当约束控件的属性和参照控件的属性相同时,参照控件的属性可以省略:
make.left.equalTo(self.view).offset(50);
2)当属性的偏移值(offset)一样时,可以连写:
make.left.top.equalTo(self.view).offset(50);
3)一句话搞定(mas_equakTo可以把基本数据类型转化成对象类型):
make.edges.mas_equalTo(UIEdgeInsetsMake(50,50,50,50));
2.更新约束:
1)如果之前添加过相同属性的约束,在此方法内可以更新此属性的值
2)如果之前缺少约束,再次方法上可以添加约束
3)如果之前不缺少约束,添加新的约束,可能造成约束冲突
3.删除约束
1)方法内容空,会删除之前添加的约束
2)先删除之前的约束,在添加新的约束
4.修改约束来实现控件的动画效果:
// 更改控件的约束不会立即的更改到控件的frame所以把更改约束的代码放在动画中, 是没有动画效果
// 每次让blueView的顶部约束+= 20;
self.blueTop.constant += 20;
[UIView animateWithDuration:2.0 animations:^{
// 调用此方法会让控制器view及内部所有的子控件立即去根据当前的约束,调整子控件的frame
// 谁来调用此方法会去更新谁及它里面所有子控件的frame
[self.view layoutIfNeeded];
}];
KVC(Key Value Coding)键值编码:
1.示例如下:
1)KVC可以给只读属性赋值;
2)KVC可以给真私有属性赋值;
3)KVC可以给间接属性赋值:
2.KVC在数组中的使用(批处理赋值):
3.KVC在字典中的使用(字典转模型):