2009-09-02 6 views
1

私は保存できる画像に基本的なUIListViewをレンダリングしたいと思います。 UIViewをイメージ(iphone/iPod Touch用)にレンダリングするためのコードがたくさん見つかりました。実際、以下のコードは他の投稿から引っ張ったもので、今使っています。問題は、メソッドが呼び出されたときに表示されないUIListViewから何も描画しないことです。iPhone UIListViewを画像にレンダリング(またはキャプチャ)

- (void)snapShotAction:(id)sender 
{ 
    CGRect screenRect = [[UIScreen mainScreen] bounds]; 
    UIGraphicsBeginImageContext(screenRect.size); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    [[UIColor blackColor] set]; 
    CGContextFillRect(ctx, screenRect); 

    //[self.view.layer renderInContext:ctx]; 
    [self.myTableView.layer renderInContext:ctx]; 

    UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext();  
    UIImageWriteToSavedPhotosAlbum(screenImage, nil, nil, nil); 

} 

だから私は、画像に(画面外の行を含む)を描画するために全体UIListViewを強制することができるという柔軟性が欲しいのですが、誰がそれが起こる作るためのいくつかの洞察力を持っていない場合、私は私の選択肢があると思います画像やgraphicscontextを作成し、リストのファックスを手動でレンダリングするだけです(それを行うためのサンプルコードへの参照は高く評価されます)。

私には別の考えがあります。おそらく私は別のUITableViewを使用して、下部または上部の棒(水平スペースを最大にするために)を使用してテーブル内のアイテムの数に基づいて行の高さを計算し、上記のコードを使用してキャプチャします。もちろん、テキストサイズが小さすぎて使用可能にならないうちに、リストが持つことができるアイテムの数には限界があります...

答えて

1

問題はUIListViewの仕組みにあります。メモリを節約するために、表示される直前までセルをレンダリングしないので、画面外にあるUIListViewCellはレンダリングさえできません。 UIListViewを掘り下げてコードをUIListViewに差し込んで、別の方法でレンダリングするのではない(おそらく良い考えではない)ので、リストをスクロールして一緒にステッチする必要があります。

これはおそらくうまくいかないかもしれないアイデアです:ウインドウの境界とすべての関連するビューを画面より大きくして、一度にUIListView全体を保持するのに十分な大きさにしてみてください。あなたがシミュレータ上で走っていると仮定すると、これはメモリを殺すべきではありません。しかし、私は、UIListViewがそれに惑わされるよりも賢く、画面のサイズに部分的にどのくらいのレンダリングをするかを基盤にしていると感じています。しかし、それはおそらくショットの価値がある。

+0

それも考えましたが、なぜそれがうまくいかないのかはあなたが正しいと思うので、私は時間を無駄にするとは思わないのです。私のリストは本質的に単なるテキスト行です(いくつかの行にイメージがあるかもしれません)。リストをイメージ・コンテキストに描画することを計画しています。リストは画面全体の高さよりも高くなる可能性があるので、アイテムの数で最大高さを分割し、配置と描画を開始する前に各行のバウンディングボックスを作成する必要があります。 – wkw

関連する問題