替代sizeWithFont:方法

时间:2010-03-03 13:05:10

标签: iphone cocoa-touch uikit core-graphics

我有一个类,其工作是将文本解析为多个页面。 我使用sizeWithFont:方法来识别一个页面何时结束而另一个页面何时开始。 但遗憾的是,由于需要解析的文本量非常大,因此需要在后台线程上执行整个操作(需要几秒钟才能完成)。因此,有时候我的界面上会出现视觉伪像(UIKit不是线程安全的,但是我同时从多个线程调用它),我很乐意将其删除。

我需要摆脱在后台线程上使用sizeWithFont:但似乎没有这种方法的替代方案。使用Core Graphics查找文本宽度的唯一方法是使用Apple文档中声明的方法:

  
      
  1. 调用函数CGContextGetTextPosition以获取当前文本位置。
  2.   
  3. 使用CGContextSetTextDrawingMode函数将文本绘制模式设置为kCGTextInvisible。
  4.   
  5. 通过调用CGContextShowText函数绘制文本,在当前文本位置绘制文本。
  6.   
  7. 通过调用函数CGContextGetTextPosition确定最终文本位置。
  8.   
  9. 从结束位置减去起始位置以确定文本的宽度。
  10.   

但我真的担心这会导致巨大的性能损失。

任何人都知道另一种查找文字宽度的方法吗?

1 个答案:

答案 0 :(得分:1)

如果您可以定位iPhone OS 3.2的应用程序,可以查看Core Text

虽然,请注意整个Core Text库也不是完全线程安全的。来自文档:

  

多核注意事项:Core Text中的所有单个函数都是线程安全的。字体对象(CTFont,CTFontDescriptor和关联对象)可以由多个操作,工作队列或线程同时使用。但是,布局对象(CTTypesetter,CTFramesetter,CTRun,CTLine,CTFrame和关联对象)应该在单个操作,工作队列或线程中使用。