CTFramesetterSuggestFrameSizeWithConstraints返回超出约束的宽度?

时间:2012-12-05 08:47:35

标签: objective-c multithreading core-text sizewithfont

在我的应用中,我需要根据文本内容动态更改某些视图的大小。首先,我使用-sizeWithFont进行字符串测量。我的应用程序中有很多测量值,因此我将-sizeWithFont放入后台,因为Apple的文档说“在iOS 10.4及更高版本中,您可以在应用程序的辅助线程中使用此类扩展中描述的方法而不只是来自主线程。“但事实是,这个方法会调用一些非线程安全的WebCore函数,因此app会崩溃。此错误已经提交但仍未修复。 (有关此问题的一些问题,例如sizeWithFont in MultiThread Crash!

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

很抱歉有详细说明,这是我的问题:

  1. 也许使用CT框架来测量一个简单的字符串是一种浪费,所以 有没有办法让-sizeWithFont可以在后台使用 安全
  2. 如果CTFramesetterSuggestFrameSizeWithConstraints()的行为是设计的,那么 有什么方法可以使CT功能严格遵守我的约束? 如果没有,我如何测量具有固定宽度的弦和 linebreakmode是wordwrapping吗?

1 个答案:

答案 0 :(得分:0)

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