今天在 iOS14 上遇到了 UILabel 高度异常的问题,具体的表现是:系统可能认为文本太多换行了,于是高度约束的值多了一行的高度。如图
文本确实没换行,但正确的情况应该是,Label 宽度明显是足够的,不应该多算一行高度。
当我减少一些字符,小于一个最大临界值时,高度就计算正常了,比如(删掉了一个字符)
具体原因也不想去分析了,解决办法就是自己计算高度,自己修改高度约束
@interface TightLabel : UILabel
@end
@implementation TightLabel
- (void)layoutSubviews {
[super layoutSubviews];
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *obj, NSUInteger idx, BOOL *stop) {
if (obj.firstItem == self && obj.firstAttribute == NSLayoutAttributeHeight) {
NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
style.lineBreakMode = self.lineBreakMode;
style.alignment = self.textAlignment;
CGRect bounds = [self.text boundingRectWithSize:CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:@{ NSFontAttributeName: self.font, NSParagraphStyleAttributeName: style } context:nil];
obj.constant = ceil(bounds.size.height) + 1;
*stop = YES;
}
}];
}
@end
使用自定义的 TightLabel
替代系统的类,高度就不会有问题了