このコードはほとんど動作しているようです。実行ごとに出力でき、実行は有効であるように見えますが、グリフを出力するとガベージになります。また、位置はすべて (0,0) にあり、境界が正しく見えません。誰かが私を助けてくれますか?私はこれらのことを正しく行っていないかもしれません.ちなみにこれは単なるサンプルプログラムなので、実行内の実際のデータを見ることができます.
-(void) printRuns:(CTFrameRef)ctframe {
CFArrayRef lines;
lines = CTFrameGetLines(ctframe);
CGPoint origins[CFArrayGetCount(lines)];//the origins of each line at the baseline
CTFrameGetLineOrigins(ctframe, CFRangeMake(0, 0), origins);
NSUInteger lineIndex = 0;
for(int i = 0; i < CFArrayGetCount(lines); i++)
//for(id lineObj in lines)
{
CTLineRef line = CFArrayGetValueAtIndex(lines, i);
NSLog(@"LineOrigin:%@", NSStringFromCGPoint(origins[i]));
CFArrayRef runs = CTLineGetGlyphRuns(line);
for(int j = 0; j < CFArrayGetCount(runs); j++)
//for(id runObj in (__bridge NSArray*)CTLineGetGlyphRuns(line))
{
CTRunRef run = CFArrayGetValueAtIndex(runs, j);
CFRange runRange = CTRunGetStringRange(run);
CGRect runBounds;
CGFloat ascent;//height above the baseline
CGFloat descent;//height below the baseline
runBounds.size.width = CTRunGetTypographicBounds(run, runRange, &ascent, &descent, NULL);
runBounds.size.height = ascent + descent;
CGFloat xOffset = CTLineGetOffsetForStringIndex(line, CTRunGetStringRange(run).location, NULL);
runBounds.origin.x = origins[lineIndex].x + 0 + xOffset;
runBounds.origin.y = origins[lineIndex].y + 0;
runBounds.origin.y -= descent;
CGGlyph glyphBuffer[runRange.length];
CTRunGetGlyphs(run, runRange, glyphBuffer);
//const CGGlyph *glyphs = CTRunGetGlyphsPtr(run);
//NSLog(@"Glyph:%c", glyph);
for(int i = 0; i < runRange.length; i++)
{
NSLog(@"Glyph:%c", glyphBuffer[i]);
if(i % 10 == 0)
{
NSString *test = @"";
}
}
CFIndex glyphCount = CTRunGetGlyphCount(run);
CGPoint *positions = calloc(glyphCount, sizeof(CGPoint));
CTRunGetPositions(run, runRange, positions);
for(int i = 0; i < glyphCount; i++)
{
CGPoint *position = &positions[i];
NSLog(@"Position:%@", NSStringFromCGPoint(*position));
}
NSLog(@"%@", NSStringFromCGRect(runBounds));
}
lineIndex++;
}
}