如何捕获UITableView / UIScrollView的完整内容的UIImage,并使其在iOS设备上工作

我正在使用这个非常优雅的一段代码获取一个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像素),它就会进入上述错误的无限循环。 但是这只发生在设备上。 不是模拟器。

有任何想法吗?

事实certificate,使用[UIImage ..] resizableImageWithCapInsets]方法,并将其应用到单元格backgroundView和调整框架导致各种各样的质朴坏事发生在实际的设备,而不是模拟器。

恢复到不推荐的[UIImage ..] stretchableImageWithLeftCapWidth:topCapHeight:]方法解决了它。