2013年2月13日水曜日

描画を blocks 化するライブラリ

描画コードを blocks として記述して専用のビューへ渡すと描画してくれるライブラリ。カスタム描画する為に UIViewのサブクラスを作る必要が無い。これは面白い。

例えば下記のような描画コードを書いておく。
FKRBlockDrawingRenderBlock renderBlock = ^(CGContextRef context, CGSize size) {
    CGRect rect = CGRectMake(0, 0, size.width, size.height);

    [[UIColor redColor] set];
    CGContextAddEllipseInRect(context, rect);
    CGContextFillEllipseInRect(context, rect);

    [[UIColor blackColor] set];
    [@"Hello World!" drawInRect:CGRectInset(rect, 5, 10) withFont:[UIFont boldSystemFontOfSize:14] lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentCenter];
};
このblocksを引数にして専用のビュー FKRBlockDrawingViewのインスタンスを作る。
FKRBlockDrawingView *view = [[FKRBlockDrawingView alloc] initWithFrame:frame renderBlock:renderBlock];
後はこのビューを表示ビュー(UIViewController.viewなど)へ貼りつければ blocksの描画が行える。普通これをやろうとすると UIViewのサブクラスを作る必要があるが、このライブラリを使うと blocksを書くだけでカスタムな描画が容易に行える。
上記blocksから複数のビューを作って貼りつけた例


このライブラリの面白いところはさらに UIImage と CALayerのインスタンスも作れるところ。
UIImage *image = [UIImage imageWithRenderBlock:renderBlock size:size];
FKRBlockDrawingLayer *layer = [FKRBlockDrawingLayer layerWithRenderBlock:renderBlock];
FKRBlockDrawingLayerはCALayerのサブクラス。

CG関数で描画した結果から容易にUIImageやCALayerが作れる。ちょっとしたCALayerのサブクラスを書くこともままあるので、blocksで描画を記述できるのは結構便利かも。

Readmeで紹介されているようにPaintCodeと一緒に使うとかなり強力かもしれない。



(参考)



- - -
今日は面白いアイディアの実装が多かった。こういう日は楽しい。


0 件のコメント:

コメントを投稿