AutoLayout 详解

一、适配基础准则:

1、在一些比较简单、固定的界面。比如登录、注册或者其他只是进行内容展示的界面使用XIB、StoryBoard开发起来会更简单快一些,这个时候我们也应该使用XIB、StoryBoard开发。

2、在一些复杂、控件较多和功能多的界面尽量使用代码进行布局开发。因为控件多功能复杂的界面如果使用XIB、StoryBoard。那么通过拉线的形式添加约束布局,大家应该都有经历过,一个XIB里拉满了密密麻麻的约束线,可以肯定的是过不了多久连自己都看晕了。如果这个模块要交给第二个人维护,那么这些密密麻麻的约束线肯定是一个让人头疼的问题。因为XIB中约束过多的话,首先可读性是非常差的,带来的后续问题是开发思路不清晰、维护难。

3、需要复用的模块尽量使用代码布局。如果使用XIB、StoryBoard则无法很好的对代码模块进行复用。


二、布局技巧

约束主要分为以下几种(欢迎补充):

(1)相对于父 view 的约束。如:距离上边距 10,左边距 10。

(2)相对于前一个元素的约束。如:距离上一个元素 20,距离左边的元素 5 等。

(3)对齐类约束。如:跟父 view 左对齐,跟上一个元素居中对齐等。

(4)相等约束:.如:跟父 view 等宽。


双视图妙用:懒得天天写 @pro(nontimic,strong)。command+alt+enter 打开双视图窗口  command+ enter 回到标准窗口。打开双视图,如果是控件连接,按住contol+鼠标,如果是方法直接用鼠标。

control键妙用:从父view空白处往当前控件、从一个控件拖往另外一个控件、从当前控件往当前控件。

三等分:  

(1)固定宽高,中间间距进行三等分。     

方案1:用等宽View代替间距。

方案2:纯代码写。https://my.oschina.net/u/1418722/blog/353437

方案3:直接界面布局,除了方案一,貌似其他方案了。

(2)间距固定,宽不固定。

方案1:第一个元素距离左边一定距离;最后一个元素距离右边一定距离;三者高度都固定,宽度相等。1和2、2和3的横向间距固定。

(3)约束优先级用处

三个view     第一个view 距离第二个view  20px,第二距离第三个view 也是20px。如果删除第二个view。 可以设置 第三个view距离第一个view 也是20px。不过优先级 要比 第三个距离第二个弱。

(4)multiplier用处

使用multiplier来进行布局,即百分比布局是最佳选择。

(5)ratio用处

有一些横竖屏。或者 不同屏幕要保持同样的款高比,就需要用到了。


三.masonry

万能公式 firstitem=seconditemt*multiplier+constvalue;

mas_equalTo 尽量都是用这个。

[self.lbl10 mas_makeConstraints:^(MASConstraintMaker*make) {

//make.left.equalTo(self.lbl7.mas_left).offset(0);

//make.top.equalTo(self.lbl7.mas_top).offset(40);

//

//make.width.equalTo(self.lbl7.mas_width);

//make.height.equalTo(self.lbl7.mas_height);

//同等代码

make.left.equalTo(self.lbl7).offset(0);

make.top.equalTo(self.lbl7).offset(40);

make.width.equalTo(self.lbl7);

make.height.equalTo(self.lbl7);

//make.width.mas_equalTo(100);

//make.height.mas_equalTo(21);

//同等代码1

//make.width.equalTo(@100);//equalTo支持对象。所有必须包装成对象

//make.height.equalTo(@21);

//同等代码2

//make.size.mas_equalTo(CGSizeMake(100,21));

//make.top.equalTo(self.lbl7.mas_top).offset(40);

//同等代码

//make.top.equalTo(self.lbl7.mas_top).multipliedBy(1.0).offset(40);//跟上面那句一样万能公式

}];


//删除之前的约束,重新建立约束慎用

[self.lbl10 mas_remakeConstraints:^(MASConstraintMaker*make) {

}];

//更新约束

[self.lbl10 mas_updateConstraints:^(MASConstraintMaker*make) {

}];


4.约束优先级是改变不了。不能一会高一会低。

一开始就确定好。那比如 cell 有没有 图片。没有图片隐藏图片,cell 高度也要自动减少的处理。 可以把图片imageview的高度改为0.


5.笔者也推荐大家使用Masonry时,使用mas_left/mas_right,但是使用xib/storyboard上的约束时,使用heading/trailing最多。效果是一样。


6.setNeedsLayout和layoutIfNeeded 区别

- (void)setEdgeInsets:(UIEdgeInsets)edgeInsets {

_edgeInsets = edgeInsets;

[self setNeedsLayout];//Indicates that the view needs to be laid out

//at next update or at next call of layoutIfNeeded,

//whichever comes first

[self layoutIfNeeded];//Calls layoutSubviews if flag is set

}

这里强化一下,next update cycle的概念,例如两个视图控制器A,B,正在显示A视图,如果B视图需要刷新绘图或者布局,那么,iOS基于优化的角度,不会马上更新B视图,而是在适当的时机更新B视图。


⚠ 1.修改tableView的tableHeaderView界面时,界面并不能及时刷新,可手动调用layoutIfNeeded 此时view高度为理想高度

2.tableViewHeader高度变化时,界面也不能及时刷新 需要重新将headerView设置为tableView的tableHeaderView,界面即可正确显示了

3.当然,使用auto layout时,约束条件必须充分 才能计算出正确高度哦^^

你可能感兴趣的:(AutoLayout 详解)