Skip to content

πŸͺ“ iOS 14+ PHPickerViewController 섬주섬주섬

Notifications You must be signed in to change notification settings

hyun99999/PHPickerTutorial-iOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

3 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

PHPickerTutorial-iOS

πŸͺ“ iOS 14+ PHPickerViewController 섬주섬주섬


기쑴에 μ§€μ›ν•˜λŠ” UIPickerViewController κ°€ μžˆμ—ˆλŠ”λ°μš”! iOS 14 μ—μ„œ μƒˆλ‘œμš΄ Photo Picker κ°€ λ‚˜μ™”μŠ΄λ‹€!

Apple Developer Documentation

자자 개발자 λ¬Έμ„œλ₯Ό μ‚΄νŽ΄λ³΄μžκ΅¬μš”!

Overview

PHPickerViewController ν΄λž˜μŠ€λŠ” UIImagePickerController 의 λŒ€μ•ˆμž…λ‹ˆλ‹€. PHPickerViewController λŠ” μ•ˆμ •μ„±κ³Ό 신뒰성을 κ°œμ„ ν•˜κ³  λ‹€μŒκ³Ό 같은 κ°œλ°œμžμ™€ μ‚¬μš©μžμ—κ²Œ 이점을 μ œκ³΅ν•©λ‹ˆλ‹€.

  • Deferred image loading and recovery UI

μ§€μ—°λœ 이미지 λ‘œλ”©κ³Ό 볡ꡬ UI

  • Reliable handling of large and complex assets, like RAW and panoramic images

RAW 및 νŒŒλ…ΈλΌλ§ˆ 이미지와 같은 크고 λ³΅μž‘ν•œ μ—μ…‹μ˜ μ•ˆμ •μ μΈ 처

(RAW λŠ” 이미지 파일 포맷이닀. λ‹€λ₯Έ ν™•μž₯μžλ“€λ³΄λ‹€ 크기가 맀우 ν¬μ§€λ§Œ μ‚¬μ§„νŽΈμ§‘μ— μœ μš©ν•˜λ‹€κ³  ν•œλ‹€. iPhone 12 ν”„λ‘œ 및 ν”„λ‘œλ§₯μŠ€μ—μ„œλΆ€ν„° μ΄¬μ˜κ°€λŠ₯.)

  • User-selectable assets that aren’t available forΒ UIImagePickerController

UIImagePickerController 에 μ‚¬μš©ν•  수 μ—†λŠ” μ‚¬μš©μžμ„ νƒ κ°€λŠ₯ν•œ 에셋

  • Configuration of the picker to display only Live Photos

Live Photos 만 ν‘œμ‹œν•˜λŠ” picker ꡬ성

  • Availability ofΒ PHLivePhotoΒ objects without library access

라이브러리 μ•‘μ„ΈμŠ€ 없이 PHLivePhoto(Live Photo) 객체 μ‚¬μš©κ°€λŠ₯

  • Stricter validations against invalid inputs

μœ νš¨ν•˜μ§€ μ•ŠλŠ” μž…λ ₯에 λŒ€ν•œ 더 μ—„κ²©ν•œ 검증

μ΄λ ‡κ²Œ λ³΄λ‹ˆκΉŒ κΈ°λŠ₯λ©΄μ—μ„œ 무엇이 ν™•μ‹€νžˆ λ‹€λ₯Έμ§€ λͺ¨λ₯΄κ² λŠ”λ°μš”! λ§Œλ“€μ–΄λ³΄κΈ°μ „μ— λ¨Όμ € μ†Œκ°œν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€!

  • multiple select
  • zoom in or out
  • search
  • κΆŒν•œ μš”μ²­ νŒμ—…μ΄ λœ¨μ§€ μ•ŠλŠ”λ‹€.

μ—„μ²­..λ‚˜μ§€ μ•Šλ‚˜μš”..? 휘λ‘₯그레

좜발

1. import PhotosUI

import PhotosUI

2. Create PHPickerConfiguration

: picker 뷰컨트둀러λ₯Ό κ΅¬μ„±ν•˜λŠ” 정보λ₯Ό ν¬ν•¨ν•œ κ°μ²΄μž…λ‹ˆλ‹€.

이 객체둜 μ œμ–΄ ν•  수 μžˆλŠ”λ° κ·Έ μ’…λ₯˜λ₯Ό μ•Œμ•„λ³΄μž!

var configuration = PHPickerConfiguration()
// πŸŽ† selectionLimit
// πŸŽ† μœ μ €κ°€ 선택할 수 μžˆλŠ” μ—μ…‹μ˜ μ΅œλŒ€ 갯수. κΈ°λ³Έκ°’ 1. 0 μ„€μ •μ‹œ μ œν•œμ€ μ‹œμŠ€ν…œμ΄ μ§€μ›ν•˜λŠ” μ΅œλŒ€κ°’μœΌλ‘œ μ„€μ •.
configuration.selectionLimit = 1

// πŸŽ† filter
// πŸŽ† picker κ°€ ν‘œμ‹œν•˜λŠ” 에셋 νƒ€μž… μ œν•œμ„ 적용. 기본적으둜 λͺ¨λ“  에셋 μœ ν˜•μ„ ν‘œμ‹œ(이미지, λΌμ΄λΈŒν¬ν† , λΉ„λ””μ˜€)
configuration.filter = .images
// configuration.filter = .any(of: [.images, .livePhotos, .videos])

3. Initialize PHPicker

λ§Œλ“  PHPickerConfiguration 을 가지고 PHPickerViewController λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.

let picker = PHPickerViewController(configuration: configuration)

4. PHPickerViewControllerDelegate

UIImagePickerController 도 μ„ νƒν•˜κ³  didFinishPickingMediaWithInfo λ©”μ„œλ“œλ‘œ μ„ νƒν•œ λ―Έλ””μ–΄μ˜ 정보λ₯Ό κ°€μ Έμ™”λŠ”λ° PHPicker 도 λ™μΌν•œ 역할이 μžˆλ‹€.

// πŸŽ† μœ μ €κ°€ 선택을 μ™„λ£Œν–ˆκ±°λ‚˜ μ·¨μ†Œ λ²„νŠΌμœΌλ‘œ λ‹«μ•˜μ„ λ•Œ μ•Œλ €μ£ΌλŠ” delegate
extension ViewController: PHPickerViewControllerDelegate {
    // πŸŽ† required method
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        // ...
    }
}

PHPickerViewControllerDelegate 을 채택해주고 μ—­μ‹œλ‚˜ picker.delegate = self μ„€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

5. Present Picker

이제 피컀λ₯Ό 뷰에 λ„μ–΄λ΄…μ‹œλ‹€! μ•„λž˜λŠ” 전체 μ½”λ“œμž…λ‹ˆλ‹€.

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        var configuration = PHPickerConfiguration()
        // πŸŽ† The maximum number of selections the user can make.
        // πŸŽ† κΈ°λ³Έκ°’ 1. 0 μ„€μ •μ‹œ μ œν•œμ€ μ‹œμŠ€ν…œμ΄ μ§€μ›ν•˜λŠ” μ΅œλŒ€κ°’μœΌλ‘œ μ„€μ •.
        configuration.selectionLimit = 2
        
        // πŸŽ† The filter you apply to restrict the asset types the picker displays.
        // πŸŽ† 기본적으둜 이미지(λΌμ΄λΈŒν¬ν†  포함), λΌμ΄λΈŒν¬ν† , λΉ„λ””μ˜€μ™€ 같은 λͺ¨λ“  μ—μ…‹νƒ€μž… ν‘œμ‹œ.
        configuration.filter = .images
//        configuration.filter = .any(of: [.images, .livePhotos, .videos])
        
        let picker = PHPickerViewController(configuration: configuration)
        picker.delegate = self
        
        self.present(picker, animated: true, completion: nil)
    }
}

// πŸŽ† μœ μ €κ°€ 선택을 μ™„λ£Œν–ˆκ±°λ‚˜ μ·¨μ†Œ λ²„νŠΌμœΌλ‘œ λ‹«μ•˜μ„ λ•Œ μ•Œλ €μ£ΌλŠ” delegate
extension ViewController: PHPickerViewControllerDelegate {
    // πŸŽ† required method
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        // ...
    }
}

6. Handling assets

이제 μ„ νƒν•œ 에셋듀을 λ‹€λ£¨μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

delegate μ—μ„œ νŒŒλΌλ―Έν„° results λ₯Ό μ‚¬μš©ν•˜λ©΄λœλ‹΅λ‹ˆλ‹€!

  • PHPickerResult : μ„ νƒλœ 에셋을 λ‚˜νƒ€λ‚΄λŠ” νƒ€μž….
  • itemProvider: NSItemProvider. μ„ νƒλœ μ—μ…‹μ˜ respresentation.
extension ViewController: PHPickerViewControllerDelegate {
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        // πŸŽ† μ„ νƒμ™„λ£Œ ν˜Ήμ€ μ·¨μ†Œν•˜λ©΄ λ·° dismiss.
        picker.dismiss(animated: true, completion: nil)
        
        // πŸŽ† itemProvider λ₯Ό κ°€μ Έμ˜¨λ‹€.
        let itemProvider = results.first?.itemProvider
        if let itemProvider = itemProvider,
           // πŸŽ† itemProvider μ—μ„œ μ§€μ •ν•œ νƒ€μž…μœΌλ‘œ λ‘œλ“œν•  수 μžˆλŠ”μ§€ 체크
           itemProvider.canLoadObject(ofClass: UIImage.self) {
            // πŸŽ† loadObject() λ©”μ„œλ“œλŠ” completionHandler 둜 NSItemProviderReading κ³Ό error λ₯Ό μ€€λ‹€.
            itemProvider.loadObject(ofClass: UIImage.self) { image, error in
                // πŸŽ† itemProvider λŠ” background asnyc μž‘μ—…μ΄κΈ° λ•Œλ¬Έμ— UI 와 κ΄€λ ¨λœ μ—…λ°μ΄νŠΈλŠ” κΌ­ main μ“°λ ˆλ“œμ—μ„œ μ‹€ν–‰ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€.
                DispatchQueue.main.sync {
                    self.myImageView.image = image as? UIImage
                }
            }
        }
    }
}

7. Multiple selection Handling

λ‹€μŒκ³Ό 같이 PHPickerResult λ°°μ—΄μ—μ„œ κΊΌλ‚΄μ£Όλ©΄ λœλ‹€.

    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        picker.dismiss(animated: true, completion: nil)   
    
        let itemFirstProvider = results[0].itemProvider
        let itemSecondProvider = results[1].itemProvider
        
        if itemFirstProvider.canLoadObject(ofClass: UIImage.self) {
            itemFirstProvider.loadObject(ofClass: UIImage.self) { image, error in
                DispatchQueue.main.sync {
                    self.myFirstImageView.image = image as? UIImage
                }
            }
        }
        
        if itemSecondProvider.canLoadObject(ofClass: UIImage.self) {
            itemSecondProvider.loadObject(ofClass: UIImage.self) { image, error in
                DispatchQueue.main.sync {
                    self.mySecondImageView.image = image as? UIImage
                }
            }
        }
    }

κ²°κ³Ό

좜처 :

iOS 14+ ) PHPicker

About

πŸͺ“ iOS 14+ PHPickerViewController 섬주섬주섬

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages