ビュー上に直接文字列を描画する

android

androidの場合、オーバライドされたonDrawメソッドのコンテキスト中でCanvasクラスのインスタンスの参照を得ることができるので、そのCanvasのメソッドを使って直接文字列を描画できる。

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

   final Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
    p.setStyle(Paint.Style.STROKE);
    //色設定
    p.setColor(0x66FFFFFF);
    //文字の大きさ
    p.setTextSize(40);
    //描画位置微調整のためにフォントメトリクスを取得
    FontMetrics fm = p.getFontMetrics();
    //テキスト描画
    canvas.drawText("描画文字列", 100, 100 - fm.ascent/2, p);
}

iOS

iOSの場合同様にUIViewクラスのdrawRect:rectメソッドをオーバライドしてコンテキスト(CGContextRef)を取得して文字列を描画することが出来るが、CoreGraphicsのメソッドはandroidのクラスに比べるとより下層のレイヤに属するAPIの為、手続きが多少面倒になる。

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetTextDrawingMode(context, kCGTextFill);
    //色設定
    CGContextSetRGBFillColor(context, red, green, blue, alpha);
    //フォント設定
    CGContextSelectFont(context, "Helvetica", 40 , kCGEncodingMacRoman);
    //CGContextRefの座標系を180度転換
    CGAffineTransform transform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix(context, transform);
       
   //テキスト描画
   CGContextShowTextAtPoint(context, 100, 100 , [@"描画する文字列" UTF8String], 文字列の長さ);
}

座標系を天地ひっくり返す必要があるってのがなんとも残念な仕様だ。

iOSはプリミティブな描画を行う場合、必要に応じてCoreGraphicsレイヤまで降りる必要があるためandroidに比べると多少面倒だが、それでもビューの描画メソッドをオーバライドして描画用のコマンドを実行するという考え方自体は同じなので、移植はやりやすい。