Search code examples
iosswiftuiviewuikituigraphicscontext

Take a screenshot with background image - iOS


I want to take a screenshot. In this screenshot, I want the text and image in it. However, I am having an issue because when I take a screenshot, I only see the text but not the image.

I think the problem is that clearContainerView only contains the text but not the image. I can't put the image inside of clearContainerView because I want the image to stretch the entire screen... and I want the text centered between the title and tab bar (as shown with green square above).

My code and pictures are below:

This is my current layout in Storyboard: enter image description here

This is what I want a screenshot of: enter image description here

This is the screenshot that I get: enter image description here

This is my code:

@IBOutlet weak var clearContainerView: UIView!

@IBAction func takeScreenshotTapped(_ sender: UIButton) {
    let screenshot = clearContainerView.screenshot()
    print(screenshot)
}

extension UIView {
    func screenshot() -> UIImage {
        let image = UIGraphicsImageRenderer(size: bounds.size).image { _ in
            drawHierarchy(in: CGRect(origin: .zero, size: bounds.size), afterScreenUpdates: true)
        }

        return image
    }
}

Any suggestions on how to do this?


Solution

  • You can use the following method on your controller view to get the portion of clearContainerView which will be a snapshot view. Then you can use that view object and take a screenshot of it.

    resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets:
    

    You have to pass the rect which will is your clearContainerView frame. You can pass zero insets in case you don't want any stretchable content. It return a view object which will contain your imageView portion + your complete clearContainerView. Then you can use the returned view and take its screen shot.

    I tried with the following.

    My original view.

    enter image description here

    The screenshot

    enter image description here