gpt4 book ai didi

iphone - 获取在 iOS UIFont 中追踪字符的路径

转载 作者:IT王子 更新时间:2023-10-29 08:14:11 28 4
gpt4 key购买 nike

假设我在我的 iOS 应用程序中使用了自定义字体“Foo”。我已经将它添加到我的项目、plist 等中,并且我能够使用它渲染 UILabel 等。

现在,如果我想找出一系列可以“追踪”出该字体中的字母“P”的点,我将如何获得该点序列?例如,假设我想使用 CGPath 像绘图仪一样慢慢地绘制字母“P”...

我只需要一个数组中的一系列 CGPoints,如果将其绘制为路径,则会绘制一个“P”。

我意识到对于某些字母,如“T”,这可能没有意义,因为必须抬起笔才能穿过“T”。所以也许我需要一系列 CGPath ...

关于如何完成此操作的任何提示?

谢谢!

最佳答案

从字母“P”到点序列涉及多个步骤。您需要使用 Core Text。

  1. 创建一个CTFont。从 iOS 7 开始,您可以在需要 CTFont 的地方使用 UIFont(它们是“免费桥接”)。您还可以使用 CTFontCreateWithGraphicsFont 函数直接从 CGFont 创建一个 CTFont,或者使用 CTFontCreateWithName 按名称创建(或使用其他一些方法)。

  2. 使用 CTFontGetGlyphsForCharacters 函数获取字母的字形。对于字母“P”,应该只有一个字形。对于非英语脚本中的某些字符,您可能会得到多个(组合)字形。

  3. 使用 CTFontCreatePathForGlyph 函数获取字形的 CGPath

  4. 使用CGPathApply 枚举路径的元素。

  5. 将路径的每条直线、四边形曲线和三次曲线元素转换为点序列。 Apple 不为此提供任何公共(public) API。你需要自己做。对于直线元素,这很容易。对于曲线元素,如果您还不知道如何渲染贝塞尔曲线,则需要做一些研究。例如,参见 convert bezier curve to polygonal chain? .

我们可以在 Swift playground 中轻松地进行试验:

import UIKit
import CoreText
import XCPlayground

let font = UIFont(name: "HelveticaNeue", size: 64)!

var unichars = [UniChar]("P".utf16)
var glyphs = [CGGlyph].init(repeating: 0, count: unichars.count)
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(value: 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>

P glyph path

关于iphone - 获取在 iOS UIFont 中追踪字符的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11172207/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com