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' 视图内部调用快照功能并且成功。

我认为这是正确的方法,但我也觉得可能还有另一种方法 (?)