2010年 12月 28日(火曜日) 00:46

Quartz 2Dで日本語(Unicode)の文字列を描画する方法?

評価:
(0 票)

iOSで線や図形を描画するには、Quartz 2Dを使います。Quartz 2Dは文字も描画できるのですが、UTF-8の日本語文字を描画する方法がどうしてもわからなかったので調べてみました。

こちらとかこちらのページによると、日本語のフォントを指定した場合は、文字の描画に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方式を切り替えられます。

最終更新日: 2011年 6月 27日(月曜日) 01:12
くらち たかよし

くらち たかよし

モバイル・Webアプリ作家。最近は主にiPhoneアプリ制作を手がける。企画から、UIデザイン、設計、実装、テスト、多言語対応、ユーザーサポートまでを1人〜数人の個人で行う全人的開発手法の確立を目指している。

使う言語はObjective-C, C++, C#, Java, PHPなど。Web関連で使うものはCakePHP, MySQL, Joomla! CMSなど。デザインはシロウトながらPhotoshopとIllustratorをなんとかがんばって使う。

場所や時間に縛られない、インターネット時代の新しい働き方、自由な生き方を模索中。海外移住、低予算&低リスク起業、キャリアデザイン、心理学などにも興味あり。

Web: awaresoft.jp/