Capture screenshot of UITableView/ScrollView incl. offscreen parts no longer works in iOS 13

I’m having an issue with capturing the image of my TableView including offscreen parts. I’m using gleb vodovozov’s idea and the code works on iOS versions prior to 13, but not on iOS 13.

I have carefully checked the code and cannot find any issues.

Any help is appreciated!

var image = UIImage()
    UIGraphicsBeginImageContextWithOptions(self.myTable.contentSize, false, UIScreen.main.scale)

    // save initial values
    let savedContentOffset = self.myTable.contentOffset
    let savedFrame = self.myTable.frame
    let savedBackgroundColor = self.myTable.backgroundColor

    // reset offset to top left point
    self.myTable.contentOffset = CGPoint(x: 0, y: 0)
    // set frame to content size
    self.myTable.frame = CGRect(x: 0, y: 0, width: self.myTable.contentSize.width, height: self.myTable.contentSize.height)
    // remove background
    self.myTable.backgroundColor = UIColor.clear

    // make temp view with scroll view content size
    // a workaround for issue when image on ipad was drawn incorrectly
    let tempView = UIView(frame: CGRect(x: 0, y: 0, width: self.myTable.contentSize.width, height: self.myTable.contentSize.height))

    // save superview
    let tempSuperView = self.myTable.superview
    // remove scrollView from old superview
    self.myTable.removeFromSuperview()
    // and add to tempView
    tempView.addSubview(self.myTable)

    // render view
    // drawViewHierarchyInRect not working correctly
    tempView.layer.render(in: UIGraphicsGetCurrentContext()!)
    // and get image
    image = UIGraphicsGetImageFromCurrentImageContext()!

    // and return everything back
    tempView.subviews[0].removeFromSuperview()
    tempSuperView?.addSubview(self.myTable)

    // restore saved settings
    self.myTable.contentOffset = savedContentOffset
    self.myTable.frame = savedFrame
    self.myTable.backgroundColor = savedBackgroundColor

    UIGraphicsEndImageContext()

    return image

I’m using gleb vodovozov’s idea to capture the image of my TableView including offscreen parts, but the superview doesn’t restore my TableView as its “before changes” position after using it to render an image in a tempView. This code works on iOS versions prior to 13, but not on iOS 13. I have checked the code carefully and cannot find any issues.

Any help is appreciated!

The issue is that after rendering the view in the tempView, the superview doesn’t restore the TableView to its “before changes” position. To fix this issue, you can add the following line of code right before restoring saved settings:

tempView.removeFromSuperview()

This will remove the tempView from the superview and restore the TableView to its original position.