元ネタはここです。
まず、View に extension を作ります。
extension View {
func snapshot() -> UIImage {
let controller = UIHostingController(rootView: self)
let view = controller.view
let targetSize = controller.view.intrinsicContentSize
view?.bounds = CGRect(origin: .zero, size: targetSize)
view?.backgroundColor = .clear
let renderer = UIGraphicsImageRenderer(size: targetSize)
return renderer.image { _ in
view?.drawHierarchy(in: controller.view.bounds, afterScreenUpdates: true)
}
}
}
使用例
@State var anyView = AnyView()
Button(action: {
let image = anyView.snapshot()
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}, label: {
Text("Get Snapshot")
})
カメラロールに画像を保存するには Info.plist に "Privacy - Photo Library Additions Usage Description" を設定する必要があります。