iPhone SDK:你如何测量使用Quartz的string的宽度和高度?
在我问我的问题之前,这是从苹果的文档重新:如何确定使用Quartz的string的宽度:
如果文本测量对您的应用程序非常重要,则可以使用Quartz 2D函数来计算它们。 但是,您可能首先考虑使用ATSUI,其优势在于文本布局和测量。 ATSUI有几个function可以获取文本指标。 您不仅可以获得布局之后的文本指标,而且在极less数情况下,您可以获取布局之前的文本指标。 与Quartz不同,您必须自己执行计算,ATSUI将为您计算测量值。 例如,您可以通过调用ATSUI函数ATSUMeasureTextImage获取文本的图像边界矩形。
如果您认为Quartz文本比ATSUI(或Cocoa)更适合您的需求,您可以按照以下步骤在Quartz绘制之前测量文本的宽度:
- 调用函数CGContextGetTextPosition获取当前的文本位置。
- 使用函数CGContextSetTextDrawingMode将文本绘图模式设置为kCGTextInvisible。
- 通过调用函数CGContextShowText来绘制文本以在当前文本位置处绘制文本。
- 通过调用函数CGContextGetTextPosition来确定最终的文本位置。
- 从结束位置减去起始位置以确定文本的宽度。
这是我的问题:
-
这真的是使用Core Graphics来确定string宽度的最好方法吗? 这看起来很脆弱,因为我的文本与2Dgraphics元素共存,所以我想为所有渲染使用相同的上下文。 我希望能有一些简洁的方法,比如:
CGContextGetTextWidthAndHeight(context,text);
-
我看到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()来完成的。