【发布时间】:2021-10-08 03:19:39
【问题描述】:
我正在尝试对 SwiftUI 视图进行快照,但是当我更新该视图(例如文本)并对视图进行快照时,我返回的图像来自默认视图(视图的先前渲染,而不是更新的视图)
在这个代码示例中,有一个 TextView 要被快照,当点击它时它会更改/更新,然后按下按钮应该保存新更新的 View 并更改 TextView,但它会保存旧版本。
视图扩展为快照视图:
extension View {
func snapshot() -> UIImage {
let controller = UIHostingController(rootView: self)
let view = controller.view
let targetSize = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
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)
}
}
}
ContentView 与按钮快照视图:
struct ContentView: View {
var view: some View = ScreenShot()
var body: some View {
VStack {
view
Button("Save Image") {
let image = view.snapshot()
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}
}
}
}
要快照和更新的视图:
struct ScreenShot: View {
@State var updateView = false
var body: some View {
Text("View to be snapshotted \(updateView ? "(Update)" : "")")
.tapGesture {
updateView.toggle()
}
}
}
【问题讨论】:
-
你能显示
ScreenShot的代码吗? -
您为“ContentView with button to snapshot View”和“View to be快照并更新”发布了完全相同的代码。
-
我的错,现在修复