我建造的这种方法完美地用英语表达。
现在我也试图支持希伯来语,boundingRectWithSize
错过了高度(给了我太短的东西)
无法弄清楚原因......
+ (void) setTextAndFitLabel:(UILabel *)label text:(NSString *)text
{
[label setNumberOfLines:0];
text = [text stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];
[label setText:text];
NSDictionary *attributes = @{NSFontAttributeName: label.font};
CGRect rect = [label.text boundingRectWithSize:CGSizeMake(label.frame.size.width, CGFLOAT_MAX )
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:attributes
context:nil];
if ([text isEqualToString:@""])
{
rect = CGRectMake(0,0,0,0);
}
CGRect labelFrame = label.frame;
labelFrame.size.height = ceil(rect.size.height);
NSArray *constraints = [label constraints];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", NSLayoutAttributeHeight];
NSArray *filteredArray = [constraints filteredArrayUsingPredicate:predicate];
if(filteredArray.count == 0){
label.frame = labelFrame;
}
else
{
NSLayoutConstraint *heightConstraint = [filteredArray objectAtIndex:0];
heightConstraint.constant = ceil(rect.size.height);
}
}
答案 0 :(得分:0)
-boundingRectWithSize
只计算打印文本所需的空间量
当您询问UI/Label/TextView/Textfield
的大小时,您应该考虑它们是具有特定属性的视图,例如UITexView在打印文本之前包含一些插入。
在之后分配文本调用-sizeToFit
或-sizeThatFits:
之后,请求其框架
我不知道你为什么需要这个,但值得一提的是,UILabel内在内容大小是在完全显示的指定文本上计算的。