保存照片

Save photo SwiftUI

这里我从 link

中获取图像
struct CustomImageView: View {
    var urlString: String
    @ObservedObject var imageLoader = ImageLoaderService()
    @State var image: UIImage = UIImage()
    
    var body: some View {
        Image(uiImage: image)
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(width:100, height:100)
            .onReceive(imageLoader.$image) { image in
                self.image = image
            }
            .onAppear {
                imageLoader.loadImage(for: urlString)
            }
    }
}

class ImageLoaderService: ObservableObject {
    @Published var image: UIImage = UIImage()
    
    func loadImage(for urlString: String) {
        guard let url = URL(string: urlString) else { return }
        
        let task = URLSession.shared.dataTask(with: url) { data, response, error in
            guard let data = data else { return }
            DispatchQueue.main.async {
                self.image = UIImage(data: data) ?? UIImage()
            }
        }
        task.resume()
    }
    
}

这里我显示link收到的照片,并尝试通过.contextMenu

保存
  VStack {

            CustomImageView(urlString: "https://Whosebug.design/assets/img/logos/so/logo-Whosebug.png")
                .contextMenu {
                    
                  Button(action: {
 
                    }) {
                        HStack {
                            
                            Text("Save image")
                            Image(systemName: "square.and.arrow.down.fill")
                            
                        }
                    }
                }
            }

当您点击照片时,.contextMenu 打开并带有保存按钮,但照片没有保存,我该怎么办?

在您的按钮操作中添加

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)

其中 image 是一个 UIImage,所以你需要从你的模型中传递图像并将其传递给上面的代码片段。

完整代码:

struct CustomImageView: View {
    var urlString: String
    @ObservedObject var imageLoader: ImageLoaderService
    @State var image: UIImage = UIImage()
    var body: some View {
        Image(uiImage: image)
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(width:100, height:100)
            .onReceive(imageLoader.$image) { image in
                self.image = image
            }.onAppear {
                imageLoader.loadImage(for: urlString)
            }
    }
}

 class ImageLoaderService: ObservableObject {
    @Published var image: UIImage = UIImage()
    func loadImage(for urlString: String) {
        guard let url = URL(string: urlString) else {return}
        let task = URLSession.shared.dataTask(with: url) { data, response, error in
            guard let data = data else {return}
            DispatchQueue.main.async {
                self.image = UIImage(data: data) ?? UIImage()
            }
        }
        task.resume()
    }
}

struct ContentView: View {
    @ObservedObject var imageLoader = ImageLoaderService()
    var body: some View {
        VStack {
            CustomImageView(urlString: "https://Whosebug.design/assets/img/logos/so/logo-Whosebug.png", imageLoader: imageLoader)
                .contextMenu {
                    Button(action: {
                        UIImageWriteToSavedPhotosAlbum(imageLoader.image, nil, nil, nil)
                    }) {
                        HStack {
                            Text("Save image")
                            Image(systemName: "square.and.arrow.down.fill")

                        }
                    }
                }
        }
    }
}