这里只针对iOS 7后的动态计算文本宽高方法进行总结,也就是下文中的方法:
// for NSString
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);
以及
// for NSAttributedString
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 6_0);
首先,我们先来讲讲NSString的动态计算宽高的方法
NSString* str = @"这是一个测试文本这是一个测试文本这是一个测试文本这是一个测试文本这是一个测试文本这是一个测试文本这是一个测试文本";
self.label = [[UILabel alloc]init];
/************************这几项会影响最后计算出来的结果********************************/
self.label.lineBreakMode = NSLineBreakByCharWrapping;
self.label.font = [UIFont systemFontOfSize:15];
// self.label.textAlignment = NSTextAlignmentLeft;
self.label.numberOfLines = 0;
/******************************************************************************/
self.label.layer.borderWidth = 1;
self.label.layer.borderColor = [[UIColor lightGrayColor] CGColor];
self.label.textColor = [UIColor darkGrayColor];
self.label.text = str;
NSDictionary* dic = @{NSFontAttributeName:[UIFont systemFontOfSize:15]};
CGRect rect = [self.label.text boundingRectWithSize:CGSizeMake(200, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:dic context:nil];
self.label.frame = CGRectMake(100, 100, rect.size.width, rect.size.height);
[self.view addSubview:self.label];
特别注意上面所说的几项影响最后计算出来的宽高的因素,例如一开始我就因为没有指定label
的字体大小,导致显示一直有问题,找了半天才找到。
其次,我们先来讲讲NSAttributedString的动态计算宽高的方法
//设置一个段落格式
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.lineSpacing = 10;
paragraph.firstLineHeadIndent = 20.f;
NSDictionary* dic = @{NSFontAttributeName:[UIFont systemFontOfSize:15],NSForegroundColorAttributeName:[UIColor darkGrayColor],NSParagraphStyleAttributeName:paragraph};
self.label = [[UILabel alloc]init];
self.label.layer.borderWidth = 1;
self.label.layer.borderColor = [[UIColor lightGrayColor] CGColor];
self.label.lineBreakMode = NSLineBreakByCharWrapping;
self.label.numberOfLines = 0;
self.label.text = @"这是一个测试文本\n这是一个测试文本这是一个测试文本这是一个测试文本这是一个测试文本这是一个测试文本这是一个测试文本";
NSRange allRange = NSMakeRange(0, self.label.text.length);
[self.view addSubview:self.label];
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:self.label.text];
[attrStr addAttributes:dic range:allRange];
//NSMutableAttributedString的动态计算宽高方法
CGRect rect = [attrStr boundingRectWithSize:CGSizeMake(200, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading context:nil];
self.label.frame = CGRectMake(100, 100, rect.size.width, rect.size.height);
self.label.attributedText = attrStr;