2009-05-27 32 views
19

之前,我問我的問題,這是來自Apple的文檔重:iPhone SDK:你如何測量使用Quartz的字符串的寬度和高度?

如果文本的測量對您的應用程序非常重要,可以 使用石英計算它們:如何使用Quartz來確定一個字符串的寬度2D功能。不過,您可能首先考慮使用ATSUI,其優點是文本佈局和 度量。 ATSUI有幾個功能可以獲取文本指標。不是 只能獲得佈局後文本指標,但在極少數情況下,您需要它們,您可以獲取佈局前文本指標。與 石英不同,您必須自己進行計算,ATSUI 將爲您計算測量結果。例如,您可以通過調用ATSUI函數 ATSUMeasureTextImage來獲取 文本的圖像邊界矩形。

如果您認爲石英文本適合您的需求比ATSUI(或 可可)更好,你可以按照以下步驟來測量文本的寬度 石英繪製之前:

  1. 調用函數CGContextGetTextPosition到獲取當前文本位置。
  2. 使用函數CGContextSetTextDrawingMode將文本繪製模式設置爲kCGTextInvisible。
  3. 通過調用函數CGContextShowText在當前文本位置繪製文本來繪製文本。
  4. 通過調用函數CGContextGetTextPosition來確定最終的文本位置。
  5. 從結束位置減去起始位置以確定文本的寬度。

這裏是我的問題:

  1. 這是真的,以確定使用核心圖形字符串的寬度最好的方法是什麼?它看起來很脆弱,因爲我的文本與2D圖形元素共存,所以我想爲所有渲染使用相同的上下文。我希望會有一些簡潔的方法,如:

    CGContextGetTextWidthAndHeight(context,text);

  2. 我看到ATSUI已經過時,將被核心文本取代。這是真的,如果是這樣,它在iPhone SDK中嗎?

+0

核心文本現在在iOS 4中發佈。但是,pgb回答的方法最簡單。 – Eonil 2010-07-09 07:36:09

回答

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: 
+0

我沒有意識到你可以將Core Graphics調用與Objective-C對象混合搭配...... CG有自己的基於常量字符數組的文本繪製函數,但是有限的鈴聲和哨聲。看起來「當前上下文」僅僅意味着實例化的最後一個上下文,例如: \t CGContextSetFillColorWithColor(context,color.CGColor); \t [text drawAtPoint:origin withFont:font]; 感謝您的寶貴意見! – 2009-05-27 17:01:45

0

執行上比在UI線程其他線程繪圖操作時,您必須使用你描述的技術。當使用像CATiledLayer這樣的東西,它在後臺線程上執行異步呈現,或者出於任何其他原因在後臺繪製自定義圖形時,請特別注意這一點。

我同意PGB當你做「簡單」的圖形,你保證在主線程上運行。然而,sizeWithFont與你所描述的技術做同樣的事情 - 它只是使用UIGraphicsGetCurrentContext()來爲你做。

相關問題