2012-04-03 4 views
5

私は修正できないような問題があります。私はUIScrollView(オフスクリーンのコンテンツを含む)のスクリーンショットを撮ろうとしていますが、ビューが長い場合、renderInContextはスクロールビューのすべてのコンテンツを取得しません。生成されたイメージのサイズは正確ですが、レンダリングされたデータにはディスプレイのチャンクがないように見え、チャンクがあるはずの空白が残ります。失われたブロックは、私が "scaleToFit"に設定されていると思うUIWebViewのコンテンツからです。これは毎回起こるわけではなく、UIWebViewの高さがかなり高い場合にのみ発生するようです。私は、UIWebViewのスケーリングに関係していると思います。iOSデバイスでスクリーンショットを撮るときに、データの欠落した「ブロック」を修正するにはどうすればよいですか?

下のcoreLayer.bounds CGRECTを調整すると、結果が異なる場合があります。欠落しているブロックが下部にあり、時には画像の中央にあることがあります。

私はこのquestionの受け入れ答えからコードを開始し、私はカットオフの問題に気づいたとき、私は次のようにそれを修正:

UIGraphicsBeginImageContext(scrollView.contentSize); 
{ 
    CGPoint savedContentOffset = scrollView.contentOffset; 
    CGRect savedFrame = scrollView.frame; 


    //hide the scroll bars 
    [scrollView setShowsHorizontalScrollIndicator:NO]; 
    [scrollView setShowsVerticalScrollIndicator:NO]; 


    scrollView.contentOffset = CGPointZero; 
    scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height); 
    //adjust layer for cut-off 
    CALayer *coreLayer = scrollView.layer; 
    coreLayer.bounds = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height); 
    [coreLayer renderInContext: UIGraphicsGetCurrentContext()]; 
    //[scrollView.layer renderInContext: UIGraphicsGetCurrentContext()]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 

    scrollView.contentOffset = savedContentOffset; 
    scrollView.frame = savedFrame; 


    //reset the scroll bars to default 
    [scrollView setShowsHorizontalScrollIndicator:YES]; 
    [scrollView setShowsVerticalScrollIndicator:YES]; 
} 
UIGraphicsEndImageContext(); 

カットオフ調整は、(一部のビューでそれを固定助けました)しかし、UIScrollViewがかなり長いときにはまだそのカットオフになっています。私はしばらくの間これに取り組んできましたが、修正を見つけることができません。何か提案はありますか?誰もこの問題に遭遇しましたか?

助けてください!

+0

考えてみましたが、一時的にscrollView.frame.sizeをscrollView.contentSizeに変更することを検討しましたか?これは、フレームに収まるように、すべてのセルを読み込むテーブルビューを必要とします(テーブルビューはフレームの外で、画面外ではなくコンテンツをキャッシュします)。 – Kalle

答えて

0

スクロールビューはテーブルビューですか?そうであれば、画面上のコンテンツは実際にはセルの再利用のために実際に存在します。通常のスクロールビューであっても、スクロールビューの一部のオフスクリーン要素を描画しないことで、OSが最適化を行っている可能性があります。それが本当であれば、一度に1画面ずつスクロールし、それぞれのコンテキストを正しい位置にコンテキストでレンダリングすることで、これを機能させることができます。

+0

うん、それはまさにそれがやっていることであり、実際にどれくらいレンダリングされているか把握しなければならなかった。私が見つけたのは、通常は一度に見ることができる3つの「ブロック」があるということでした。 UIScrollViewをスクロールすると、スクロールの方向に基づいてコンテンツが再描画されます。だから私は3つのパネル領域のスクリーンショットを取って、次に見ることができる3つのパネルなどにスクロールします。 – thiesdiggity

+0

あなたのコードに数字3がハードコードされていないことを確認してください。オフスクリーンで描画される行の数は、使用可能なRAMまたはGPUの機能に応じて、新しいOSリリースで変更されるか、または別のデバイスで異なる可能性がある実装の詳細です。 –

関連する問題