在我提出问题之前,这是来自Apple的文档:如何使用Quartz确定字符串的宽度:
如果文本测量对您的应用程序很重要,则可以 使用Quartz 2D函数计算它们。但是,你可能会先 考虑使用ATSUI,其优势在于文本布局和 测量。 ATSUI有几个获取文本度量的函数。不 只能获得布局后文本指标,但在极少数情况下 您需要它们,您可以获得布局前文本指标。不像 Quartz,您必须自己执行计算,ATSUI 为您计算测量值。例如,您可以获得 通过调用ATSUI函数为文本设置图像边界矩形 ATSUMeasureTextImage。
如果您认为Quartz文本比ATSUI更适合您的需求(或者 Cocoa),您可以按照以下步骤测量文本的宽度 Quartz绘制它:
- 调用函数CGContextGetTextPosition以获取当前文本位置。
- 使用CGContextSetTextDrawingMode函数将文本绘制模式设置为kCGTextInvisible。
- 通过调用CGContextShowText函数绘制文本,在当前文本位置绘制文本。
- 通过调用函数CGContextGetTextPosition确定最终文本位置。
- 从结束位置减去起始位置以确定文本的宽度。
醇>
以下是我的问题:
这是否是使用Core Graphics确定字符串宽度的最佳方法?它似乎很脆弱,因为我的文本与2D图形元素共存,我想对所有渲染使用相同的上下文。我希望会有一些紧凑的方法,比如:
CGContextGetTextWidthAndHeight(context, text);
我读到ATSUI已过时,将被Core Text取代。这是真的,如果是这样,是在iOS吗?
答案 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()为您完成。