我已成功使用下面的函数拍摄UIViews的快照,但是,现在我在UITableViewCell中使用它,它不再有效。
static func pictureTaker(_ rawView: UIView) -> UIImageView {
UIGraphicsBeginImageContextWithOptions(rawView.bounds.size, false, 0)
rawView.drawHierarchy(in: rawView.bounds, afterScreenUpdates: true)
let screenshot = UIGraphicsGetImageFromCurrentImageContext();
let viewImage = UIImageView(image: screenshot)
UIGraphicsEndImageContext();
viewImage.frame = rawView.frame
return viewImage
}
这是我用来填充UITableViewCell的函数的精简版。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = gamesHolder.dequeueReusableCell(withIdentifier: textCellIdentifier, for: indexPath) as! StandardGameCell
let row = indexPath.row
let boardPreviewTemplate = UIView(frame: CGRect(x: 0, y: 0, width: cell.previewBoard.frame.width, height: cell.previewBoard.frame.height))
GameManagement.setupBoard(boardPreviewTemplate, boardItems: gamesArray[row].board)
let gamePicture = PageManagement.pictureTaker(boardPreviewTemplate)
gamePicture.frame = CGRect(x: 0, y: 0, width: gamePicture.frame.width, height: gamePicture.frame.height)
//Removing preview board items and replacing with picture
cell.previewBoard.subviews.forEach({ $0.removeFromSuperview() })
cell.previewBoard.addSubview(gamePicture)
return cell
}
在上面的tableView
函数中,我是以编程方式创建一个新视图来复制cell.previewBoard
,但我也尝试直接快照cell.previewBoard
,但这也不起作用。我认为这个问题与UITableViewCell加载的时间有关。
我也100%肯定该功能正在返回一个图像(但是一个空白的图像)并且它是我想要它的地方。如果我将UIGraphicsBeginImageContextWithOptions(rawView.bounds.size, false, 0)
更改为UIGraphicsBeginImageContextWithOptions(rawView.bounds.size, true, 0)
,则返回的图片将显示为完全黑色。
最后一点,我发现boardPreviewPicture.snapshotView(afterScreenUpdates: true)
将返回一个图像,但它在UITableView中滚动非常慢。也许还有另一种解决方法,我可以使用snapshotView()
代替。
答案 0 :(得分:2)
我遇到了同样的问题。我注意到,在UIGraphicsBeginImageContextWithOptions
内调用tableView(_:cellForRowAt:)
时,UIGraphicsGetImageFromCurrentImageContext()
的结果为空。请注意,在文档中声明UIGraphicsGetImageFromCurrentImageContext
:
可以从您应用的任何主题调用此函数。
但是,我发现的解决方案是在主线程中调用它。在你的情况下,也许你可以做类似的事情:
DispatchQueue.main.async {
let gamePicture = PageManagement.pictureTaker(boardPreviewTemplate)
gamePicture.frame = CGRect(x: 0, y: 0, width: gamePicture.frame.width, height: gamePicture.frame.height)
//Removing preview board items and replacing with picture
cell.previewBoard.subviews.forEach({ $0.removeFromSuperview() })
cell.previewBoard.addSubview(gamePicture)
}