UILabel 自适应高度

UILabel 文字自适应高度

  • 原理: 因为在 ArticleView 对应的 xib 文件中,设置了其他控件的自动布局, 但是当 ArticleView 创建的 view 对象添加到 contentLabel 的时候, 却因为 view 与 contentLabel 没有自动布局约束, 导致 view 中的布局不能生效.
  • 解决思路:
    • 1.通过设置 view 的 frame 相应的值, 设置 frame 的值,强行将 view 的内容压缩在 frame 的高度中.
    • 2 将缺少的 view 与 contentView 的自动布局加上, 达到自动布局生效的效果.

解决方法:

  • 使用 [label sizeThatFits:] 方法
// contentSize 保存的是根据 contentView 的宽度, 不限制的高度, 创建的一个 size 对象
CGSize contentSize = CGSizeMake(CGRectGetWidth(self.contentView.frame), CGFLOAT_MAX);
// view.contentLabel 中已经设置了文字, 使用 sizeThatFits 方法求出一个 CGSize 值, 取出其中的 height.
CGFloat contentHeight = [view.contentLabel sizeThatFits:contentSize].height;
  • 使用 [NSString boundingRectWithSize: options: attributes: context:] 方法
CGFloat contentHeight = [view.contentLabel.text boundingRectWithSize:CGSizeMake(CGRectGetWidth(self.contentView.bounds) - 46.f, CGFLOAT_MAX)
                                                options:NSStringDrawingUsesLineFragmentOrigin
                                                attributes:@{NSFontAttributeName:view.contentLabel.font}
                                                context:nil].size.height;
  • 使用 [label systemLayoutSizeFittingSize:] 方法
// 先设置 contentLabel 能显示的最大宽度
view.contentLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.contentView.bounds) - 46;
// 获取 label 对最大宽度的适应 size, 取出 height 值
// UILayoutFittingCompressedSize 在 label 的内容限制中最小化 label 高度
// UILayoutFittingExpandedSize 在压缩范围内最大化 label 的高度
CGFloat contentHeight = [view.contentLabel systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect frame = CGRectMake(0, CGRectGetMaxY([self.contentView.subviews lastObject].frame)+12, CGRectGetWidth(self.contentView.frame), contentHeight+39);
[view setFrame:frame];
  • 使用 autolayout 进行自动布局
// 关闭 view 和 contentView 自带的 AutoresizingMask
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.contentView setTranslatesAutoresizingMaskIntoConstraints:NO];

// 这里 [self.contentView.subviews lastObject] 代表的是已经添加到 contentView 中的视图
// view 表示还为添加到 contentView 中的视图
CGFloat topConstraintY = CGRectGetMaxY([self.contentView.subviews lastObject].frame);
[self.contentView addSubview:view];
NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:view
                                        attribute:NSLayoutAttributeTop
                                        relatedBy:NSLayoutRelationEqual
                                        toItem:self.contentView
                                        attribute:NSLayoutAttributeTop
                                        multiplier:1
                                        constant:topConstraintY + 12];
NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:view
                                        attribute:NSLayoutAttributeLeft
                                        relatedBy:NSLayoutRelationEqual
                                        toItem:self.contentView
                                        attribute:NSLayoutAttributeLeft
                                        multiplier:1
                                        constant:10];
NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:view
                                        attribute:NSLayoutAttributeRight
                                        relatedBy:NSLayoutRelationEqual
                                        toItem:self.contentView
                                        attribute:NSLayoutAttributeRight
                                        multiplier:1
                                        constant:-10];
[self.contentView addConstraints:[NSArray arrayWithObjects:topConstraint, leftConstraint, rightConstraint, nil]];

你可能感兴趣的:(UILabel 自适应高度)