2010年12月8日水曜日

独自のUIViewを作る

独自のUIViewを作るには、描画処理を独自に作成する必要があります。

UIViewでは描画を行う時に「drawRect:(CGRect)rect」メソッドが呼び出されます。

このメソッドをオーバーライドして独自の描画処理を行わせます。

独自のUIViewを作成するのは、割と低レベル(OSに近くなると言う意味)なことですので、C言語の関数で描画を行う必要があります。また、フォントの扱い等、多少クセがあるようです。


-(void)drawRect:(CGRect)rect
{
// 描画範囲を取得
CGRect parentViewBounds = self.bounds;

// ビューのコンテクストを取得
CGContextRef ctx = UIGraphicsGetCurrentContext();

// 塗りつぶし色設定
CGContextSetFillColorWithColor(ctx, [UIColor whiteColor].CGColor);

// 塗りつぶし色でビューを塗りつぶし
CGContextFillRect(ctx, CGRectMake(0, 0, parentViewBounds.size.width, parentViewBounds.size.height));

// 描画設定終了
CGContextClosePath(ctx);

// パスを描画
CGContextStrokePath(ctx);
}

UIViewのboundプロパティは、自身のUIViewの描画範囲をCGRect構造体で取得するプロパティです。

UIGraphicsGetCurrentContext()関数は、自身のUIViewインスタンスのコンテキストを取得する関数です。後の描画関数で引数として使用されます。

上記では、色の設定関数(CGContextSetFillColorWithColor)や塗りつぶし関数(CGContextFillRect)を呼び出していますが、実際の描画は最後に呼び出している描画関数(CGContextStrokePath)で行われます。色やパスの設定関数を呼び出した時点ではないことに少し注意が必要です。
例えば、色を何回変更してパスの設定を行ったとしても、実際の変更が行われるのはCGContextStrokePath等の描画関数を呼び出した時点ですので、途中の色設定は無視されて、最後の色設定のみが反映されることになります。

また、マウス操作などでリアルタイムに描画を変更したい場合などは、「setNeedsDisplayInRect」メソッドを呼び出せば、いつでもdrawRectメソッドがCallbackされます。

[self setNeedsDisplayInRect:self.frame];



描画を行う関数は大量にありますが、ほんの一部を抜き出すと、以下のようになります。
もっと知りたい方は、ドキュメントをCGContextで検索すればたくさん出てきます。

関数概要
CGContextAddLines線の描画設定
CGContextAddPathパスの描画設定
CGContextSetStrokeColorWithColor線の色設定
CGContextSetLineWidth線の太さ設定
CGContextSetFillColor塗りつぶし色設定
CGContextShowTextAtPointテキストの設定
CGContextSelectFontフォントの設定

上記表は描画関数のほんの一部です。上記表にはありませんが、イメージを描画したり、カーブ線を描画する関数もあるようです。

0 件のコメント:

コメントを投稿