샘성의 iOS 개발 일지

피커뷰 사용하기 본문

iOS/UiKit

피커뷰 사용하기

SamusesApple 2023. 3. 7. 11:58
728x90

사용자의 앨범에 접근하여 사용자가 선택한 사진을 불러오는, 피커뷰 사용하기

e.g) 인스타그램 프로필 바꿀때 본인의 앨범에 있는 사진을 고를 수 있는 것




  1. 피커뷰 기능을 사용할 VC에 PhotosUI import하기
  2. 해당 VC를 확장해서 PHPickerViewControllerDelegate 채택 / 확장하기
  3. PHPickerViewControllerDelegate 의 필수 구현 요소(메서드) 구현하기
extension SomeViewController: PHPickerViewControllerDelegate {
    
    // 사진이 선택이 된 후에 호출되는 메서드 (필수 구현 요소)
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        // 피커뷰 dismiss
        picker.dismiss(animated: true)
        
        let itemProvider = results.first?.itemProvider
        
        if let itemProvider = itemProvider, itemProvider.canLoadObject(ofClass: UIImage.self) {
            itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in
                DispatchQueue.main.async {
                    // 이미지뷰에 표시
                    self.someView.someImageView.image = image as? UIImage
                }
            }
        } else {
            print("이미지 불러오기 실패")
        }
    }
}

 

4. VC 안에 ‘피커뷰 설정 + 피커뷰컨트롤러 생성’하는 함수 구현하기

func setupImagePicker() {
        // 피커뷰의 기본설정 세팅하기
        var configuration = PHPickerConfiguration()
        configuration.selectionLimit = 0  // 앨범에서의 선택 무제한으로
        configuration.filter = .any(of: [.images, .videos]) // 사진이랑 비디오 선택 가능
        
        // 설정한 기본설정을 기반으로, 피커뷰컨트롤러 생성
        let picker = PHPickerViewController(configuration: configuration)
        // 피커뷰 컨트롤러의 델리게이트 설정
        picker.delegate = self
        // 피커뷰 띄우기
        self.present(picker, animated: true, completion: nil)
    }

 

5. 제스처 구현하기

   - 제스처 : 터치 동작이 안되는 이미지뷰, 라벨 등 위에 올려서 터치 동작이 가능하도록 만드는 것

func setupTapGestures() {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(touchUpImageView))
        someView.someImageView.addGestureRecognizer(tapGesture)
        someView.someImageView.isUserInteractionEnabled = true
    }
// selector에 들어갈 함수 구현
@objc func touchUpImageView() {
        print("이미지뷰 터치")
        setupImagePicker()  // 피커뷰 세팅 및 설정하는 함수 호출시키기
    }

 

6. viewDidLoad()에 제스처 함수 실행시키기

override func viewDidLoad() {
        super.viewDidLoad()

        setupTapGestures()
    }

 

7. 사용자의 사진첩에 접근하는 것이기 때문에 info.plist에 privacy description 설정하기

 

 

 

* 전체코드 *

// PhotosUI 불러오기
import PhotosUI

// VC 안에서 피커뷰 설정 및 피커뷰 실행
override func viewDidLoad() {
        super.viewDidLoad()

        setupTapGestures()
    }

func setupTapGestures() {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(touchUpImageView))
        someView.someImageView.addGestureRecognizer(tapGesture)
        someView.someImageView.isUserInteractionEnabled = true
    }
// selector에 들어갈 함수 구현
@objc func touchUpImageView() {
        print("이미지뷰 터치")
        
        // 피커뷰 기본설정 셋팅
        var configuration = PHPickerConfiguration()
        configuration.selectionLimit = 0
        configuration.filter = .any(of: [.images, .videos])
        
        // 기본설정을 가지고, 피커뷰컨트롤러 생성
        let picker = PHPickerViewController(configuration: configuration)
        // 피커뷰 컨트롤러의 대리자 설정
        picker.delegate = self
        // 피커뷰 띄우기
        self.present(picker, animated: true, completion: nil)
    }



// VC 확장해서 피커뷰 채택 
extension SomeViewController: PHPickerViewControllerDelegate {
    
    // 사진이 선택이 된 후에 호출되는 메서드 (필수 구현 요소)
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        // 피커뷰 dismiss
        picker.dismiss(animated: true)
        
        let itemProvider = results.first?.itemProvider
        
        if let itemProvider = itemProvider, itemProvider.canLoadObject(ofClass: UIImage.self) {
            itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in
                DispatchQueue.main.async {
                    // 이미지뷰에 표시
                    self.someView.someImageView.image = image as? UIImage
                }
            }
        } else {
            print("이미지 불러오기 실패")
        }
    }
}
728x90