【发布时间】: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