文字「P」から一連のポイントに移動するには、いくつかの手順が必要です。Core Text を使用する必要があります。
を作成しますCTFont
。UIFont
iOS 7 以降、 a が必要な場所で aを使用できますCTFont
(それらは「無料でブリッジ」されています)。関数を使用してaCTFont
から直接作成することも、名前を使用して(または他のいくつかの方法を使用して) 作成することもできます。CGFont
CTFontCreateWithGraphicsFont
CTFontCreateWithName
関数を使用して文字のグリフを取得しCTFontGetGlyphsForCharacters
ます。文字「P」の場合、グリフは 1 つだけにする必要があります。英語以外のスクリプトの一部の文字では、複数の (組み合わせた) グリフが得られる場合があります。
CTFontCreatePathForGlyph
関数を使用しCGPath
て、グリフの を取得します。
CGPathApply
パスの要素を列挙するために使用します。
パスの各ライン、クアッド カーブ、キュービック カーブ要素を一連のポイントに変換します。Apple は、これを行うためのパブリック API を提供していません。自分で行う必要があります。直線要素の場合は簡単です。曲線要素の場合、ベジエ曲線をレンダリングする方法をまだ知らない場合は、調査を行う必要があります。たとえば、ベジエ曲線をポリゴン チェーンに変換するを参照してください。.
これは、Swift プレイグラウンドで簡単に試すことができます。
import UIKit
import CoreText
import XCPlayground
let font = UIFont(name: "HelveticaNeue", size: 64)!
var unichars = [UniChar]("P".utf16)
var glyphs = [CGGlyph](count: unichars.count, repeatedValue: 0)
let gotGlyphs = CTFontGetGlyphsForCharacters(font, &unichars, &glyphs, unichars.count)
if gotGlyphs {
let cgpath = CTFontCreatePathForGlyph(font, glyphs[0], nil)!
let path = UIBezierPath(CGPath: cgpath)
print(path)
XCPlaygroundPage.currentPage.captureValue(path, withIdentifier: "glyph \(glyphs[0])")
}
結果:
<UIBezierPath: 0x7fbc89e0d370; <MoveTo {11.072000000000001, 23.808}>,
<LineTo {11.072000000000001, 40.576000000000001}>,
<LineTo {22.975999999999999, 40.576000000000001}>,
<QuadCurveTo {30.560000000000002, 38.432000000000002} - {28.16, 40.576000000000001}>,
<QuadCurveTo {32.960000000000001, 32.192} - {32.960000000000001, 36.288000000000004}>,
<QuadCurveTo {30.560000000000002, 25.920000000000002} - {32.960000000000001, 28.096}>,
<QuadCurveTo {22.975999999999999, 23.808} - {28.16, 23.744}>,
<Close>,
<MoveTo {4.992, 45.695999999999998}>,
<LineTo {4.992, 0}>,
<LineTo {11.072000000000001, 0}>,
<LineTo {11.072000000000001, 18.687999999999999}>,
<LineTo {25.024000000000001, 18.687999999999999}>,
<QuadCurveTo {35.488, 22.208000000000002} - {31.936, 18.623999999999999}>,
<QuadCurveTo {39.039999999999999, 32.192} - {39.039999999999999, 25.792000000000002}>,
<QuadCurveTo {35.488, 42.143999999999998} - {39.039999999999999, 38.591999999999999}>,
<QuadCurveTo {25.024000000000001, 45.695999999999998} - {31.936, 45.695999999999998}>,
<Close>