iOS:如何使用Quartz测量字符串的宽度和高度?

时间:2009-05-27 00:46:16

标签: ios objective-c quartz-graphics core-text

在我提出问题之前,这是来自Apple的文档:如何使用Quartz确定字符串的宽度:

  

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

     

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

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

以下是我的问题:

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

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

2 个答案:

答案 0 :(得分:22)

在iPhone SDK上,NSString上有一系列提供您想要的方法。

自iOS 7.0起,these methods are

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

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

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

答案 1 :(得分:0)

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

当你正在做“简单”图形时,我同意PGB,并且保证你可以在主线程上运行。但是,sizeWithFont正在执行与您描述的技术相同的操作 - 它只是使用UIGraphicsGetCurrentContext()为您完成。