字符串动态计算控件的高度的方法对于 UILabel 和 UITextView 来说是不同的,UITextView 上左下右都有一个 8px 的 padding,使用计算 UILabel 的方法来算 UITextView 的高度,得到的高度是偏小的,上下各少了 8px。
UILabel:
- (void)createLabel
{
CGSize labelSize = [self getLabelSizeWithString:labelString andFontSize:15 andMaxFrameWidth:self.view.frame.size.width];
UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(0, 64, labelSize.width, labelSize.height);
label.font = [UIFont systemFontOfSize:15];
label.backgroundColor = [UIColor redColor];
label.text = labelString;
label.textAlignment = NSTextAlignmentLeft;
label.numberOfLines = 0;
[self.view addSubview:label];
}
/*!
* 根据字符串动态计算UILabel的高度
*
* @param text 字符串
* @param fontSize font
* @param width 1、如果是定宽则传入UILabel预设的宽度(此种情况可能是多行) 2、如果只有一行,则高度有我们自己设定,但是宽度需要动态计算,此时可传入CGFLOAT_MAX
*
* @return UILabel实际frame的宽高
*/
- (CGSize)getLabelSizeWithString:(NSString*)text andFontSize:(int)fontSize andMaxFrameWidth:(float)width
{
CGRect textRect = [text boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}
context:nil];
/*!
* 其实算出来的textRect的宽度是不准的,高度是准的;
* 如果需求是第1中情况下面是用来重设label宽度的代码;
* 第二种情况在一下判断条件中永远不会成立因为width足够大。
*/
CGSize stringSize = [text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}];
if(stringSize.width >= width)
{
textRect.size.width = width;
}
return textRect.size;
}
UITextView:
/*!
* 一定要先赋值textView.text然后才能计算
* API sizeThatFits 注释: return 'best' size to fit given size. does not actually resize view. Default is return existing view size
*/
- (void)createTextView
{
CGFloat textViewWidth = self.view.frame.size.width;
UITextView *textView = [[UITextView alloc]init];
textView.text = textViewString;
textView.frame = CGRectMake(0, 200, textViewWidth, [self getTextViewheightForString:textView andWidth:textViewWidth]);
textView.font = [UIFont systemFontOfSize:15];
textView.backgroundColor = [UIColor redColor];
[self.view addSubview:textView];
}
- (float)getTextViewheightForString:(UITextView *)textView andWidth:(float)width
{
CGSize sizeToFit = [textView sizeThatFits:CGSizeMake(width, CGFLOAT_MAX)];
return sizeToFit.height;
}