YYKit icon indicating copy to clipboard operation
YYKit copied to clipboard

YYLabel 在Autolayout下的一些问题。

Open boyxu opened this issue 8 years ago • 10 comments

YYLabel 在Autolayout下的一些问题。

与UILabel相比,貌似YYLabel在自动布局下面有缺陷。 测试的字符串里本身也包含换行符

我写在这里了,大神可以看下: UILabel与YYLabel的对比测试

boyxu avatar Jun 02 '16 09:06 boyxu

YYLabel 需要设置一下 preferredMaxLayoutWidth,UILabel 在 iOS7 以上一般就不用设置这个值了。

ibireme avatar Jun 02 '16 16:06 ibireme

preferredMaxLayoutWidth 这个值在UILabel中的作用感觉不是必须的,更多的辅助类的。一般实际开发中,这个值也是需要手动计算的,如果完全依靠这个值来确定,觉得不太符合Autolayout设计理念。 既然UILabel可以不依赖这个值,我觉得YYLabel也可以不依赖这个。回头仔细研究下。

boyxu avatar Jun 02 '16 18:06 boyxu

iOS6 下,UILabel 是必须要设置这个值的。。在高版本上,AutoLayout 会尝试自动合成,但有时 UILabel 自动布局有问题时也需要手动设置这个值。

ibireme avatar Jun 02 '16 18:06 ibireme

一般情况下,preferredMaxLayoutWidth 这个值应该与Label的宽度相等,也就是说,iOS7以后,如果约束符合条件,Label内部会默认处理preferredMaxLayoutWidth 等于Label的宽度。 可以这样理解吗?

boyxu avatar Jun 02 '16 18:06 boyxu

autolayout 需要 label 提供一个 size,但这时内部为了计算 size,首先需要一个最大宽度来做限制。苹果的文档写着,内部这时候不应该访问自身的 frame 属性,因为这时候 frame 还有待 autolayout 来确定,所以这时候也不能直接用 label 的宽度。

至于 UILabel 做了什么改动这个就不清楚了,我觉得可能与 autolayout 有内部的配合流程。

ibireme avatar Jun 03 '16 01:06 ibireme

@boyxu 测试过 UILabel 在 iOS 8 也需要设置 preferredMaxLayoutWidth 否则布局和计算高度都会有问题,以及,设置这个值必须在 -updateConstraint-layoutSubviews 之前,否则也会有问题,iOS 9 上就不需要了,这个应该是 UILabel 在后面有调整了

noark9 avatar Jun 21 '16 19:06 noark9

@noark9 在iOS8.4的模拟器上测试了下,UILabel 依然是正确的,不需要设置preferredMaxLayoutWidth,没有iOS8.4的模拟器和设备,所以iOS8.4之下的系统不确定是否正常。

boyxu avatar Jun 22 '16 07:06 boyxu

@boyxu iOS8.4真机,不设置preferredMaxLayoutWidth,高度计算有误差,会导致label不折行!

feihuang89 avatar May 25 '17 02:05 feihuang89

@ibireme 大神,你好,我最近也在用yylabel, 我的系统iOS版本是11.2, 不设置preferredMaxLayoutWidth,依然无法换行,请问是不是我哪里用得不对? 请指导。

代码如下:

YYLabel *label = [[YYLabel alloc] init];
label.numberOfLines = 0;
label.text = @"sdfsldfljsflsdfsldfljsfsdfsldfljsfsdfsldfljsfsdfsldfljsfsdfsldfljsfsdfsldfljsfsdfsldfljsfsdfsldfljsfsdfsldfljsfsdfsldfljsfsdfsldfljsf";
[self.view addSubview:label];
[label mas_makeConstraints:^(MASConstraintMaker *make) {
     make.top.mas_equalTo(self.view).offset(100);
     make.left.right.mas_equalTo(self.view);
}];

luoshiyutim avatar Aug 02 '18 07:08 luoshiyutim

@luoshiyutim YYLabel 需要设置 preferredMaxLayoutWidth ,UILabel 不用

ZenonHuang avatar Feb 14 '19 01:02 ZenonHuang