Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Take capture a view by SwiftUI
//
// ContentView.swift
// TryGeometryReader
//
// Created by satoutakeshi on 2019/12/07.
// Copyright © 2019 satoutakeshi. Licensed under MIT.
//
import SwiftUI
struct ContentView: View {
var body: some View {
ScrollView {
VStack {
Text("GeometryReader Get Grobal Origin")
GeometryRectangle(color: Color.pink)
GeometryRectangle(color: Color.red)
.offset(x: 10, y: 0)
ZStack {
GeometryRectangle(color: Color.blue)
.offset(x: 30, y: 0)
}
}
}
}
}
struct GeometryRectangle: View {
var color: Color
var body: some View {
GeometryReader { geometry in
VStack {
Button(action: {
let image = self.takeScreenshot(origin: geometry.frame(in: .global).origin, size: geometry.size)
print(image)
}) {
RoundedRectangle(cornerRadius: 20)
.fill(self.color)
.overlay(
VStack {
Text("X: \(Int(geometry.frame(in: .global).origin.x)) Y: \(Int(geometry.frame(in: .global).origin.y)) width: \(Int(geometry.frame(in: .global).width)) height: \(Int(geometry.frame(in: .global).height))")
.foregroundColor(.white)
Text("size: \(geometry.size.debugDescription)")
.foregroundColor(.white)
})}
}
}.frame(height: 100)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
extension UIView {
var renderedImage: UIImage {
// rect of capure
let rect = self.bounds
// create the context of bitmap
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
let context: CGContext = UIGraphicsGetCurrentContext()!
self.layer.render(in: context)
// get a image from current context bitmap
let capturedImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return capturedImage
}
}
extension View {
func takeScreenshot(origin: CGPoint, size: CGSize) -> UIImage {
let window = UIWindow(frame: CGRect(origin: origin, size: size))
let hosting = UIHostingController(rootView: self)
hosting.view.frame = window.frame
window.addSubview(hosting.view)
window.makeKeyAndVisible()
return hosting.view.renderedImage
}
}
@SatoTakeshiX

This comment has been minimized.

Copy link
Owner Author

@SatoTakeshiX SatoTakeshiX commented Dec 7, 2019

you get the image that is created by the button you tapped
スクリーンショット 2019-12-07 23 27 28

@DominatorVbN

This comment has been minimized.

Copy link

@DominatorVbN DominatorVbN commented May 14, 2020

Hey, I am trying this code in swift playground having some issue with UIGraphicsGetCurrentContext() it's returning nil. Could help me.

@andresitsu

This comment has been minimized.

Copy link

@andresitsu andresitsu commented Oct 6, 2020

Thank you Satoさん.
But I still have a question.
Now I have a ScrollView embedded inside a GeometryReader, and the content size of the ScrollView has a height that is greater than the size of the GeometryProxy, how can I get the full scrollable content be converted to image instead of the visible contents only?

@keatsp

This comment has been minimized.

Copy link

@keatsp keatsp commented Oct 18, 2020

This used to work amazing for my app. Thank you very much for that. However since iOS14 I get an error at self.layer.render(in: context). AttributeGraph precondition failure: setting value during update: 22552.

The app freezes and xCode says the typical Thread 1: signal SIGABRT

Any help would be greatly appreciated.

@wingovers

This comment has been minimized.

Copy link

@wingovers wingovers commented Dec 20, 2020

@keatsp can you post code somewhere? works fine for me

@claytonsulby

This comment has been minimized.

Copy link

@claytonsulby claytonsulby commented Apr 12, 2021

I get a similar issue. I am trying to take a screenshot of a view that is not being displayed. This is probably the issue. I was attempting to take a "preview" of a view to display in a context menu. I am getting this error:

2021-04-11 22:20:44.770952-0400 _____[1967:259741] [error] precondition failure: setting value during update: 764440
AttributeGraph precondition failure: setting value during update: 764440.

and

Thread 1: signal SIGABRT

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment