ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift PHPicker로 여러 이미지를 가져오기
    iOS/Swift 2022. 1. 22. 21:07

    안녕하세요!! 이번엔 Swift의 PHPickerViewController에서 이미지를 가져오는 방법에 대해서 정리했습니다.

    이번 글도 노션에서 옮겨와 말이 짧습니다!! 양해해주세용😽


    이번에 앱을 만들면서 구현해야 하는 기능 중에 여러장의 사진을 선택해서 업로드 할 수 있는 기능을 넣어야했다.

    맨 처음에는 단순하게 ImagePicker로 구현하면 되겠지~ 했는데

    ImagePicker에는 여러장을 한번에 선택할 수 있는 기능이 존재하지 않았다(...)

     

     

    iOS 14 이상에서는 새로 나온 PHPicker를 적용할 수 있지만, Mappin 앱의 최소 지원 버젼이 iOS 13이라 라이브러리를 더 찾아봐야 할 것 같다.

     

    iOS 14이상은 PHPicker를 사용할 수 있도록 코드를 작성해봤다.

    @available(iOS 14, *)
        func makePHPicker() -> PHPickerViewController {
            var configure = PHPickerConfiguration()
            configure.selectionLimit = 10
            configure.filter = .images
            let picker = PHPickerViewController(configuration: configure)
            picker.delegate = self
            return picker
            
        }
    

    PHPicker를 정의하고 반환하는 함수를 만들었다. 먼저, PHPicker의 Configuration을 설정해야한다.

     

    selectionLimit는 라이브러리에서 선택할 수 있는 사진의 갯수를 의미한다. 0으로 두면 제한이 없어진다.

    filter는 이미지 파일, 라이브포토 파일, 비디오 파일 중 원하는 파일 타입을 설정할 수 있다.

    Configuration을 설정하고 난 뒤, PHPicker 객체를 만들 때 작성해둔 configuration을 매개변수로 넣어주면 된다.

     

    그리고 ImagePicker를 사용할 때 처럼, delegate를 해주어야 한다.

    var photoImages: [UIImage] = []
    
    //MARK: PHPicker Delegate
    extension AddPinViewController: PHPickerViewControllerDelegate {
        @available(iOS 14, *)
        func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
            picker.dismiss(animated: true, completion: nil)
            
            if !(results.isEmpty)  {
                photoImages.removeAll()
                
                for result in results {
                    let itemProvider = result.itemProvider
                    if itemProvider.canLoadObject(ofClass: UIImage.self) {
                        itemProvider.loadObject(ofClass: UIImage.self) { [weak self](image, error) in
                            self?.photoImages.append(image as! UIImage)
                        }
                    }
                }
            }
            
        }
    }
    

    그리고 PHPicker의 delegate 메소드인 didFinishPicking에서 선택한 사진에 대한 처리를 해주어야 한다.

    딱 봐도 results에 내가 고른 사진이 담겨있는 것 같았다.

     

    먼저, picker를 dismiss시켜주고,

    사용자가 라이브러리에서 사진을 선택했을 경우 기존 사진들이 삭제되고 사용자가 선택한 이미지를 넣을 수 있게끔

    사진을 담아두는 photoImages의 값을 초기화 시켜주었다.

     

    그리고 results를 순회하면서 UIImage로 로드할 수 있는 객체라면, UIImage로 타입캐스팅을 한 뒤 photoImage에 추가해주는 작업을 하도록 했다.

     

    이렇게 하면 배열에 선택한 이미지를 담을 수 있다. 이제 이 이미지 배열을 원하는 곳에 사용하면 된다 😃

    댓글

Designed by Tistory.