UIGraphicsGetImageFromCurrentImageContext() returning blank image in UITableViewCell

Viewed 1057

I've been successfully using the function below to take snapshots of UIViews, however, now that I'm using it inside a UITableViewCell, it no longer works.

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
    }

Here is a trimmed down version of the function I'm using to populate the 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
    }

In the above tableView function, I'm programmatically creating a new view to replicate cell.previewBoard, but I also tried directly snapshotting cell.previewBoard and that didn't work either. I think the issue has something to do with the timing of the UITableViewCell loading.

I'm also 100% positive that the function is returning an image (but a blank one) and that it's where I'm intending it to be. If I change UIGraphicsBeginImageContextWithOptions(rawView.bounds.size, false, 0) to UIGraphicsBeginImageContextWithOptions(rawView.bounds.size, true, 0), the returned image shows up as entirely black.

As one final note, I discovered that boardPreviewPicture.snapshotView(afterScreenUpdates: true) would return an image, but it made scrolling through the UITableView very slow. Maybe there is another workaround where I can use snapshotView() instead.

1 Answers
Related