19

在我提出问题之前,这是来自 Apple 的文档 re:how to determine the width of a string of using Quartz:

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

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

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

以下是我的问题:

  1. 这真的是使用 Core Graphics 确定字符串宽度的最佳方法吗?它看起来很脆弱,因为我的文本与 2D 图形元素共存,所以我想对所有渲染使用相同的上下文。我希望会有一些紧凑的方法,比如:

    CGContextGetTextWidthAndHeight(context, text);
    
  2. 我读到 ATSUI 已经过时,将被 Core Text 取代。这是真的吗?如果是这样,是在 iOS 中吗?

4

2 回答 2

22

在 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:
于 2009-05-27T00:55:56.100 回答
0

在 UI 线程以外的线程上执行绘图操作时,您必须使用您描述的技术。在使用诸如 CATiledLayer 之类的东西时,这一点尤其重要,它在后台线程上异步执行渲染,或者在出于任何其他原因在后台绘制自定义图形时。

当你在做“简单”的图形时,我同意 PGB,并且保证你在主线程上运行。但是,sizeWithFont 与您描述的技术做同样的事情 - 它只是使用 UIGraphicsGetCurrentContext() 为您做这件事。

于 2010-10-19T08:18:36.853 回答