iPhone SDK:你如何测量使用Quartz的string的宽度和高度?

在我问我的问题之前,这是从苹果的文档重新:如何确定使用Quartz的string的宽度:

如果文本测量对您的应用程序非常重要,则可以使用Quartz 2D函数来计算它们。 但是,您可能首先考虑使用ATSUI,其优势在于文本布局和测量。 ATSUI有几个function可以获取文本指标。 您不仅可以获得布局之后的文本指标,而且在极less数情况下,您可以获取布局之前的文本指标。 与Quartz不同,您必须自己执行计算,ATSUI将为您计算测量值。 例如,您可以通过调用ATSUI函数ATSUMeasureTextImage获取文本的图像边界矩形。

如果您认为Quartz文本比ATSUI(或Cocoa)更适合您的需求,您可以按照以下步骤在Quartz绘制之前测量文本的宽度:

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

这是我的问题:

  1. 这真的是使用Core Graphics来确定string宽度的最好方法吗? 这看起来很脆弱,因为我的文本与2Dgraphics元素共存,所以我想为所有渲染使用相同的上下文。 我希望能有一些简洁的方法,比如:

    CGContextGetTextWidthAndHeight(context,text);

  2. 我看到ATSUI已经过时了,将被核心文本取代。 这是真的,如果是的话,它在iPhone SDK吗?

在iPhone SDK上, NSString上有一些方法可以提供你想要的。

从iOS 7.0开始, 这些方法是 :

 - boundingRectWithSize:options:attributes:context: - sizeWithAttributes: 

在旧版本的iOS上,我们已经有了这些,现在已经弃用了:

 – sizeWithFont: – sizeWithFont:forWidth:lineBreakMode: – sizeWithFont:constrainedToSize: – sizeWithFont:constrainedToSize:lineBreakMode: – sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 

在UI线程之外的线程上执行绘图操作时,必须使用您描述的技术。 当使用CATiledLayer(在后台线程上执行asynchronous渲染)或者出于其他原因在后台绘制自定义graphics时,这一点尤为重要。

我同意PGB,当你做“简单”的graphics,你保证在主线程上运行。 但是,sizeWithFont和你所描述的技术是一样的,只不过是使用UIGraphicsGetCurrentContext()来完成的。