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;
希望这可以帮助那里的人!