でグリフを描きたいのですCGContextShowGlyphsAtPositions
が、使用CTRunGetPositions
するとグリフの位置が左から始まります。CTRunGetStatus
戻りますが、kCTRunStatusRightToLeft
結果は左から右です。テキストを右から左に描画するにはどうすればよいですか?
この言語は左から右ですが、私はアラビア文字を使用しており、アラビア語は右から左の言語であるため、英語の文字は左から右で問題ありません。
グリフは「x」が増加する方向であるため、通常は左から右に描画されるため、位置は左から右になります。を描画するときCGGlyph
には、言語はもう重要ではありません。كتبを描画する場合、システムは最初にبを描画するため、その位置が配列の最初になります。
の結果はCTRunGetGlyphs
と同じ順序CTRunGetPositions
です。kCTRunStatusRightToLeft
グリフの順序は文字列インデックスの順序と厳密に逆であることがわかります。
アラビア語を右から左に描くのに問題はありませんCGContextShowGlyphsAtPositions
。どんな問題がありますか?
CFIndex glyphCount = CTRunGetGlyphCount(run);
CGPoint *positions = calloc(glyphCount, sizeof(CGPoint));
CTRunGetPositions(run, CFRangeMake(0, 0), positions);
CGGlyph *glyphs = calloc(glyphCount, sizeof(CGGlyph));
CTRunGetGlyphs(run, CFRangeMake(0, 0), glyphs);
CGContextShowGlyphsAtPositions(context, glyphs, positions, glyphCount);
free(positions);
free(glyphs);
tanx Rob これは最後の行についてです。複数行を作成する場合、1 行目または 2 行目は問題ありませんが、最後の行は左に溺れますが、アラビア語では最後の行は右に沈む必要があります。
私のコードは:
while (isLine) {
CFIndex count = CTTypesetterSuggestLineBreak(typesetter, start, self.frame.size.width);
if (count <= 0) {
isLine = NO;
break;
}
currentline ++;
CTLineRef justifyline = CTTypesetterCreateLine(typesetter, CFRangeMake(start, count));
if (start + count >= lettercount) {
justifyline = CTTypesetterCreateLine(typesetter, CFRangeMake(start, count));
}
else {
CTLineRef line = CTTypesetterCreateLine(typesetter, CFRangeMake(start, count));
justifyline = CTLineCreateJustifiedLine(line, 0, self.frame.size.width);
CFRelease(line);
}
CTLineGetTypographicBounds(justifyline, &ascent, &descent, &leading);
float lineheight = ascent + descent + leading;
CFArrayRef runArray = CTLineGetGlyphRuns(justifyline);
for (CFIndex runIndex = 0; runIndex < CFArrayGetCount(runArray); runIndex++)
{
// Get FONT for this run
CTRunRef run = (CTRunRef)CFArrayGetValueAtIndex(runArray, runIndex);
CTFontRef runFont = CFDictionaryGetValue(CTRunGetAttributes(run), kCTFontAttributeName);
//NSLog(@"GlyphCount= %d",(int)CTRunGetGlyphCount(run));
// for each GLYPH in run
for (CFIndex runGlyphIndex = 0 ; runGlyphIndex < CTRunGetGlyphCount(run) ; runGlyphIndex++)
{
// get Glyph & Glyph-data
CFRange thisGlyphRange = CFRangeMake(runGlyphIndex, 1);
CGGlyph glyph;
CGPoint position;
CTRunGetGlyphs(run, thisGlyphRange, &glyph);
CTRunStatus state = CTRunGetStatus(run);
if (state == kCTRunStatusRightToLeft) {
NSLog(@"rtl");
}
CTRunGetPositions(run, thisGlyphRange, &position);
position = CGPointMake(position.x, self.frame.size.height + position.y - (100 * currentline));
NSLog(@"x %f y %f",position.x,position.y);
// Render it
{
CGFontRef cgFont = CTFontCopyGraphicsFont(runFont, NULL);
CGAffineTransform textMatrix = CTRunGetTextMatrix(run);
CGContextSetTextMatrix(context, textMatrix);
CGContextSetFont(context, cgFont);
CGContextSetFontSize(context, CTFontGetSize(runFont));
switch (runGlyphIndex) {
case 4:
CGContextSetRGBFillColor(context, 1, 0.0, 0.0, 1);
break;
default:
CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1);
break;
}
CGContextShowGlyphsAtPositions(context, &glyph, &position, 1);
CFRelease(cgFont);
}
}
CFRelease(runFont);
}
start+=count;
}
グリフをグリフごとに処理したいのですが、グリフが最後の行に表示されると、ページの左側に表示されます。