2009-05-25 7 views
8

iPhone에서 유니 코드 문자를 그리는 방법을 알아내는 것이 왜 쉬운가요? 각 이미지 글리프가 선택한 글꼴로 표시되는 정도와 같은 간단한 글꼴 메트릭을 도출하는 이유는 무엇입니까?iPhone에서 유니 코드 문자 그리기

마치 NSLayoutManager으로는 쉽지만 그 API는 분명히 전화에서 사용할 수없는 것 같습니다. 사람들이 이것을하는 방식은 비공개 API 인 CGFontGetGlyphsForUnichars을 사용하는 것으로 나타났습니다. 그러면 앱 게이트 키퍼를 지나쳐 앱 스토어에 들어갈 수 없습니다.

아무에게도이 작업을 수행하는 방법을 보여주는 설명서를 가르쳐 줄 수 있습니까? 나는 머리카락을 빨리 잃어 가고있다.

하워드

답변

3

나는 그러나 나는 그것에 농장을 내기
아니에요, CGFontGetGlyphsForUnichars
의 배제는 감독이 아닌 의도적 인 움직임이라고 생각했습니다. 그래서 그 대신 나는

이것은 또한 글꼴에없는 문자에 알맞은 대체
을 수행하는 장점이있다

[NSString sizeWithFont];

(UIStringDrawing.h에서)

[NSString drawAtPoint:withFont:];, 뭔가를 사용하는
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);