如何在iOS设备上捕获UITableView/UIScrollView的完整内容并生成UIImage?

3

我正在使用这段非常优雅的代码获取包括屏幕外部分在内的UIScrollView的截图,以便将整个UITableView的内容导出为UIImage。

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个像素),它就会进入上述错误的无限循环。但这只会在设备上发生,而不会在模拟器上发生。

有什么想法吗?

1个回答

8

事实证明,使用[UIImage ..]resizableImageWithCapInsets]方法并将其应用于单元格backgroundView并调整框架会在实际设备上导致各种奇怪的错误,但这些错误在模拟器中不会发生。

回退到弃用的[UIImage ..]stretchableImageWithLeftCapWidth: topCapHeight:]方法解决了这个问题。


1
今天花了几个小时在这上面。非常感谢。有人知道这个问题是否已经向苹果报告了吗?切换到一个不推荐使用的方法似乎是一个不好的长期解决方案。 - Billy Lazzaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接