在 iPhone 上绘制 Unicode 字符

Posted

技术标签:

【中文标题】在 iPhone 上绘制 Unicode 字符【英文标题】:Drawing Unicode characters on iPhone 【发布时间】:2010-10-28 18:02:00 【问题描述】:

为什么很难弄清楚如何,沿途导出简单的字体指标,例如每个图像字形在所选字体中的宽度?

使用NSLayoutManager 似乎很容易,但该 API 显然在手机上不可用。人们这样做的方式似乎是使用私有 API,CGFontGetGlyphsForUnichars,这不会让您通过 Apple 看门人进入 App Store。

任何人都可以向我指出显示如何执行此操作的文档吗?我掉头发很快。

霍华德

【问题讨论】:

【参考方案1】:

我假设排除CGFontGetGlyphsForUnichars 是疏忽而不是故意的举动,但是我不是 把农场赌在上面。所以我改为使用

[NSString drawAtPoint:withFont:];(在 UIStringDrawing.h 中)

[NSString sizeWithFont];

这还具有执行体面替换的优势 关于字体中缺少的字符,CGContextShowGlyphs 不会这样做。

【讨论】:

你知道:差不多了。这满足了我对字符进行成像的需要,但不是为它获取简单的字体度量。事实证明,您可以跳入和跳出当前上下文 (UIGraphicsGetCurrentContext) 并在绘制前后使用CGContextGetTextPosition 基本上获得边界框的宽度。这主要是我感兴趣的推导,所以谢谢! 等等,[@"a" sizeWithFont:<font>] 怎么了?为什么需要单个字符的指标? 它给了我指标,因为我为每个字符做了一个 sizeWithFont。 Andrew:也许他想将角色缓存到纹理中,或者沿着路径绘制它们。【参考方案2】:

如果您想绘制 unicode 而不是 CGContextShowGlyphsAtPositions,CoreText 就是答案。如果您需要自定义绘图,它也比[NSString drawAtPoint:withFont:] 更好。 这是一个完整的例子:

CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)attributedString);
CFArrayRef runArray = CTLineGetGlyphRuns(line);

//in more complicated cases make loop on runArray
//here I assumed this array has only 1 CTRunRef within
const CTRunRef run = (CTRunRef)CFArrayGetValueAtIndex(runArray, 0);

//do not use CTFontCreateWithName, otherwise you won't see e.g. chinese characters
const CTFontRef font = CFDictionaryGetValue(CTRunGetAttributes(run), kCTFontAttributeName);

CFIndex glyphCount = CTRunGetGlyphCount(run);
CGGlyph glyphs[glyphCount];
CGPoint glyphpositions[glyphCount];

CTRunGetGlyphs(run, CFRangeMake(0, 0), glyphs);
//you can modify positions further
CTRunGetPositions(run, CFRangeMake(0, 0), glyphPositions);

CTFontDrawGlyphs(font, glyphs, glyphPositions, glyphCount, context);
CFRelease(line);

【讨论】:

我需要将用draw(rect:)绘制的字符导出成字符串,以后可以用作字符串字母吗?它会帮助我吗?如果不是,我应该如何使用手绘字母作为字符串?【参考方案3】:

我已经为私有函数做了一个非常合适的替代品。在这里阅读: http://thoughts.codemelody.com/2009/07/a-replacement-for-cgfontgetglyphsforunichars/

【讨论】:

以上是关于在 iPhone 上绘制 Unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章

Unicode与编码方式

是否可以使用 Tesseract OCR 识别 iPhone 屏幕上绘制的字符?

在iOS5中以不同方式绘制Unicode字符

在2005年,Unicode 的第十万个字符被采纳且认可成为标准之一(超过这65535范围的Unicode字符,则需要使用一些诡异的技巧来实现)

iOS5 中 Unicode 字符的绘制方式不同

JS - 字符编码 (ASCII,Unicode,UTF-8)