给UITableViewCell截屏是一个比较普通的需求,代码如下:
func takeScreenshot(cell: UITableViewCell) -> UIImage {
UIGraphicsBeginImageContextWithOptions(cell.bounds.size, true, UIScreen.main.scale)
cell.drawHierarchy(in: cell.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext() ?? UIImage()
UIGraphicsEndImageContext()
return image
}
但是,如果传入的cell不在屏幕中时,截图会失败。解决方案是:
- 记录下当前UITableView的contentOffset
- 手动计算出目标cell的IndexPath。这里要注意,不能使用tableView.indexPath(for: cell)。因为目标cell在屏幕外,此函数会返回nil。
- 利用该IndexPath将目标cell移动到屏幕中
- 调用takeScreenshot函数截屏
- 根据记录下的contentOffset,再将UITableView移动回原来的位置
代码如下:
func screenshot(cell: UITableViewCell) -> UIImage {
// model.indexPathFor(cell:) 是从本地数据中算出目标cell的IndexPath的方法
guard let indexPath = model.indexPathFor(cell: UITableViewCell) else {
return UIImage()
}
let currentOffset = tableView.contentOffset
tableView.scrollToRow(at: indexPath, at: .top, animated: false)
let image = takeScreenShot(cell: cell)
tableView.setContentOffset(currentOffset, animated: false)
return image
}