美文网首页
给屏幕外的UITableViewCell截屏

给屏幕外的UITableViewCell截屏

作者: yzyanchao | 来源:发表于2018-10-16 18:21 被阅读0次

    给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截屏

          本文链接:https://www.haomeiwen.com/subject/bnahzftx.html