我正在使用这段非常优雅的代码来获取UIScrollView的屏幕截图,包括屏幕外部分,以捕获要导出到UIImage的UITableView的全部内容。
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 个像素(,它就会进入上述错误的无限循环。但这只发生在设备上。不是模拟器。
有什么想法吗?
事实证明,使用 [UIImage ..] resizeableImageWithCapInsets] 方法并将其应用于单元格背景视图并调整帧会导致各种时髦的坏事发生在实际设备上,而不是模拟器上。
恢复到已弃用的[UIImage ..] stretchableImageWithLeftCapWidth: topCapHeight:]方法解决了它。