我创建一个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
现在比它应该略短,因为它不尊重它文本视图换行。
答案 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;
希望这有助于那里的人!