在iPhone上绘制Unicode字符

8
为什么在iPhone上绘制Unicode字符很难,期间还要推导出简单的字体度量值,例如所选字体中每个图像字形的宽度?看起来使用NSLayoutManager会很容易,但是这个API似乎在手机上不可用。目前人们似乎是使用私有API CGFontGetGlyphsForUnichars 来实现,但这样做无法通过Apple的应用商店审核门槛。请问是否有人能提供相应的文档说明如何解决这个问题呢?我快要秃头了。
Howard
3个回答

3
我认为排除CGFontGetGlyphsForUnichars是一个疏忽而不是故意的举动,但我并不确定。因此,我使用[NSString drawAtPoint:withFont:](在UIStringDrawing.h中)和[NSString sizeWithFont]。这样做的优点是,它可以对字体中缺失的字符进行良好的替换,而CGContextShowGlyphs则不能做到这一点。

你知道:那差不多就是这样了。这解决了我对字符图像的需求,但并没有得到它的简单字体度量。然而事实证明,你可以跳进和跳出当前上下文(UIGraphicsGetCurrentContext),并在绘制前后使用 CGContextGetTextPosition 来获取边界框的宽度。这基本上是我感兴趣的主要内容,所以谢谢! - hkatz
等等,[@"a" sizeWithFont:<font>]有什么问题吗? 为什么需要单个字符的度量? - Andrew Pouliot
它给我提供了指标,因为我对每个字符都使用了sizeWithFont。安德鲁:也许他想将字符缓存到纹理中,或沿着路径绘制它们。 - Rhythmic Fistman

1

如果您想要绘制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:)绘制的字符导出为字符串,以便稍后用作字符串字母?这会对我有帮助吗?如果不行,我应该如何将手写字母用作字符串? - MALIKK HABIB UR REHMAN

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接