SwiftUI 和 UIGraphicsImageRenderer 没有快照更新视图
SwiftUI and UIGraphicsImageRenderer not snapshotting updated View
我正在尝试对 SwiftUI 视图进行快照,但是当我更新该视图(例如文本)并对该视图进行快照时,我得到的图像来自默认视图(视图的先前渲染,而不是更新了一个)
在此代码示例中,有一个 TextView 需要进行快照,当点击它时 changes/updates,然后按下按钮应该保存新更新的 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' 视图内部调用快照功能并且成功。
我认为这是正确的方法,但我也觉得可能还有另一种方法 (?)
我正在尝试对 SwiftUI 视图进行快照,但是当我更新该视图(例如文本)并对该视图进行快照时,我得到的图像来自默认视图(视图的先前渲染,而不是更新了一个)
在此代码示例中,有一个 TextView 需要进行快照,当点击它时 changes/updates,然后按下按钮应该保存新更新的 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' 视图内部调用快照功能并且成功。
我认为这是正确的方法,但我也觉得可能还有另一种方法 (?)