在這里,我從鏈接中獲取影像
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()
}
}
在這里,我通過鏈接顯示收到的照片并嘗試通過 .contextMenu
VStack {
CustomImageView(urlString: "https://stackoverflow.design/assets/img/logos/so/logo-stackoverflow.png")
.contextMenu {
Button(action: {
}) {
HStack {
Text("Save image")
Image(systemName: "square.and.arrow.down.fill")
}
}
}
}
當您單擊照片時,會.contextMenu打開并顯示保存按鈕,但照片未保存,我該怎么辦?
uj5u.com熱心網友回復:
在您的按鈕操作中添加
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://stackoverflow.design/assets/img/logos/so/logo-stackoverflow.png", imageLoader: imageLoader)
.contextMenu {
Button(action: {
UIImageWriteToSavedPhotosAlbum(imageLoader.image, nil, nil, nil)
}) {
HStack {
Text("Save image")
Image(systemName: "square.and.arrow.down.fill")
}
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/416286.html
標籤:
