返回

SwiftUI 100 天:保存滤镜后的图片

IOS

在 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 协同工作的强大之处。