gpt4 book ai didi

objective-c - 如何使用核心文本和属性字符串伪造上标和下标?

转载 作者:太空狗 更新时间:2023-10-30 03:23:10 26 4
gpt4 key购买 nike

我正在使用 NSMutableAttribtuedString 来构建带格式的字符串,然后将其传递给 Core Text 以呈现到框架中。问题是,我需要使用上标和下标。除非这些字符在字体中可用(大多数字体不支持),否则设置属性 kCTSuperscriptAttributeName 根本不起作用。

所以我想我只剩下唯一的选择了,那就是通过更改字体大小和移动基线来伪造它。我可以做字体大小位,但不知道改 rebase 线的代码。有人可以帮忙吗?

谢谢!

编辑:我在考虑,考虑到我有足够的时间来解决这个问题,编辑字体以便给它一个下标“2”......或者找到一个内置的 iPad 字体做。有谁知道我可以使用带有下标“2”的任何衬线字体?

最佳答案

CTParagraphStyleSpecifiers 或定义的字符串属性名称常量之间没有基线设置。因此,我认为可以安全地得出结论,即 CoreText 本身不支持文本的基线调整属性。在 CTTypesetter 中提到了基线放置,但我无法将其与在 iPad 的 CoreText 中的一行中改 rebase 线的任何能力联系起来。

因此,您可能需要自己干预渲染过程。例如:

  • 创建一个 CTFramesetter,例如通过 CTFramesetterCreateWithAttributedString
  • 通过 CTFramesetterCreateFrame 从中获取 CTFrame
  • 使用 CTFrameGetLineOriginsCTFrameGetLines 获取一组 CTLines 以及它们应该绘制的位置(即,具有合适的段落/换行符和所有其他字距调整的文本/应用前导/其他定位文本属性)
  • 对于那些没有上标或下标的行,只需使用 CTLineDraw 并忘记它
  • 对于那些带有上标或下标的,使用CTLineGetGlyphRuns 获取描述行中各种字形的 CTRun 对象数组
  • 在每次运行时,使用 CTRunGetStringIndices 确定运行中的源字符;如果没有你想要上标或下标的东西,就用CTRunDraw来画
  • 否则,使用 CTRunGetGlyphs 将运行分解为单个字形,并使用 CTRunGetPositions 确定在正常运行中它们将被绘制的位置
  • 根据需要使用 CGContextShowGlyphsAtPoint,为您想要的上标或下标调整文本矩阵

我还没有找到一种方法来查询字体是否具有自动生成上标/下标的相关提示,这使事情变得有些棘手。如果你绝望并且没有解决方案,那么根本不使用 CoreText 的东西可能更容易 - 在这种情况下你应该定义你自己的属性(这就是为什么 [NS/CF]AttributedString 允许任意属性被应用,由字符串名称标识)并使用正常的 NSString 搜索方法从盲目中识别需要以上标或下标打印的区域。

出于性能原因,二进制搜索可能是继续搜索所有行、一行中的运行以及运行中的字形的方式,以供您感兴趣。假设您有一个自定义 UIView 子类来绘制 CoreText 内容,提前做这件事可能比在每个 drawRect 上做更聪明:(或者等效的方法,例如,如果您使用的是 CATiledLayer)。

此外,CTRun 方法有一些变体,这些变体请求一个指向包含您要复制的内容的 C 数组的指针,这可能会为您节省一次复制操作,但不一定会成功。检查文档。我刚刚确定我是在草拟一个可行的解决方案,而不是必须通过 CoreText API 绘制绝对最佳的路线。

关于objective-c - 如何使用核心文本和属性字符串伪造上标和下标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871303/

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