2

在我的应用程序中,我需要根据其文本内容动态更改某些视图的大小。起初我-sizeWithFont用来做字符串测量。在我的应用程序中有很多测量要做,所以我把它-sizeWithFont放到了后台,因为苹果的文档说“在 iOS 10.4 及更高版本中,你可以从应用程序的辅助线程中使用此类扩展中描述的方法,而不仅仅是来自主线程。”。然而,事实是这个方法会调用一些不是线程安全的 WebCore 函数,所以应用程序会崩溃。此错误已提交,但仍未修复。(有关此的一些问题,例如MultiThread Crash 中的 sizeWithFont!

由于性能问题,我无法将测量结果放入主线程,因此我正在尝试 CoreText 框架。我首先为我的字符串创建一个对应项NSAttributedString,然后使用一些 CT 函数进行测量。我知道在 iOS 6 中,有非常简单的 API,比如-size可以完成这项工作,但由于兼容性,我无法使用它们。CTFramesetterSuggestFrameSizeWithConstraints()所以我不得不调用一些像or这样的低级函数CTFramesetterCreateFrame(),但我发现这些CT 方法有时不尊重我的约束例如,如果我CGSize(200, CGFLOAT_MAX)为设置 a CTFramesetterSuggestFrameSizeWithConstraints(),这应该意味着宽度有一个约束,但实际上它会返回一些具有更大宽度的尺寸,例如 205。同样的事情发生在CTFramesetterCreateFrame(). 如果我调用它然后调用CTFrameGetLines(),我有时会得到一个少于应有的行数,因为某些行的宽度超过 200 像素并且包含的​​单词比应有的多。

很抱歉描述太长,这是我的问题:

  1. 也许使用 CT 框架来测量一个简单的字符串是一种浪费,那么有没有办法让 -sizeWithFont 可以安全地在后台使用?
  2. 如果 的行为CTFramesetterSuggestFrameSizeWithConstraints()是设计使然,有没有办法让 CT 功能严格遵守我的约束?如果没有,我如何测量具有固定宽度的字符串并且换行模式是自动换行?
4

1 回答 1

0

使用 CTFramesetterSuggestFrameSizeWithConstraints(),并在返回结果大小之前尝试将 result.width 参数设置为约束大小的宽度。

于 2013-01-10T11:30:26.200 回答