반응형
Swift 로 사진첩 앨범을 만들고 이미지를 저장하는 방법
앱을 개발하다 보면 사용자의 사진을 저장하고 앨범에 저장하는 기능이 필요한 경우가 있습니다.
이번 글에서는 Swift를 이용하여 사진첩 앨범을 만들고 이미지를 저장하는 방법에 대해 알아보겠습니다.
필요 프레임워크
- Photos
- AssetLibrary
작업
해당 작업은 총 2단계로 이루어집니다.
- 앨범을 만든다.
- 만들어놓은 앨범내에 이미지를 저장한다.
1. 앨범을 만든다.
1. 사진첩에서 앨범을 찾기 위해 PHAssetCollection.fetchAssetCollections 메서드를 사용합니다.
let albums = PHAssetCollection.fetchAssetCollections(with: PHAssetCollectionType.album, subtype: PHAssetCollectionSubtype.any, options: nil)
2. 이미 해당 앨범이 존재하는 경우 eventAlbum 변수에 앨범 정보를 할당합니다.
albums.enumerateObjects { album, index, stop in // 모든 앨범 정보 순회
if album.localizedTitle == albumName { // 같은 이름의 앨범이 있다면
eventAlbum = album as PHAssetCollection // eventAlbum에 앨범전달
stop.pointee = true
}
}
3. PHPhotoLibrary.shared().performChanges로 앨범을 만든다.
// 앨범 첫 생성에는 album == nil
if let album = eventAlbum {
completion?(.DENIED)
} else {
// album == nil 이면 앨범 재생성
PHPhotoLibrary.shared().performChanges ({
PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: albumName)
}) { succeeded, error in
if succeeded {
// 앨범 재생성 후 재귀호출
self.saveImageInAlbum(image: image, albumName: albumName, completion: completion)
} else {
// 실패
completion?(.ERROR)
}
}
}
2. 만들어놓은 앨범내에 이미지를 저장한다.
- PHAssetChangeRequest.creationRequestForAsset를 사용하여 result 에 이미지에 대한 요청을 생성합니다.
- PHAssetCollectionChangeRequest 를 사용하여 albumex 에 이미지를 저장합니다.
if let albumdex = eventAlbum {
PHPhotoLibrary.shared().performChanges ({
let result = PHAssetChangeRequest.creationRequestForAsset(from: image)
let assetPlaceholder = result.placeholderForCreatedAsset
let albumChangeRequest = PHAssetCollectionChangeRequest(for: albumdex)
let enumeration: NSArray = [assetPlaceholder!]
albumChangeRequest!.addAssets(enumeration)
}) { succeedded, error in
if succeedded {
completion?(.SUCCESS)
} else {
completion?(.ERROR)
}
}
}
반응형
전체 코드
import Foundation
import SwiftUI
import Photos
import AssetLibrary
enum PhotoAlbumUtilResult {
case SUCCESS, ERROR, DENIED
}
class PhotoAlbumUtil {
class func saveImageInAlbum(image: UIImage, albumName: String, completion: ((_ result: PhotoAlbumUtilResult) -> ())?) {
var eventAlbum: PHAssetCollection?
let albums = PHAssetCollection.fetchAssetCollections(with: PHAssetCollectionType.album, subtype: PHAssetCollectionSubtype.any, options: nil)
albums.enumerateObjects { album, index, stop in
if album.localizedTitle == albumName {
eventAlbum = album as PHAssetCollection
stop.pointee = true
}
}
if let album = eventAlbum {
completion?(.DENIED)
} else {
PHPhotoLibrary.shared().performChanges ({
PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(albumName)
}) { succeeded, error in
if succeeded {
self.saveImageInAlbum(image: image, albumName: albumName, completion: completion)
} else {
// 실패
completion?(.ERROR)
}
}
}
if let albumdex = eventAlbum {
PHPhotoLibrary.shared().performChanges ({
let result = PHAssetChangeRequest.creationRequestForAsset(from: image)
let assetPlaceholder = result.placeholderForCreatedAsset
let albumChangeRequest = PHAssetCollectionChangeRequest(for: albumdex)
let enumeration: NSArray = [assetPlaceholder!]
albumChangeRequest!.addAssets(enumeration)
}) { succeedded, error in
if succeedded {
completion?(.SUCCESS)
} else {
completion?(.ERROR)
}
}
}
}
}
반응형
'개발 > Swift' 카테고리의 다른 글
Swift에서 사운드를 실행하는 방법: AVFoundation을 활용한 사운드 재생 (0) | 2023.07.17 |
---|---|
SwiftUI에서 VStack 가운데 정렬하는 방법 (0) | 2023.07.15 |
SwiftUI로 다이얼로그 띄우는 방법 (0) | 2023.07.14 |
SwiftUI에서 스크린샷을 앨범에 저장하는 방법 (0) | 2023.07.13 |
[SwiftUI] UIImageWriteToSavedPhotosAlbum()을 사용하여 갤러리에 이미지 저장 방법 (0) | 2023.07.12 |
댓글