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

Posted

技术标签:

【中文标题】如何捕获 UITableView / UIScrollView 的完整内容的 UIImage 并使其在 ios 设备上工作【英文标题】:How do I capture UIImage of complete contents of UITableView / UIScrollView and make it work on an ios device 【发布时间】:2012-05-22 03:10:20 【问题描述】:

我正在使用这段非常优雅的代码Getting a screenshot of a UIScrollView, including offscreen parts 来捕获要导出到 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 个像素),它就会进入上述错误的无限循环。但这仅发生在设备上。不是模拟器。

有什么想法吗?

【问题讨论】:

【参考方案1】:

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

恢复到已弃用的 [UIImage ..] stretchableImageWithLeftCapWidth: topCapHeight:] 方法解决了它。

【讨论】:

今天花了几个小时。非常感谢。有谁知道这个问题是否已报告给 Apple?切换到不推荐使用的方法似乎是一个糟糕的长期解决方案。

以上是关于如何捕获 UITableView / UIScrollView 的完整内容的 UIImage 并使其在 ios 设备上工作的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有多个单元格原型的 UITableView 中捕获单元格数据?

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

使用 Swift 从 UITableView 捕获多个值

在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新。

如何从 UITableView 中删除一行

iphone dev - 如何捕获异常'NSRangeException'