一、适配基础准则:
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时,约束条件必须充分 才能计算出正确高度哦^^