gpt4 book ai didi

ios - boundingRectWithSize 不考虑自动换行

转载 作者:技术小花猫 更新时间:2023-10-29 11:01:23 24 4
gpt4 key购买 nike

我创建一个 UITextView,向其中添加文本,然后将其放入 View (带有容器)

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 中添加的那样)但它不会尊重 TextView 自动添加的自动换行。因此,如果 lyrics 有一行不适合屏幕,UITextView 将把它换行(正如它应该的那样),但 size 现在比它应该的略短是因为它不尊重 TextView 换行。

最佳答案

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

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

关于ios - boundingRectWithSize 不考虑自动换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20602491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com