返回
SwiftUI 100 天:保存滤镜后的图片
IOS
2023-09-29 17:43:00
在 SwiftUI 100 天之旅中,我们今天要解决一个小难题:在照片上应用滤镜后,如何保存最终效果。这个任务看似简单,但其实涉及到一些需要仔细处理的跨框架交互。
为了实现照片保存,我们需要使用 UIKit 中的 UIImageWriteToSavedPhotosAlbum() 函数。然而,这个函数的语法与 SwiftUI 的声明式风格不太兼容。为了解决这个问题,我们将采取一种间接的方式,使用 Combine 来桥接 SwiftUI 和 UIKit。
首先,我们创建一个 ObservableObject 来管理图片的保存状态:
class ImageSaver: ObservableObject {
@Published var isSaved = false
func saveImage(_ image: UIImage) {
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
isSaved = true
}
}
接下来,我们创建一个 SwiftUI View,用于显示保存按钮和处理保存逻辑:
struct SaveButtonView: View {
@ObservedObject var imageSaver = ImageSaver()
var body: some View {
Button(action: {
imageSaver.saveImage(filteredImage)
}) {
Text("Save")
}
.disabled(imageSaver.isSaved)
}
}
在这个 View 中,我们使用了一个 @ObservedObject 属性包装器来观察 ImageSaver 中 isSaved 属性的变化。当用户点击按钮时,我们会调用 imageSaver.saveImage() 方法,将处理后的图片保存到相册。
最后,我们在主 SwiftUI View 中包含 SaveButtonView:
struct ContentView: View {
var body: some View {
VStack {
// 滤镜处理逻辑
SaveButtonView()
}
}
}
通过这种方法,我们成功地将 UIKit 的图像保存功能集成到 SwiftUI 中,同时保持了 SwiftUI 的声明式编程风格。
现在,当用户应用滤镜后,他们可以点击 "保存" 按钮,将滤镜后的图片保存到相册,以便进一步编辑或分享。这个看似简单的功能,体现了 SwiftUI 与 UIKit 协同工作的强大之处。