他の 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 の内容をビットマップで描画することができました。
[ もどる ]