在开发中,我们都会选择使用Masonry来做适配,但是有时我们又需要获取某个控件的frame,这时就会发现用Masonry布局的获取不到控件的frame。
这是因为用Masonry布局时控件的还没有在视图上展示出来,所以frame也就没有了,具体原理就得看Masonry实现的原理了,单用frame布局的就会有。
这时如果我们需要获取到frame的话就得刷新视图
这个方法将会刷新视图。在这个方法后就能获取frame
想要再深入了解的可以点这个链接看看
如果需要马上刷新可以在LayoutIfNeeded前加上setNeedsLayout
如果仅仅是想获取frame直接用layoutIfNeeded就可以了
这都2017年了还在用frame布局实在是有点low了。。。
Autolayout自iOS6开始引入,到现在基本上也没什么坑了,就算有,前辈们也都填好了( ??? .? ??? )?
我理解的自动计算cell高度,有两个注意点:
第一: 设置tableView.estimatedRowHeight
self.tableView.estimatedRowHeight = 20
第二: 设置约束,保证cell的contentView的高度可以根据子控件算出来
例如以下只有一个label填充的cell(cell的结构-》cell--contentView--label)
只需要给label添加以下约束:
cell就可以自动计算自己的高度
下面的是我的想法过程,大家可以略过:
一开始的时候想的是给label一个高度小于等于120的约束,并且持有它
make.height.lessThanOrEqualTo(@120)
折叠的时候,把约束install,展开的时候uninstall。
实现起来:每次在TableView的cell点击代理方法里面 调用cell的方法使label高度的约束install和uninstall,然后调用 ;
后来发现和这个约束有冲突
make.bottom.equalTo(_contentLabel.superview.mas_bottom).with.offset(-20) ,作为强迫症患者这能忍?。
然后突然想到label的numberOfLines可以限制行数......这不就是现成的实现折叠/展开的最好方法吗...
test-autolayoutcell
1. Masonry
2. 优化UITableViewCell高度计算的那些事
3. iOS7和iOS8下的自适应cell
Masonry可以设置约束的优先级,优先级分为priorityHigh,priorityMedium,priorityLow(高,中等,低)三个等级。优先级默认为中等,所以当我们对某一个控件的约束条件重复后,会打印警告信息,告诉我们应该去修复它们。
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(@0).priorityHigh();
}];
当你使用masonry进行布局,运行的时候控制台如果有输出约束重复的话,可以用 .priorityHigh()将你想要布局的约束的优先级提高,就不会报约束重复了。
自动布局最重要的是约束:UI元素间关系的数学表达式。约束包括尺寸、由优先级和阈值管理的相对位置。它们是添加剂,可能导致约束冲突 、约束不足造成布局无法确定 。这两种情况都会产生异常。
使用前:AutoLayout关于更新的几个方法的区别
setNeedsLayout:告知页面需要更新,但是不会立刻开始更新。执行后会立刻调用layoutSubviews。
layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。
layoutSubviews:系统重写布局
setNeedsUpdateConstraints:告知需要更新约束,但是不会立刻开始
updateConstraintsIfNeeded:告知立刻更新约束
updateConstraints:系统更新约束
使用
基本使用
mas_makeConstraints:添加约束
mas_updateConstraints:更新约束、亦可添加新约束
mas_remakeConstraints:重置之前的约束
multipler属性表示约束值为约束对象的乘因数, dividedBy属性表示约束值为约束对象的除因数,可用于设置view的宽高比
// 进行屏幕的适配的时候,往往需要根据屏幕宽度来适配一个相应的高度,在此使用如下约束的方式来进行控件的适配
;
[self.topInnerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(self.topView.mas_height).dividedBy(3);
make.width.and.height.lessThanOrEqualTo(self.topView);
make.width.and.height.equalTo(self.topView).with.priorityLow();
make.center.equalTo(self.topView);
}];
priorityLow()设置约束优先级
#define MAS_SHORTHAND_GLOBALS使用全局宏定义,可以使equalTo等效于mas_equalTo
#define MAS_SHORTHAND使用全局宏定义, 可以在调用masonry方法的时候
姓名:
年龄:
电话: