用于截取整个 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
。
现在,UIView
将UITableView
的contentView
设置为Images
。
从UIView
获取截图。
【讨论】:
以上是关于用于截取整个 UITableView 的代码在 iOS 13 中不再起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中截取 UITableView 中选定行的屏幕截图并将其保存为 UIImage?
如何在Swift中的UITableView中截取所选行的屏幕截图并将其保存为UIImage?