在开发中我们经常会使用到自定义Cell,在对Cell上的子控件进行布局的时候我们会通过计算frame进行布局也会使用masonry进行布局。我通常的做法是使用masonry进行布局,因为使用起来简单、快捷。然而我在使用masonry的时候却遇到了一个问题(之前就发现了,可之前采取了投机取巧的方法解决了问题),在设置一个label的宽度的时候(label的宽度不是固定的,是随着文字的数量而变化的)发现如果cell过多,在滑动tableview的时候有些cell上的label的宽度就会和之前的宽度不一样从而导致label上的文字显示不全,并且masonry还会报警告,警告在设置宽度的时候多了一个约束条件。通过查看这个多出来的约束条件发现可能是由于cell复用的原因,在设置某个cell(复用的)上的label的宽度的时候,之前在缓存池中的cell上的label的宽度也被设置在了这个cell上的label上,所以多了一个宽度的约束条件,具体原因本人还不是很清楚。于是我舍弃了masonry转而通过计算frame来设置label的frame,最后发现通过计算frame的方法并没有使用masonry的问题。
如果有谁看到了这篇文章并知道这个问题的原因以及解决方法希望能在评论中留下您宝贵的答案,谢谢!
(2018.6.22 自给答案:使用Masonry不去设置Label的宽度,让Label上的文字自适应)
有问题的masonry代码:
NSMutableDictionary * startLocDic = [NSMutableDictionary dictionary];
startLocDic[NSFontAttributeName] = font(20);
NSString * startStr = _startLocation.text;
CGFloat startLocW = [startStr boundingRectWithSize:CGSizeMake(MAXFLOAT, 20 * IPHONE6P_W_SCALE) options:NSStringDrawingUsesLineFragmentOrigin attributes:startLocDic context:nil].size.width;
[_startLocation mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(10 * IPHONE6P_W_SCALE);
make.top.equalTo(self.mas_top).offset(14 * IPHONE6P_W_SCALE);
// 设置宽度的代码
make.width.equalTo(@(startLocW)); // 这行代码完全没必要
make.height.equalTo(@(20 * IPHONE6P_W_SCALE));
}];
没问题的计算frame代码:
_startLocation.frame = CGRectMake(10 * IPHONE6P_W_SCALE, 14 * IPHONE6P_W_SCALE, startLocW, 20 * IPHONE6P_W_SCALE);
// startLocW还是之前根据文字计算出来的宽度
增加1:
(利用masonry更改布局,我们需要使用update
代码:
[self.collectionView mas_updateConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(self.view.mas_bottom).offset(-184 / 3 * IPHONEP_W_SCALE);
}];
只需要写需要更改布局的代码即可
)
使用到的一些新的代码:
1.[self.awardsView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.right.bottom.equalTo(self.view);
}]; // 一行代码让一个视图和另一个视图的位置、大小都相同
2.make.width.mas_equalTo(32); // 直接写数字,而不用加@符号.
2018.6.22补充:
使用Masonry的时候我们有时会看到别人使用make.leading.equalTo...和make.trailing.equalTo...,通过查看内部API对应的两个方法分别使用了NSLayoutAttributeLeading和NSLayoutAttributeTrailing,它们是两个枚举值,而我们使用的make.left.equalTo...和make.right.equalTo...同样使用了两个枚举值:NSLayoutAttributeLeft和NSLayoutAttributeRight。使用make.leading.equalTo...和make.left.equalTo...的效果是一样的,left代表左,leading代表前。
2019.1.7补充
Masonry的一个mas_remakeConstraints:...该方法是对视图重新进行约束,它和mas_updateConstraints的区别是mas_remakeConstraints会将之前所有的约束都删除掉,而mas_updateConstraints不会改变之前已有的且没有更新的约束。
本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊