给屏幕外的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
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容