2011-09-27 72 views
2

API是否支持這個?如果不是,我該怎麼做?如何在iOS中創建多行字符串或多行標籤作爲CGPath?

Core Text中有CTFontCreatePathForGlyph,它可以將單個字符轉換爲路徑。我可以在循環中使用它來創建我的字符串作爲路徑,但是我不得不處理間距和字距問題以及所有其他令人討厭的事情。我正在尋找一個字符串路徑,如果它在具有相同字體和大小的UILabel中繪製,看起來是相同的。

回答

2

有一篇名爲Low-level text rendering的文章Ohmu涵蓋了這個相當廣泛。我試過這段代碼,可以確認它的工作原理。

它確實使用了Core Text,所以渲染可能不完全像UILabel那樣。此外,示例文章只處理一行。要將其擴展爲多行,您必須設置完整的Core Text系統。相反的:

CTLineRef line = CTLineCreateWithAttributedString(attStr) ; 

你需要建立一個CTFramesetterRefCTFramesetterCreateWithAttributedString)和CTFrameRefCTFramesetterCreateFrame)作爲核心文本編程指南描述。然後您可以使用CTFrameGetLines()獲取幀中的所有行。與其他環

CFArrayRef runArray = CTLineGetGlyphRuns(line); 

// for each RUN 
for (CFIndex runIndex = 0; runIndex < CFArrayGetCount(runArray); runIndex++) 

,超過所有行迭代:

你會再包裝樣品文章中for循環。循環的內核應該是相同的。

樣品文章創建一個圖形上下文並添加路徑爲單字形這種情況下的路徑,但你可以很容易地創建一個CGMutablePathRefUIBezierPath和單個字形的路徑添加到該對象。

有一件事情沒有100%清楚,我沒有測試這是如何調整最終路徑中字形的垂直位置。您可能需要撥打CTFrameGetLineOrigins()來獲取每行的位置,並將這個位置添加到每個渲染字形(可能在用文本矩陣變換之後)。

+0

我走過那段代碼,但找不到可以訪問各個字形的部分,以便構建字形的多行路徑。 – openfrog

+0

你是對的,該代碼只處理一行文本。我將編輯我的答案以擴展它(可能需要一些時間)。 –

+0

我編輯了我的答案,給你一些更多的想法。 –

2

查看此項目中的UIBezierPath + TextPaths類別:https://github.com/aderussell/string-to-CGPathRef

它顯示瞭如何爲單行和多行字符串創建路徑以及如何將它們與CAShapeLayers一起使用。

該類別只是一個包裝,內部函數可以在iOS或Mac OS X中使用,您只需將您的項目鏈接到CoreText框架即可。

+0

工程就像一個魅力! – CoderSaru