WooKoo Blog

물과 같이

개발/개발

[iOS] - PhotoKit 사용법

WooKoo 2020. 9. 23. 23:11

처음에 사진첩을 구현하려고할 때 UIImagePicker 델리게이트를 사용하면 쉽게 구현 할 수 있었다.

 

근데 조금 더 세세한 수정이나 컨트롤을 하려면 PhotoKit을 사용해야했다.

 

차이점을 찾아보니 UIImagePicker는 사용자가 직접 선택하고 기존의 설정을 사용한다고하면

 

PhotoKit은 개발자가 구현할 수 있도록 해놓은?? 뭐 그런 차이가 있다.

 

아무래도 그냥 이미지 선택이나 그런 간단한 작업을 할 땐 UIImagePicker가 좋겠지요??

 

자 알아야할 개념이 너무나도 많은데 기본적으로

 

이것을 알고가면 좋다.

 

포토킷은 보이는 것과같이 iCloud와 Local에 있는 그런 것들을 가져올 수 있다.

 

k-elon.tistory.com/19

 

[iOS] Photos 프레임워크 톺아보기

iOS 개발을 하다보면 자연스레 갤러리에 접근하는 일이 많아집니다. 그래서 이번엔 iOS 에서 iCloud 사진 라이브러리를 포함하여 사진 및 비디오에 직접 접근,편집할 수 있는 프레임워크 Photos 에 대

k-elon.tistory.com

앨런님 블로그에 보면 처음에 나오는 

Asset과 AssetCollection AssetCollectionList의 차이를 알아야한다.

 

예를 들어서 앨범이 무엇이 있는지 알고 그 앨범을 클릭하면 사진이 나오게 하고싶다??

그러면 AssetCollection을 받아오고 그 안에 Asset들을 꺼내면된다.

 

나머지 필요한 것들은 공부하면서 다시 보고 공식문서를 참조해서 하면 될 것 같고!!

 

가장 먼저해야할 것은 접근 권한 얻기~

Info.plist에서 아래와같은 칼럼을 추가해준다.

 

권한을 위한 검사를 해줘야겠죠??

    func requestPhotosPermissionCheck() {
        let photoAuthorizationStatusStatus = PHPhotoLibrary.authorizationStatus()
        switch photoAuthorizationStatusStatus {
        case .authorized:
            print("권한이 승인되었습니다.")
            requestAlbum()
            
        case .denied:
            print("권한이 거부되었습니다.")
            
        case .notDetermined:
            print("권한에 대한 승인을 아직 안하셨습니다.")
            PHPhotoLibrary.requestAuthorization() {
                (status) in
                switch status {
                case .authorized:
                    print("권한이 승인되었습니다.")
                    self.requestAlbum()
                  
                case .denied:
                    print("권한이 거부되었습니다.")
                    break
                default:
                    break
                }
            }
        case .restricted:
            print("권한을 부여할 수 없습니다.")
        default:
            break
        }
    }

권한 같은 경우는

developer.apple.com/documentation/photokit/phauthorizationstatus

 

Apple Developer Documentation

 

developer.apple.com

여기서 보시면 됩니다!!

 

먼저 앨범 컬렉션을 만들어줍니다.

var albums: PHFetchResult<PHAssetCollection>!

나는 바로 UIImage가 들어올 줄 알았는데 메타 데이터를 가져온다네요

developer.apple.com/documentation/photokit/phfetchresult

 

Apple Developer Documentation

 

developer.apple.com

사용법은 위 문서 참고!

 

 albums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumUserLibrary, options: nil)

이런식으로 가져왔고

smartAlbum과 Album이 있는데 smart는 우리가 앨범을 따로 만들지 않아도 있는 Favorite이나 Recent같은 폴더들?이 있고

Album Type같은경우는 사용자가 직접 만든거!!

(이거 합쳐서 나타내고싶었는데 계속 인덱스 초과떠서 왜그런지는 모르겠넹.. 뭔가 이유가있나?? 따로해놓은..? 구현하신분은 어떻게 하신지 알려주시면 좋을 것 같아요)

 

이렇게 받아와주고

테이블뷰에 나타내고싶다면?

   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! AlbumsCell
        let collection = self.albums.object(at: indexPath.row)
        let imageManager = PHImageManager()
        let options = PHFetchOptions()
        options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
        allPhotos = PHAsset.fetchAssets(in: collection, options: options)
        let asset = allPhotos.firstObject!
        imageManager.requestImage(for: asset, targetSize: CGSize(width: 70, height: 70), contentMode: .aspectFill, options: nil, resultHandler: {
            img, _ in
            cell.thumnail.image = img
        })
        cell.name.text = collection.localizedTitle ?? "찾을 수 없는 앨범"
        cell.imageCount.text = "\(allPhotos.count)"
        return cell
    }

이런식으로 사용하면되고

UIImage를 직접적으로 호출할 땐

 

저기 보이는 PHImageManer() 인스턴스를 사용해야합니당

중간에 옵션도 보이는데 옵션은 나타낼 데이터들의 정렬이나 기준 등 설정할 수 있어요~ 커맨드 키 눌러서 개발자 문서 보시면

 

다양한 타입들을 제공해주고있답니다.

 

정리가 잘된 멋진 블로그들이 많으니 참고만 해주시면 감사하게씁니다!!