首页 > 技术文章 > 自动布局

wangdjblogs 2016-05-26 22:35 原文

自动布局(屏幕适配)

一 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在字典中的使用(字典转模型):

 

推荐阅读