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

NSAttributedString的boundingRectWithSize返回错误的大小
EN

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

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

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

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

EN

Stack Overflow用户

发布于 2014-09-20 03:31:27

经过长时间的调查,我的最终决定是:

- boundingRectWithSize函数仅返回连续字符序列的正确大小!如果字符串包含空格或其他东西(被Apple称为“一些字形”)-不可能获得显示文本所需的rect的实际大小!

我已经用字母替换了字符串中的空格,并立即得到了正确的结果。

苹果在这里说:https://developer.apple.com/documentation/foundation/nsstring/1524729-boundingrectwithsize

此方法返回字符串中字形的实际边界。允许某些字形(例如,空格)与传入的大小指定的布局约束重叠,因此在某些情况下,返回的CGRect的大小组件的宽度值可能会超过大小参数的宽度值。

因此,有必要找到另一种方法来计算实际的rect。

经过漫长的调查过程,终于找到了解决方案!我不确定它是否适用于所有与UITextView相关的案例,但主要和重要的事情被检测到了!

当使用正确的矩形时,boundingRectWithSize函数以及CTFramesetterSuggestFrameSizeWithConstraints (和许多其他方法)将计算出正确的大小和文本部分。例如,当在UITextView上绘制文本时,UITextView具有textView.bounds.size.width,并且该值不是系统使用的实际矩形。

我找到了非常有趣的参数,并用代码进行了简单的计算:

代码语言:javascript
运行
复制
CGFloat padding = textView.textContainer.lineFragmentPadding;  
CGFloat  actualPageWidth = textView.bounds.size.width - padding * 2;

魔术作品-我所有的文本现在都计算正确了!享受吧!

票数 30
EN
查看全部 23 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13621084

复制
相关文章

相似问题

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