【问题标题】:Code to make screenshot of an entire UITableView doesn't work anymore in iOS 13用于截取整个 UITableView 的代码在 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 之前它运行得非常顺利。其中一件你甚至不问为什么!将尝试您的解决方案
  • 我使用了这个解决方案,似乎可以工作,但它很丑stackoverflow.com/a/36028210/1187692
  • 是的,这个答案虽然看起来很丑陋,但正是人们应该做的事情。单元格被重用,例如,您不能仅仅绘制一个 tableview 并期望屏幕外单元格的行正确呈现(因为这些单元格的单元格已被重用于当前可见的单元格)。您确实需要遍历单元格并手动绘制它们。顺便说一句,即使这是过度简化,例如,如果单元格是动态大小的,因为 contentSize 正在使用尚未呈现的行的估计行高。
  • 另一个警告:如果在视网膜设备上,这将呈现低分辨率、非视网膜尺寸的图像。也许这没关系,但只是为了警告你。通常你会使用UIGraphicsBeginImageContextWithOptions,传递0作为比例,来捕捉完整的分辨率。这取决于生成图像的预期用途。

标签: objective-c uitableview ios13 uigraphicscontext


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多