17849


iOSにて、あるボタンを押して「写真」配下にアルバムを作成し、そのアルバム内に撮影した写真を保存する機能を加えようとしています。

ただ、アルバムの作成はできたものの、そのアルバムを指定して写真を保存するということができていません。(下記では、「カメラロール」に保存されてしまいます。)

こちらの方法について見つけることができず、ご存知のかたいらっしゃいましたら、ご教授いただければ幸いです。

なお、現在作成しているコードは下記のとおりです。

【アルバムを作成する】

[code]

    @IBAction func tapAddBookBtn(sender: AnyObject) {
        var titleTextField: UITextField?
    
        //タイトル入力をpopupで求める
        let alertController: UIAlertController = UIAlertController(title: "タイトル登録", message: "本のタイトルを入力してください", preferredStyle: .Alert)
    
        //cancelボタン
        let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
            print("Pushed CANCEL")
        }
        alertController.addAction(cancelAction)
    
        //タイトル登録ボタン
        let registAction: UIAlertAction = UIAlertAction(title: "登録", style: .Default) { action -> Void in
            print("regist")
            print(titleTextField?.text)
    
            let albumName :String = readPhotoAlbum.applicationName + (titleTextField?.text)!
    
            PHPhotoLibrary.sharedPhotoLibrary().performChanges({ () -> Void in
                self.request = PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(albumName)
                },completionHandler: { (isSuccess, error) -> Void in
                    if isSuccess == true {
                        print("Success!")
                    }
                    else{
                        print("error occured")
                    }      
            })    
        }
        alertController.addAction(registAction)
    
        alertController.addTextFieldWithConfigurationHandler { textField -> Void in
            titleTextField = textField
            textField.placeholder = "Title"
        }
    
        presentViewController(alertController, animated: true, completion: nil)
    
    }
    
[/code]

【画像を保存する(カメラロール)】

[code]

    @IBAction func tapSaveBtn(sender: AnyObject) {
    
        //保存確認
        let alertController: UIAlertController = UIAlertController(title: "保存確認", message: "本当に保存してよいですか?", preferredStyle: .Alert)
    
        //保存確認->cancel
        let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: .Cancel) { action -> Void in
            print("Pushed CANCEL")
        }
        alertController.addAction(cancelAction)
    
        //保存確認->保存
        let saveAction: UIAlertAction = UIAlertAction(title: "保存", style: .Default) { action -> Void in
            print("save")
    
            //savingView配下のeditingPhoto等を1枚の画像として保存
            UIGraphicsBeginImageContextWithOptions(self.editingPhoto.frame.size, false, 0)
            self.savingView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    
            let exportImage = UIGraphicsGetImageFromCurrentImageContext()
    
            UIGraphicsEndImageContext()
    
            //写真保存(「特定のアルバム」内には保存できていない。)
            UIImageWriteToSavedPhotosAlbum(exportImage,
                self, "image:didFinishSavingWithError:contextInfo:", nil)
            }
        }
        alertController.addAction(saveAction)
    
        presentViewController(alertController, animated: true, completion: nil)
    }
    
[/code]

なお環境は、iOS9,xcode7.0.1です。

よろしくお願いいたします。

* * *

※追記  
Harawoさんの回答を参考にし、下記で動くことを確認しました。

【アルバムを作成する】

[code]

    @IBAction func tapAddBookBtn(sender: AnyObject) {
        var titleTextField: UITextField?
    
        //タイトル入力をpopupで求める
        let alertController: UIAlertController = UIAlertController(title: "タイトル登録", message: "本のタイトルを入力してください", preferredStyle: .Alert)
    
        //cancelボタン
        let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
            print("Pushed CANCEL")
        }
        alertController.addAction(cancelAction)
    
        //タイトル登録ボタン
        let registAction: UIAlertAction = UIAlertAction(title: "登録", style: .Default) { action -> Void in
            print("regist")
            print(titleTextField?.text)
    
            let albumName :String = readPhotoAlbum.applicationName + (titleTextField?.text)!
    
            PHPhotoLibrary.sharedPhotoLibrary().performChanges({ () -> Void in
                self.request = PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(albumName)
                },completionHandler: { (isSuccess, error) -> Void in
                    if isSuccess == true {
                        print("Success!")
                    }
                    else{
                        print("error occured")
                    }      
            })    
        }
        alertController.addAction(registAction)
    
        alertController.addTextFieldWithConfigurationHandler { textField -> Void in
            titleTextField = textField
            textField.placeholder = "Title"
        }
    
        presentViewController(alertController, animated: true, completion: nil)
    
    }
    
[/code]

【画像を保存する(カメラロール)】

[code]

    @IBAction func tapSaveBtn(sender: AnyObject) {
    
        //保存確認
        let alertController: UIAlertController = UIAlertController(title: "保存確認", message: "本当に保存してよいですか?", preferredStyle: .Alert)
    
        //保存確認->cancel
        let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: .Cancel) { action -> Void in
            print("Pushed CANCEL")
        }
        alertController.addAction(cancelAction)
    
        //保存確認->保存
        let saveAction: UIAlertAction = UIAlertAction(title: "保存", style: .Default) { action -> Void in
            print("save")
    
            //savingView配下のeditingPhoto等を1枚の画像として保存
            UIGraphicsBeginImageContextWithOptions(self.editingPhoto.frame.size, false, 0)
            self.savingView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    
            let exportImage = UIGraphicsGetImageFromCurrentImageContext()
    
            UIGraphicsEndImageContext()
    
            //アルバム名を指定する
            let albumTitle = titleTextField
    
            var theAlbum: PHAssetCollection?
    
            // アルバムを検索
            let result = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.Any, options: nil)
            result.enumerateObjectsUsingBlock({(object, index, stop) in
                if let theCollection = object as? PHAssetCollection where
                    theCollection.localizedTitle == albumTitle
                {
                    theAlbum = theCollection
                }
            })
            // アルバムにイメージを保存
            if let anAlbum = theAlbum {
                PHPhotoLibrary.sharedPhotoLibrary().performChanges({
                    let createAssetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(exportImage)
                    let assetPlaceholder = createAssetRequest.placeholderForCreatedAsset!
                    let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: anAlbum)
                    albumChangeRequest!.addAssets([assetPlaceholder])
                    }, completionHandler: nil)
                print("save image into the Album.")
            }
        }
        alertController.addAction(saveAction)
    
        presentViewController(alertController, animated: true, completion: nil)
    }
    
[/code]


CC BY-SA 3.0
2015-10-18T12:35:04.203
17776
2015-10-25T07:51:39.580
2015-10-25T07:51:39.580
12734
12734
question
ios swift
指定したアルバム内への画像の保存方法について


iOS 8より、Photo.appのライブラリにアクセスするフレームワークに、 **Photos Framework** が推奨されることになりました。

[Photos Framework
Reference](https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/Photos_Framework/index.html#//apple_ref/doc/uid/TP40014408)

以下、一例として、「MyAlbum」という名前のアルバムに、`UIImage`インスタンスを保存するコードを載せておきます。（ボタンを押したら、保存）

[code]

    @IBAction func savePhoto(sender: AnyObject) {
        let albumTitle = "MyAlbum" // アルバム名
        let savingImage = UIImage(named: "a.png")! // 保存するイメージ
        var theAlbum: PHAssetCollection? // アルバムをオブジェクト化
        // フォトライブラリからMyAlbumを検索
        let result = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.Any, options: nil)
        result.enumerateObjectsUsingBlock({(object, index, stop) in
            if let theCollection = object as? PHAssetCollection where
            theCollection.localizedTitle == albumTitle
            {
                theAlbum = theCollection // 見つかったら、theAlbumに代入
            }
        })
        // アルバムにイメージを保存する
        if let anAlbum = theAlbum {
            PHPhotoLibrary.sharedPhotoLibrary().performChanges({
                let createAssetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(savingImage)
                let assetPlaceholder = createAssetRequest.placeholderForCreatedAsset!
                let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: anAlbum)
                albumChangeRequest!.addAssets([assetPlaceholder])
            }, completionHandler: nil)
        } else {
            print("MyAlbum was not found.")
        }
    }
    
[/code]

iOS 9より _Assets Library Framework_ はDeprecatedになります。ご注意ください。Assets
Libraryより、Photosのほうがいくぶん使いやすくなったかなという印象があります。


CC BY-SA 3.0
2015-10-20T08:45:10.777
17849
2015-10-20T08:45:10.777
7362
17776
answer