boundingRectWithSize不尊重自动换行

时间:2013-12-16 02:23:06

标签: ios uitextview frame

我创建一个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];

然后我获得它的大小以便与按钮一起使用并将其添加到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];

这适用于大多数情况。这将遵循\ n换行符(就像我在stringWithFormat中添加的那样),但它不会尊重由文本视图自动添加的自动换行。因此,如果lyrics有一条不适合屏幕的行,UITextView将包装它(正如它应该的那样),但size现在比它应该略短,因为它不尊重它文本视图换行。

3 个答案:

答案 0 :(得分:6)

您可以告诉boundingRectWithSize以自动换行模式处理字符串。您必须在attributes参数中添加NSParagraphStyle属性,并将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的属性参数。

您可以轻松地扩展/概括此技术,以便从任何有意义的来源中读取其他属性,包括现有的段落样式属性。

答案 1 :(得分:6)

(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)参数应使用options

答案 2 :(得分:3)

做了一些更多的研究,最终找到了this

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

希望这有助于那里的人!