Ответ 1
Переход от буквы "P" к последовательности точек включает в себя несколько шагов. Вам нужно будет использовать Core Text.
-
Создайте
CTFont
. Начиная с iOS 7, вы можете использоватьUIFont
, где требуетсяCTFont
(они являются "бесплатными мостами" ). Вы также можете создатьCTFont
непосредственно изCGFont
с помощью функцииCTFontCreateWithGraphicsFont
или по имени с помощьюCTFontCreateWithName
(или с помощью нескольких других методов). -
Получите глифы для буквы, используя функцию
CTFontGetGlyphsForCharacters
. Для буквы "P" должен быть только один символ. Для некоторых символов в неанглийских сценариях вы можете получить несколько (комбинирующих) глифов. -
Используйте функцию
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>