给屏幕外的UITableViewCell截屏

给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不在屏幕中时,截图会失败。解决方案是:

  1. 记录下当前UITableView的contentOffset
  2. 手动计算出目标cell的IndexPath。这里要注意,不能使用tableView.indexPath(for: cell)。因为目标cell在屏幕外,此函数会返回nil。
  3. 利用该IndexPath将目标cell移动到屏幕中
  4. 调用takeScreenshot函数截屏
  5. 根据记录下的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
    }

你可能感兴趣的:(给屏幕外的UITableViewCell截屏)