首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NSAttributedString的boundingRectWithSize返回错误的大小

NSAttributedString的boundingRectWithSize返回错误的大小
EN

Stack Overflow用户
提问于 2012-11-29 15:48:50
回答 19查看 130.3K关注 0票数 158

我正在尝试获取一个属性字符串的rect,但是boundingRectWithSize调用没有考虑到我传入的大小,并且返回一个单行高度的rect,而不是一个很大的高度(它是一个很长的字符串)。我在下面的代码中尝试了传入一个非常大的高度值和0,但返回的rect总是相同的。

代码语言:javascript
复制
CGRect paragraphRect = [attributedText boundingRectWithSize:CGSizeMake(300,0.0)
  options:NSStringDrawingUsesDeviceMetrics
  context:nil];

这是不是坏了,或者我需要做一些其他的事情来让它返回一个包装文本的rect?

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2013-03-14 09:48:30

看起来你没有提供正确的选项。对于包装标签,至少要提供:

代码语言:javascript
复制
CGRect paragraphRect =
  [attributedText boundingRectWithSize:CGSizeMake(300.f, CGFLOAT_MAX)
  options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
  context:nil];

注意:如果原始文本宽度小于300。f将不会有换行,因此请确保装订大小正确,否则仍然会得到错误的结果。

票数 322
EN

Stack Overflow用户

发布于 2014-12-04 16:25:37

由于某些原因,boundingRectWithSize总是返回错误的大小。我想出了一个解决方案。有一个用于UItextView -sizeThatFits的方法,它返回文本集的适当大小。因此,不使用boundingRectWithSize,而是创建一个具有随机帧的UITextView,并使用相应的宽度和CGFLOAT_MAX高度调用其sizeThatFits。它返回具有适当高度的大小。

代码语言:javascript
复制
   UITextView *view=[[UITextView alloc] initWithFrame:CGRectMake(0, 0, width, 10)];   
   view.text=text;
   CGSize size=[view sizeThatFits:CGSizeMake(width, CGFLOAT_MAX)];
   height=size.height; 

如果你在while循环中计算大小,不要忘了在自动释放池中添加,因为将有n个UITextView创建,如果我们不使用自动释放池,应用程序的运行时内存将增加。

票数 51
EN

Stack Overflow用户

发布于 2015-09-28 14:31:44

我在这些建议中没有任何一个是幸运的。我的字符串包含unicode项目符号,我怀疑它们会在计算中造成麻烦。我注意到UITextView可以很好地处理绘图,所以我希望利用它的计算。我做了以下工作,这可能没有NSString绘图方法那么理想,但至少它是准确的。与仅仅为了调用-sizeThatFits:而初始化UITextView相比,它也稍微更优化一些。

代码语言:javascript
复制
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(width, CGFLOAT_MAX)];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[layoutManager addTextContainer:textContainer];

NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:formattedString];
[textStorage addLayoutManager:layoutManager];

const CGFloat formattedStringHeight = ceilf([layoutManager usedRectForTextContainer:textContainer].size.height);
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13621084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档