3

私はこの素晴らしくエレガントなコードを使用して います。UIImageにエクスポートされるUITableViewのコンテンツ全体をキャプチャするためのオフスクリーン部分を含む、UIScrollViewのスクリーンショットを取得しています。

UIGraphicsBeginImageContextWithOptions(self.controller.tableView.contentSize, YES, 0);
{
    CGPoint savedContentOffset = self.controller.tableView.contentOffset;
    CGRect savedFrame = self.controller.tableView.frame;

    self.controller.tableView.contentOffset = CGPointZero;
    self.controller.tableView.frame = CGRectMake(0, 0, self.controller.tableView.contentSize.width, self.controller.tableView.contentSize.height);

    [self.controller.tableView.layer renderInContext: UIGraphicsGetCurrentContext()];
    image = UIGraphicsGetImageFromCurrentImageContext();

    self.controller.tableView.contentOffset = savedContentOffset;
    self.controller.tableView.frame = savedFrame;
}

UIGraphicsEndImageContext();

シミュレーターでは非常にうまく機能しますが、iOSデバイス(iphone 4s)でこのコードを実行すると、このメソッドが呼び出されると、次のエラーが大幅に増加します。

[self.controller.tableView.layer renderInContext: UIGraphicsGetCurrentContext()];

エラー:

Error: CGContextTranslateCTM: invalid context 0x2924b0
Error: CGContextDrawImage: invalid context 0x2924b0
Error: CGContextRestoreGState: invalid context 0x2924b0
Error: CGContextSaveGState: invalid context 0x2924b0
Error: CGContextScaleCTM: invalid context 0x2924b0
Error: CGContextClipToRect: invalid context 0x2924b0
etc...

このコードは、テーブルビューのコンテンツサイズがその範囲内にある場合にうまく機能しますが、その範囲よりも大きくなると(1ピクセルでも)、上記のエラーの無限のループに入ります。ただし、これはデバイスでのみ発生します。シミュレーターではありません。

何か案は?

4

1 に答える 1

8

[UIImage ..] resizableImageWithCapInsets] メソッドを使用してセル backgroundView に適用し、フレームを調整すると、シミュレーターではなく、実際のデバイスであらゆる種類のファンキーな問題が発生することがわかりました。

非推奨の [UIImage ..] stretchableImageWithLeftCapWidth: topCapHeight:] メソッドに戻すと解決しました。

于 2012-05-24T08:31:54.383 に答える