【问题标题】:iOS: How do you measure the width and height of a string using Quartz?iOS:如何使用 Quartz 测量字符串的宽度和高度?
【发布时间】:2010-10-29 03:31:45
【问题描述】:

在我问问题之前,这是来自 Apple 的文档:如何使用 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 中吗?

【问题讨论】:

  • Core Text 现已在 iOS 4 中发布。然而,pgb 回答的方法是最简单的。

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


【解决方案1】:

在 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:

【讨论】:

  • 我没有意识到您可以将 Core Graphics 调用与 Objective-C 对象混合和匹配... CG 有自己的基于 const char 数组的文本绘制功能,但花里胡哨的东西有限。似乎“当前上下文”仅表示最后实例化的上下文,例如: CGContextSetFillColorWithColor(context, color.CGColor); [文本 drawAtPoint:origin withFont:font];谢谢你的好建议!
  • 实际上,我相当确定当前上下文是指 UIGraphicsGetCurrentContext() 返回的上下文
  • 你可以在特定情况下混搭——具体来说;从主线程以外的任何线程调用 UI___(例如 UIGraphicsGetCurrentContext())的任何东西都会经常失败。这是一个严重的问题,尤其是当您使用 CATiledLayer 之类的东西时 - 它在后台线程上异步渲染。
  • 只有在以下情况下才会失败。当您为当前上下文设置自定义 TextMatrix 时,您可能需要再次将获得的大小乘以该矩阵。
  • 仅供参考:答案来自 09 年,该功能在 iOS 7 中已被弃用,但仍然是 Google 上的第一名。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-14
    • 2015-12-14
    • 2011-07-19
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    相关资源
    最近更新 更多