在 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 字符的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 Tesseract OCR 识别 iPhone 屏幕上绘制的字符?
在2005年,Unicode 的第十万个字符被采纳且认可成为标准之一(超过这65535范围的Unicode字符,则需要使用一些诡异的技巧来实现)