2009-05-25 7 views
8

iPhoneでUnicode文字を描く方法を理解することが難しいのはなぜですか?どのようなイメージングされたグリフがどれほど広いフォントを選択するかなど、簡単なフォントメトリクスを導出するのはなぜですか?iPhoneでUnicode文字を描く

NSLayoutManagerでは簡単だと思われますが、そのAPIは携帯電話では利用できないようです。人々がこれをやっているように見えるのは、プライベートAPIのCGFontGetGlyphsForUnicharsを使用することです。これは、AppleのゲートキーパーをApp Storeに追いやらないでしょう。

誰でも私にこれを行う方法を示すドキュメントを指摘できますか?私は急速に髪を失っています。

ハワード

答えて

3

は、私は、しかし、私はそれに農場を賭け
ないんだけど、CGFontGetGlyphsForUnichars
の除外は監督ではなく、意図的な動きだったと仮定しました。ので、代わりに私は、これはまた、
何かをあなたのフォントから欠落した文字の上にまともな置換
を実行するという利点がある

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

[NSString sizeWithFont];

を使用します CGContextShowGlyphsはしません。

+0

あなたは知っています。それは私のキャラクターをイメージ化する必要がありますが、単純なフォントメトリクスは得られません。現在のコンテキスト( 'UIGraphicsGetCurrentContext')に出入りすることができ、描画の前後に' CGContextGetTextPosition'を使用して基本的にバウンディングボックスの幅を取得できます。それは主に私が派生することに興味があるので、ありがとう! – hkatz

+0

待ち時間、 '[@" a "sizeWithFont:]の何が問題なのですか? なぜ個々の文字に対してメトリックが必要ですか? –

+0

私は各文字に対してsizeWithFontを行うので、メトリックが得られます。 Andrew:文字をテクスチャにキャッシュしたり、パスに沿って描画したりしたいと思うかもしれません。 –

0

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); 
関連する問題