在我的应用程序中,我需要根据其文本内容动态更改某些视图的大小。起初我-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 像素并且包含的单词比应有的多。
很抱歉描述太长,这是我的问题:
- 也许使用 CT 框架来测量一个简单的字符串是一种浪费,那么有没有办法让 -sizeWithFont 可以安全地在后台使用?
- 如果 的行为
CTFramesetterSuggestFrameSizeWithConstraints()
是设计使然,有没有办法让 CT 功能严格遵守我的约束?如果没有,我如何测量具有固定宽度的字符串并且换行模式是自动换行?