boundingRectWithSize不尊重文字换行

我创build一个UITextView,添加文本,并把它放在视图(与容器)

UITextView *lyricView = [[UITextView alloc] initWithFrame:screen]; lyricView.text = [NSString stringWithFormat:@"\n\n%@\n\n\n\n\n\n", lyrics]; [container addSubview:lyricView]; [self.view addSubview:container]; 

然后我得到它的大小用于一个button,并将其添加到UITextView

 CGRect size = [lyrics boundingRectWithSize:CGSizeMake(lyricView.frame.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[lyricView font]} context:nil]; UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [doneButton setFrame:CGRectMake(56, size.size.height + 55, 208, 44)]; [doneButton setTitle:@"Done" forState:UIControlStateNormal]; [lyricView addSubview:doneButton]; 

这在大多数情况下工作 。 这将尊重\换行符(就像我在我的stringWithFormat中添加),但它不会尊重由文本视图自动添加的文字换行。 所以如果lyrics有一行不适合在屏幕上,UITextView将包装它(因为它应该),但现在size略短于它应该是因为它不尊重文本视图包装。

您可以通过boundingRectWithSize来以字换行模式处理string。 您必须将NSParagraphStyle属性添加到attributes参数,其lineBreakMode设置为NSLineBreakByWordWrapping 。 所以:

 NSMutableDictionary *attr = [NSMutableDictionary dictionary]; // ...whatever other attributes you need... NSMutableParagraphStyle *paraStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; paraStyle.lineBreakMode = NSLineBreakByWordWrapping; [attr setObject:paraStyle forKey:NSParagraphStyleAttributeName]; 

然后使用attr作为boundingRectWithSize的属性参数。

你可以很容易地扩展/概括这种技术来阅读其他属性,包括现有的段落风格属性,从任何来源是合理的。

应该使用(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)作为options参数。

做了更多的研究,最终find了这个 。

 CGSize textSize = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, FLT_MAX)]; CGFloat textHeight = textSize.height; 

希望这可以帮助那里的人!