换行文本时的 CTFramesetterSuggestFrameSizeWithConstraints

发布于 2025-01-03 10:13:55 字数 766 浏览 0 评论 0原文

我在使用 CoreText 时遇到了“先有鸡还是先有蛋”的问题。

我需要知道 NSAttributedString 当它包裹在图像周围时将占用的 CGSize 。 我有一个 UITableView,在右上角显示文本和图像。 在我的模型上,我存储 CTFrameSetterRef,即我一次计算一次 我的模型实体加载后将 cellForRowAtIndexPath 中的 CTFrameSetterRef 传递给我的单元格。

我还使用我的frameSetter 和 CTFramesetterSuggestFrameSizeWithConstraints 预先计算单元格的高度 这很简单,我现在有一个对象数组,这些对象有一个要渲染的 AttributedString、一个用于渲染它们的框架设置器和一个高度,以便 tableView 在更新单元格之前知道这一点。

现在我想将文本环绕在右上角的图像周围。 当我想预先计算值时,这会带来一些问题。

据我所知,我需要一个 CTFrameSetter 来计算大小 (使用 CTFramesetterSuggestFrameSizeWithConstraints)。 如果我的框架是矩形,这只会给我尺寸 - 如果我想包裹文本,我需要创建一个路径并设置它的尺寸 - 但这是在我知道尺寸之前! 然后我需要将 Path 添加到字典并使用字典构建 CTFrameRef。

我的问题是,如果我的属性文本环绕在图像周围,如何预先计算单元格的高度?

I am experiencing 'chicken or the egg' problems with CoreText.

I need to know the CGSize an NSAttributedString will take up when it is wrapped around an image.
I have a UITableView that displays text and an image in the top right corner.
On my model I store the CTFrameSetterRef, i.e. I calculate this once for all
my model entities when they load and then pass my cell a CTFrameSetterRef in cellForRowAtIndexPath.

I also pre-calculate the height of the cell by using my frameSetter and CTFramesetterSuggestFrameSizeWithConstraints
This is straight forward, I now have an array of objects that have an AttributedString to render, a frameSetter to render them with and a height so the tableView knows this before updating the cell.

Now I would like to wrap the text around the image in the top right corner.
This presents some problems when I want to pre-calculate the values.

As far as I can figure out I need a CTFrameSetter to calculate a size
(using CTFramesetterSuggestFrameSizeWithConstraints).
This only gives me the size if my frame is rectangular - If I want to wrap the text I need to create a Path and setting it's size - but this is before I know the size!
Then I need to add the Path to a dictionary and build the CTFrameRef with the dictionary.

My question is how do I pre-calculate the height for my cell, if my attributed text is wrapped around an Image?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

尛丟丟 2025-01-10 10:13:55

您需要逐行布局:

  1. 使用宽度限制布局第一行,并使用 CTFramesetterSuggestFrameSizeWithConstraints 获取行高和 fitRange
  2. 将第二行布局在第一行下方,并具有适当的宽度限制 - 根据前一行的高度和您想要的间距,您可以计算当前行的 origin.y,您可以使用它来确定该行是否会与图像,在最后一个 fitRange 末尾继续。
  3. 继续…

You need to layout line by line:

  1. Layout the first line with the width limit and get line height and fitRange using CTFramesetterSuggestFrameSizeWithConstraints.
  2. Layout the second line below the first one, with the proper width limit — from the heights of preceding lines and the spacing you want you can calculate the origin.y of the current line which you use to figure out whether this line will run against the image, continuing at the end of last fitRange.
  3. Go on…
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文