他の UIView の内容を表示位置を加味して自分自身に描画する : Objective-C プログラミング

PROGRAM


他の UIView の内容を frame.origin を加味して描画する

Objective-C では、他の UIView の描画内容を、自分自身に簡単に描画することが可能です。

単純な方法としては 他の UIView の内容を自分自身に描画する で記した方法がありますけど、この方法だと、別のビューに設定されている frame の origin は考慮されずに、左上を原点にして内容が描画される様子です。

 

今回は、別のビューの frame.origin も考慮して、自分自身の任意の場所に描画したかったので、その実現方法を調べてみました。

たとえば、label 変数に格納した UILabel の内容を自分自身のコンテキストに、ラベルの表示位置 (label.frame.origin) も加味して絵として描画したい場合には、次のような感じにすれば良さそうです。

// 現在のコンテキストを取得します。(UIView の drawrect: メソッド内で実行します)

CGContextRef context = UIGraphicsGetCurrentContext();

 

// 描画で使用する CGLayer を用意します。

CGLayerRef workLayer;

CGContextRef workContext;

 

workLayer = CGLayerCreateWithContext(context, label.rect.size, NULL);

workContext = CGLayerGetContext(workLayer);

 

// 用意した CGLayer のコンテキストに、UIView(ここでは UILabel)の内容を描画します。

[label.layer renderInContext:workContext];

 

// CGLayer の内容を、現在のコンテキストに frame.origin を加味して描画します。

CGContextDrawLayerInRect(context, rect, workLayer);

 

// 使い終わった CGLayer を解放します。

CGLayerRelease(workLayer);

CALayer を CGLayer に簡単に変換できれば最初から CGContextDrawLayerInRect だけですむので簡単なはずなですけど、とりあえず CALayer と CGLayer はトールフリーではないようでした。

変換関数も見つけられなかったので、CGLayer のコンテキストへ CALayer を描画する方法を採ってみています。

 

ともあれ、このようにすることで、label.frame の位置 (origin) とサイズ (size) を加味して、適切な場所に label の内容をビットマップで描画することができました。

[ もどる ]