Ios 如何在Swift中拍摄UITableView中选定行的屏幕截图并将其保存为UIImage?
在我的Ios 如何在Swift中拍摄UITableView中选定行的屏幕截图并将其保存为UIImage?,ios,swift,uitableview,swift3,uiimage,Ios,Swift,Uitableview,Swift3,Uiimage,在我的Swift应用程序中,我有一个UITableView,它包含4个静态单元格,然后有不同数量的动态单元格。我只想拍一张静态单元格的截图 我找到了以下扩展: extension UITableView { var capturedImage : UIImage { UIGraphicsBeginImageContext(contentSize); scrollToRow(at: NSIndexPath(row: 0, section: 0) as Ind
Swift
应用程序中,我有一个UITableView
,它包含4个静态单元格,然后有不同数量的动态单元格。我只想拍一张静态单元格的截图
我找到了以下扩展:
extension UITableView {
var capturedImage : UIImage {
UIGraphicsBeginImageContext(contentSize);
scrollToRow(at: NSIndexPath(row: 0, section: 0) as IndexPath, at: UITableViewScrollPosition.top, animated: false)
layer.render(in: UIGraphicsGetCurrentContext()!)
let row = numberOfRows(inSection: 0)
let numberofRowthatShowinscreen = 4
let scrollCount = row / numberofRowthatShowinscreen
for i in 0 ..< scrollCount {
scrollToRow(at: NSIndexPath(row: (i+1)*numberofRowthatShowinscreen, section: 0) as IndexPath, at: UITableViewScrollPosition.top, animated: false)
layer.render(in: UIGraphicsGetCurrentContext()!)
}
let image:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext();
return image;
}
}
致:
然后它仍然需要整个
UITableView
的屏幕截图。是否有办法将其限制为仅前4行?在示例代码中,您正在图像上下文中呈现表视图的层。这将始终快照整个表视图。您可以采纳评论者的建议,在对表视图进行快照之前调整其单元格。或者,可以快照要渲染的单元的层。例如:
extension UITableView
{
func snapshotRows(at indexPaths: Set<IndexPath>) -> UIImage?
{
guard !indexPaths.isEmpty else { return nil }
var rect = self.rectForRow(at: indexPaths.first!)
for indexPath in indexPaths
{
let cellRect = self.rectForRow(at: indexPath)
rect = rect.union(cellRect)
}
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
guard let context = UIGraphicsGetCurrentContext() else { return nil }
for indexPath in indexPaths
{
let cell = self.cellForRow(at: indexPath)
cell?.layer.bounds.origin.y = self.rectForRow(at: indexPath).origin.y - rect.minY
cell?.layer.render(in: context)
cell?.layer.bounds.origin.y = 0
}
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
将仅快照特定的单元格。正如另一篇文章的答案所说,这只适用于重复使用单元格的可见单元格。为什么不简单地控制返回数据源的表视图数据源数组。在调用CaptureDimage之前,前缀(4)此方法在iOS 13中不适用于动态高度单元格。
let numberofRowthatShowinscreen = 3
extension UITableView
{
func snapshotRows(at indexPaths: Set<IndexPath>) -> UIImage?
{
guard !indexPaths.isEmpty else { return nil }
var rect = self.rectForRow(at: indexPaths.first!)
for indexPath in indexPaths
{
let cellRect = self.rectForRow(at: indexPath)
rect = rect.union(cellRect)
}
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
guard let context = UIGraphicsGetCurrentContext() else { return nil }
for indexPath in indexPaths
{
let cell = self.cellForRow(at: indexPath)
cell?.layer.bounds.origin.y = self.rectForRow(at: indexPath).origin.y - rect.minY
cell?.layer.render(in: context)
cell?.layer.bounds.origin.y = 0
}
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
let image = tableView.snapshotRows(at: Set([IndexPath(row: 0, section: 0), IndexPath(row: 0, section: 1)]))