頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


なぜかrenderInContext:でコールされるCATiledLayerの描画部分

「赤ちゃんの成長グラフ」アプリのスクリーンショットをアプリ内で作成しようとしたけど、なぜかうまくいかないのでいろいろと調べてみました、というお話。

拡大したグラフ

このアプリで拡大したグラフを表示するのにUIScrollViewとCATiledLayerクラスを使っています(拡大前は単なるUIViewオブジェクトを表示)。
拡大するのをUIScrollViewクラスが担当。
グラフは複数の"タイル"に分けられていて、表示すべきタイルごとにCATiledLayer内のdrawRect:がコールされます。

スクショ撮影の流れはこんな感じ:
CGRect rect = [[UIScreen mainScreen] bounds];  
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);    

UIApplication *app = [UIApplication sharedApplication]; 
[app.keyWindow.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();  
UIGraphicsEndImageContext();

ここでrenderInContext:というメソッドがありますが、これを実行するとなぜかCATiledLayer内のdrawRect:メソッドが1度だけコールされているのです。
他のUIViewクラスのdrawRect:等はコールされないのに(上記画像を描くのにCATiledLayerだけでなくUIViewクラスのレイヤーなんかもあったりします)です。
どうもCATiledLayerについてはここで再描画されており、その画像がスクリーンショットに使用されていました。

不思議なのは複数のタイルで描かれていても、なぜかコールは1回だけで、しかもdrawRect:の引数となるrect(つまり表示エリア)が表示されているエリアそのまんま、という当方の意図していない値(もともとはタイルごとに描いていたわけだから)なので正常に描くことができませんでした。

これがバグなのか仕様なのかよくわかりませんが、とりあえずコールされるのが1回、引数のrectがどういうものかわかったので、CATiledLayer内のdrawRect:メソッド内をスクショ撮影時には別処理にして描くことで対応しました。



<< なぜかUITextViewに影ができない  TopPage  画像に影を付けたいのでいろいろプロパティをいじってみた >>

コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

2012.06.13      編集


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/495-90f8ebeb




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad