指定したアルバム内への画像の保存方法について
iOSにて、あるボタンを押して「写真」配下にアルバムを作成し、そのアルバム内に撮影した写真を保存する機能を加えようとしています。
ただ、アルバムの作成はできたものの、そのアルバムを指定して写真を保存するということができていません。(下記では、「カメラロール」に保存されてしまいます。)
こちらの方法について見つけることができず、ご存知のかたいらっしゃいましたら、ご教授いただければ幸いです。
なお、現在作成しているコードは下記のとおりです。
【アルバムを作成する】
@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)
}
【画像を保存する(カメラロール)】
@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)
}
なお環境は、iOS9,xcode7.0.1です。
よろしくお願いいたします。
※追記
Harawoさんの回答を参考にし、下記で動くことを確認しました。
【アルバムを作成する】
@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)
}
【画像を保存する(カメラロール)】
@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)
}