Skip to content

Instantly share code, notes, and snippets.

@Codelaby
Created March 19, 2025 08:35
Show Gist options
  • Save Codelaby/db8b7b47c96d1d47c8b89b23fe021e57 to your computer and use it in GitHub Desktop.
Save Codelaby/db8b7b47c96d1d47c8b89b23fe021e57 to your computer and use it in GitHub Desktop.
snapshot View to image in swift
/// Renders `View` as `UIImage`.
extension View {
func snapshot(renderOnce: UnsafeMutablePointer<Bool>? = nil) -> UIImage? {
if let flag = renderOnce, flag.pointee {
return nil
}
renderOnce?.pointee = true
let renderer = ImageRenderer(content: self)
renderer.scale = UIScreen.main.scale
return renderer.uiImage
}
}
@MainActor
final class ViewSnapshotter<V: View> {
private let view: V
private var didRender = false
init(view: V) {
self.view = view
}
/// Continiously renders the view as a UIImage.
@inlinable
func render() -> UIImage? {
view.snapshot()
}
/// Renders the view as a UIImage once and then never again.
@inlinable
func renderOnce() -> UIImage? {
view.snapshot(renderOnce: &didRender)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment