こちらとかこちらのページによると、日本語のフォントを指定した場合は、文字の描画にCGContextShowTextAtPointが使えないらしい。代わりにCGContextShowGlyphsAtPointを使うことになるらしいのだけど、そのためにはGlyph(文字の形状)を用意しなければならず、そのために使えるCGFontGetGlyphsForUnicharsという関数は非公式APIなのでAppleにリジェクトされてしまうのだとか。
上のページにはそれを解決する方法とコードが書かれているのだけど、私には難しすぎるので、Quartz2Dで描画するのはあきらめて、もっと簡単な方法がないか探してみたところ、ありました。
NSStringにはUIKit用の追加メソッドというのが用意されていて、これをUIViewのdrawInRect内で使うと、文字の描画位置やサイズが細かく指定できて、しかもUnicode文字でも問題なく表示できました。
Drawing Strings on a Single Line – drawAtPoint:withFont: – drawAtPoint:forWidth:withFont:lineBreakMode: – drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment: – drawAtPoint:forWidth:withFont:minFontSize:actualFontSize:lineBreakMode:baselineAdjustment: Drawing Strings in a Given Area – drawInRect:withFont: – drawInRect:withFont:lineBreakMode: – drawInRect:withFont:lineBreakMode:alignment:
例えばこんな感じで。
UIFont *font = [UIFont systemFontOfSize:fontSize];
NSString *str = @"描画したい文字";
// これを使うと、指定したフォントでの描画後のサイズがピクセル数でどれだけになるかがわかる
CGSize strSize = [str sizeWithFont:font];
// 描画する領域の矩形を作成
CGRect rect = CGRectMake(x, y, width, height);
// 文字の色の指定などは、Quartz2Dの関数を混ぜて使える
CGContextSetRGBFillColor(context, 0.7f, 0.7f, 0.7f, 1.0f);
// alignment引数を指定すれば、左右の位置を自動的に調整して配置してくれる
[str drawInRect:rect withFont:font lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter];
ただし、Quartz 2Dの他の描画関数と混ぜて使うときは、座標軸の取り方が違うので注意が必要です。UIKitの座標軸とQuartz 2Dの座標軸を切り替えるには、次のようにします。
// 原点とする位置を変更
CGContextTranslateCTM(context, 0.0f, self.bounds.size.height);
// Y軸の正方向を逆転
CGContextScaleCTM(context, 1.0f, -1.0f);
これらは、現状に対するtranslateとscaleになるので、この2行を呼ぶ度にUIKit方式とQuartz 2D方式を切り替えられます。





