用于截取整个 UITableView 的代码在 iOS 13 中不再起作用

Posted

技术标签:

【中文标题】用于截取整个 UITableView 的代码在 iOS 13 中不再起作用【英文标题】:Code to make screenshot of an entire UITableView doesn't work anymore in iOS 13 【发布时间】:2019-09-25 04:21:26 【问题描述】:

多年来,我一直使用下面的代码来截取 UITableView(包括隐藏行)的屏幕截图并将其保存到用户的手机图库或分享。

自从他们更新到 ios 13 后,它不再工作了,它只捕获表格的可见部分,将其底部留空。

-(UIImage *)imageFromCurrentTable

    CGRect frame = self.tableView.frame;
    frame.size.height = self.tableView.contentSize.height;
    self.tableView.frame = frame;
        UIGraphicsBeginImageContext(self.tableView.bounds.size);
    [self.tableView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();    
    NSData * data = UIImagePNGRepresentation(image);
    return [UIImage imageWithData:data];

iOS 13 发生了什么变化?如何更新此代码? (代码是 Obj-C,但我也会接受快速的答案!)

【问题讨论】:

我有点惊讶这完全有效(renderInContext 会触发所有必要的UITableViewDataSource 调用似乎不太可能)。我可能会尝试临时调整表格视图的frame(完成后重置它)以包含整个contentSize,然后调用drawviewhierarchyinrect:afterScreenUpdates:。即使这样也只有在单元格大小固定时才有效。 在 iOS 13 之前它运行得非常顺利。其中一件你甚至不问为什么!将尝试您的解决方案 我使用了这个解决方案,似乎可以工作,但它很丑***.com/a/36028210/1187692 是的,这个答案虽然看起来很丑陋,但正是人们应该做的事情。单元格被重用,例如,您不能仅仅绘制一个 tableview 并期望屏幕外单元格的行正确呈现(因为这些单元格的单元格已被重用于当前可见的单元格)。您确实需要遍历单元格并手动绘制它们。顺便说一句,即使这是过度简化,例如,如果单元格是动态大小的,因为 contentSize 正在使用尚未呈现的行的估计行高。 另一个警告:如果在视网膜设备上,这将呈现低分辨率、非视网膜尺寸的图像。也许这没关系,但只是为了警告你。通常你会使用UIGraphicsBeginImageContextWithOptions,传递0作为比例,来捕捉完整的分辨率。这取决于生成图像的预期用途。 【参考方案1】:

我遇到过这个问题。由于单元重用,UIGraphicsGetImageFromCurrentImageContext 无法生成完整的UITableView 结构。

一种方式 [非有效方式]:

cellForRowAtIndexPath 中,我们可以获取UITableViewCell 使用的哪个UITableViewCell。将该单元格存储在 [Int: UITableViewCell] 中。 从UITableViewCell.contentView获取截图。 将该屏幕截图的图像作为子视图一一添加到UIView。 现在,UIViewUITableViewcontentView 设置为Images。 从UIView获取截图。

【讨论】:

以上是关于用于截取整个 UITableView 的代码在 iOS 13 中不再起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中截取 UITableView 中选定行的屏幕截图并将其保存为 UIImage?

利用Chrome浏览器的开发者工具截取整个页面

如何在Swift中的UITableView中截取所选行的屏幕截图并将其保存为UIImage?

截取整个页面[重复]

导航到另一个 ViewController 时 UITableView 行有问题

UITableView 单元格折叠动画看起来很糟糕