如何在Swift中的UITableView中截取所选行的屏幕截图并将其保存为UIImage?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Swift中的UITableView中截取所选行的屏幕截图并将其保存为UIImage?相关的知识,希望对你有一定的参考价值。

在我的Swift应用程序中,我有一个包含4个静态细胞的UITableView,然后它有不同数量的动态细胞。我想仅截取静态单元的截图。

我找到了以下扩展名:

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;
    }
}

它来自这个问题How to render a whole UITableView as an UIImage in iOS?

但问题是,即使我改变了:

let numberofRowthatShowinscreen = 4

至:

let numberofRowthatShowinscreen = 3

然后它仍然需要整个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
    }
}

用法:

let image = tableView.snapshotRows(at: Set([IndexPath(row: 0, section: 0), IndexPath(row: 0, section: 1)]))

只会快照特定的单元格。正如另一篇文章的答案所说,这只适用于重复使用细胞的可见细胞。

以上是关于如何在Swift中的UITableView中截取所选行的屏幕截图并将其保存为UIImage?的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 中的 viewdidload 上选择 Cells,基于 String Array (Swift)

如何在 swift 中增加 ScrollView 中的 UITableView 高度

如何在 swift iOS 中的 UIAlertcontroller 中显示 UITableview?

UIView中的UITableView与swift

如何在swift 3中的UITableView中进行变量和使用

如何在 uilabel 中使用多行并根据 Swift 中的标签高度自动扩展 uitableview 行高?