UILabel 高度约束问题

今天在 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 替代系统的类,高度就不会有问题了

你可能感兴趣的:(UILabel 高度约束问题)