【SwiftUI】画像をカメラロールに保存する。

SwiftUI で画像をカメラロールに保存する方法を紹介します。

基本的な機能だけど SwiftUI だとこんな感じで実装できるという一例です。

SwiftUI で画像を保存後アラートを出す流れ

今回はボタンを押して画像が保存されたらアラートが表示されるというよくありがちな流れを SwiftUI で実装します。


struct TmpView11: View {

    @State var showAlert = false
    
    var uiImage = UIImage(named: "hoge")
    
    var body: some View {
       
        Button(action: {
            ImageSaver($showAlert).writeToPhotoAlbum(image: uiImage!)
          }){
              Text("Click here")
          }.alert(isPresented: $showAlert) {
            Alert(
                title: Text("画像を保存しました。"),
                message: Text(""),
                dismissButton: .default(Text("OK"), action: {
                    showAlert = false
                }))
          }
    }
}

この様に ImageSaver クラスを作ってそこに Binding 変数を渡しています。ImageSaver の中で画像が保存された時にこの変数が true になる様にすればアラートが出てくれます。

UIImageWriteToSavedPhotosAlbum を呼ぶ ImageSaver クラス

ではこの ImageSaver クラスの実装は以下の様になります。

class ImageSaver: NSObject {
    @Binding var showAlert: Bool
    
    init(_ showAlert: Binding<Bool>) {
        _showAlert = showAlert
    }
    
    func writeToPhotoAlbum(image: UIImage) {
        UIImageWriteToSavedPhotosAlbum(image, self, #selector(didFinishSavingImage), nil)
    }

    @objc func didFinishSavingImage(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
        
        if error != nil {
            print("保存に失敗しました。")
        } else {
            showAlert = true
        }
    }
}

以上です。今回はしっかりエラーハンドリングしないで print しただけですがエラーのときは違うアラートが出る様にした方が親切でしょう。

学習書籍

毎回これらの本を紹介していますが、ネットの情報だけでなく実際に本を読んで体系的な知識を身に付けると技術力が上がる、そんな気がします。 

SwiftUI に関する書籍をいくつかピックアップしました。参考にしてください。


詳細! SwiftUI iPhoneアプリ開発入門ノート iOS 13 + Xcode11対応

詳細! SwiftUI iPhoneアプリ開発入門ノート[2020] iOS 14+Xcode 12対応

↑ Swift 3 だった頃同じシリーズを読んでました。当時学生だったので図書館に頼んだら買ってくれた思い出が。。このシリーズ中々わかりやすかったです。

他にもいくつか紹介しておきます。


SwiftUI 徹底入門

1人でアプリを作る人を支えるSwiftUI開発レシピ (技術の泉シリーズ(NextPublishing))

基礎から学ぶ SwiftUI