Open hyun99999 opened 1 year ago
What's new in the Photos picker - WWDC22 - Videos - Apple Developer
λ³Έ κΈμ WWDC λ₯Ό λ³΄κ³ , λ²μ λ° μμ½ κ·Έλ¦¬κ³ μ€νν΄λ³΄λ μ€ν°λ νλ‘μ νΈμ μΌνμ λλ€.
μ€λμ system Photos picker κ°μ λ λͺ κ°μ§ μ¬νμ λν΄ μ΄μΌκΈ°νκ³ μ ν©λλ€.
system Photos picker λ λλΆλΆμ μ±μ΄ iOS μμ μ¬μ§, λΉλμ€μ μ‘μΈμ€νλ κ°μ₯ μ’μ λ°©λ²μ λλ€.
picker λ process μμ΄ λμκ°λ―λ‘ λΌμ΄λΈλ¬λ¦¬ μ‘μΈμ€λ₯Ό μμ²ν νμκ° μμ΅λλ€. μ§κ΄μ μΈ UI μ μ¬μ©νκΈ° μ¬μ΄ API κ° μμ΅λλ€. PHPicker API μ μ΅μνμ§ μμ κ²½μ° μ΄μ μ°λ WWDC μΈμ μμ μμΈν λ³Ό μ μμ΅λλ€.
π₯½Β Letβs dive in!
picker λ λμ λ μ΄νλ‘ μ΄λ―Έμ§μ λΉλμ€, λΌμ΄λΈ ν¬ν κ°μ νν°λ§μ μ§μν©λλ€.
κ·Έλ¬λ μΌλΆ μ±μμλ λ€λ₯Έ μꡬ μ¬νμ΄ μμ μ μμ΅λλ€. μλ₯Ό λ€μ΄, screenshot-stitching app μ μ€μ§ μ€ν¬λ¦°μ·λ§ νΌμ»€μμ 보μ¬μ£Όλ €κ³ ν©λλ€.
μ¬ν΄ μΆκ°ν μλ‘μ΄ screenshots fileter λ‘ μ΄μ κ°λ₯ν΄μ‘μ΅λλ€. screenshots μΈμλ screen recordings μ slo-mo videos μ κ°μ λ€λ₯Έ asset νμ λ€λ μΆκ°νμ΅λλ€.
PHAsset.PlaybackStyle
μ μ¬μ©νμ¬ μ νν°λ₯Ό λ§λλ λ°©λ²λ μμ΅λλ€.
cinematic videos, depth effect photos λ° bursts λ₯Ό μ μΈν λͺ¨λ μλ‘μ΄ νν°λ€μ΄ backport λ©λλ€.(backport: μ΅μ λ²μ μμ κ°μ Έμμ μ΄μ λ²μ μΌλ‘ μ μ©νλ μμ )
μ¦, μμ μΈκ°μ§λ iOS 16λΆν° μ§μν©λλ€.
μ±μ΄ iOS 15 λ₯Ό νκ²ν νλ κ²½μ° μ¬λ¬λΆλ€μ iOS 16 SDK λ‘ μ»΄νμΌμ νλ λμ κ³μ μ¬μ©ν μ μμ΅λλ€.
Compound filters μ κ²½μ° κΈ°μ‘΄μ any
μ μΆκ°νμ¬ all
κ³Ό not
λ μ¬μ©λ©λλ€. μ΄ μμ iOS 15 λ‘ λ°±ν¬νΈλμμ΅λλ€.
λͺκ°μ§ μ½λ μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
λΉλμ€μ live photo λ₯Ό νμνλ €λ©΄ any
μ κ²°ν©ν μ μμ΅λλ€. λλ μ€ν¬λ¦°μ·λ§ νμνκ³ μΆμ μλ μμ΅λλ€. μ€ν¬λ¦°μ· μμ΄ λͺ¨λ μ΄λ―Έμ§λ₯Ό νμνλ €λ©΄ images μ screenshots filters λ₯Ό all
κ³Ό not
μ μ¬μ©νμ¬ κ²°ν©ν μ μμ΅λλ€. λ§μ§λ§ μμμμλ iOS 16 μ΄μμ νκ²ν
νλ κ²½μ° .cinematicVideos
νν°λ₯Ό μ¬μ©ν μ μμ΅λλ€.
λ€μμΌλ‘ half-height picker μ κ΄λ ¨λ κ°μ μ¬νμ λν΄ μ΄μΌκΈ° ν΄λ³΄κ² μ΅λλ€.
iOS 15 UIKit μλ picker λ₯Ό μ λ° λμ΄ λͺ¨λλ‘ νμνλλ° μ¬μ©ν μ μλ μλ‘μ΄ UISheetPresentationController
API κ° μμ΅λλ€. μ΄λ―Έ λ§μ κ²½μ°μ νλ₯νκ² μλν©λλ€. νμ§λ§, μΌλΆλ μ νν assets λ₯Ό μ‘°μ νκ³ μ΄λ¬ν λ³κ²½μ¬νμ΄ picker μ λ€μ λ°μλλλ‘ μ»€μ€ν
UI λ₯Ό ꡬννκ³ μ ν μ μμ΅λλ€.
iOS 16μμλ asset identifiers λ₯Ό ν΅ν΄μ μμ μ μ νν΄μ ν μ μμ΅λλ€.
μμ κ·Έλ¦Όμ²λΌ λ λ²μ§Έ μ¬μ§μ deselectAssets
κ° νΈμΆλ ν picker μμ λ μ΄μ μ νλμ§ μμ΅λλ€. moveAesset
λ©μλλ₯Ό μ¬μ©νμ¬ assets λ₯Ό μ¬μ λ ¬ν μλ μμ΅λλ€.
μ°λ¦¬λ picker μ μλ‘μ΄ κΈ°λ₯μ μ΅μν΄μ‘μ΅λλ€. νλ«νΌ μ§μμ λν΄μ μ΄μΌκΈ° ν΄λ³΄κ² μ΅λλ€.
νμ¬ system Phots picker λ μ€μ§ iOS μ iPadOS μμλ§ μ¬μ©ν μ μμ΅λλ€. μ¬ν΄ macOS μ watchOS λΌλ λ κ°μ§ μΆκ° νλ«νΌμ λμ ν μμ μ λλ€. iPadOS picker λ iPad λ§μ μν μλ‘μ΄ λμμΈμΌλ‘ μ λ°μ΄νΈ λμμ΅λλ€.
λ¨Όμ μλ‘μ΄ iPad UI μ μ΄ν΄λ³΄κ² μ΅λλ€.
picker λ μ΄μ ν° iPad λμ€νλ μ΄μ μ΄μ μ νμ©νκΈ° μν΄μ sidebar κ° νμλ©λλ€. μ¬μ΄λ λ°λ₯Ό μμνμ¬ λ€λ₯Έ 컬λ μ κ°μ λΉ λ₯Έ νμμ ν μ μμ΅λλ€. κ·Έλ¬λ Split Screen mode μμλ 곡κ°μ΄ μΆ©λΆνμ§ μμΌλ©΄ κΈ°μ‘΄μ compact picker UI λ‘ λ체λ©λλ€.
(μλλ νμ¬ iPadOS μμ μ 곡νλ compact picker UI μ λλ€.)
μ¬μ§ μΆμ²: https://www.idownloadblog.com/2020/08/11/enhanced-image-picker-iphone-ipad/
macOS picker λ Mac-style controls μ΄ μλ sidebar λ₯Ό κ°μ§λλ€.
κ·Έλ¦¬κ³ iOS picker μ²λΌ multiple selection, grid μ fluid zooming λ₯Ό μ§μνλ©° μ¬λ, μ₯μ λ±κ³Ό κ°μ νλͺ©μ κ²μν μ μλ κ²μκΈ°λ₯μ΄ μμ΅λλ€.
μλ‘μ΄ picker UI λ NSOpenPanel μ μ¬μ©ν μ μμ΅λλ€. μ΄λ₯Ό μ¬μ©νμ¬ system photo library μμ iCloud Photos μ μ μ₯λ μμ μ ν¬ν¨νμ¬ μ νν μ μμ΅λλ€. μ¬λ¬λΆμ μ±μ μ΄λ€ adoption work μμ΄ μλ‘μ΄ UI κ° λ¬΄λ£λ‘ μ 곡λ κ²μ λλ€.
drag and drop μ΄ NSOpenPanel picker μμ μ§μλ©λλ€. iOS, iPadOS λ° macOS μ νμ€ picker μμλ μ§μλ©λλ€. μ±μμ λͺκ°μ μ΄λ―Έμ§ νΉμ λΉλμ€λ₯Ό μ νν΄μΌ νλ κ²½μ° NSOpenPanel API λ§ μμΌλ©΄ λ©λλ€.
κ·Έλ¬λ, photo library μμ μ νν νμΌλ€μ μμ€ν μ μν΄ μΈμ λ μμ λ μ μλ€λ κ²μ λͺ μ¬ν΄μΌ ν©λλ€. μ₯κΈ°μ μΌλ‘ μ¬μ©νλ €λ©΄ μ±μμ κ΄λ¦¬νλ μμΉμ 볡μ¬ν΄μΌ ν©λλ€.
media-centric(λ―Έλμ΄ μ€μ¬) macOS μ±μ κ²½μ°, μ΅κ³ μ μ¬μ©μ κ²½νμ μν΄ κΈ°λ³Έμ μΌλ‘ μλ‘μ΄ Photos picker λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. νμ§λ§, μ±μ NSOpenPanel API λ₯Ό μ¬μ©νμ¬ νμΌ μμ€ν μμ μμ μ μ νν΄μΌνλ λ체 λ°©λ²μ κ³μ μ 곡 ν΄μΌ ν©λλ€. κ³ κ°μ΄ μ¬μ ν photo libraries μΈλΆμ μμ μ μ ννκ³ μΆμ΄νλ κ²½μ°κ° μμ΅λλ€.
λ§μ§λ§μΌλ‘ watchOS μ λν΄μ μμλ³΄κ² μ΅λλ€.
μ²μμΌλ‘ μλ‘μ΄ API λ₯Ό ν΅ν΄μ μ μ₯λ μ΄λ―Έμ§μ μ‘μΈμ€ν μ μμ΅λλ€. watchOS picker λ iOS μ macOS picker μ²λΌ νλ‘μΈμ€κ° νμνμ§ μμΌλ―λ‘ λΌμ΄λΈλ¬λ¦¬ μ‘μΈμ€λ₯Ό μμ²ν νμκ° μμ΅λλ€.
iOS picker μ μ μ¬ν UI λ₯Ό κ°μ§κ³ μμ§λ§ λ μμ νλ©΄μ μ΅μ νλμ΄ μμ΅λλ€. 그리λ λλ 컬λ μ λ³λ‘ μ¬μ§μ νμν μ μμ΅λλ€.
μ ν μμλ₯Ό νμνκ³ μ ν μ νμ μ§μ νλλ‘ picker λ₯Ό ꡬμ±ν μ μμ΅λλ€.
νμ§λ§, iOS μ macOS μ λ¬λ¦¬ watchOS picker λ μ΄λ―Έμ§λ§ νμλ©λλ€. μ₯λΉμ 500κ° μ΄μμ μ΄λ―Έμ§κ° μλ κ²½μ° κ°μ₯ μ΅κ·Όμ 500κ° μ΄λ―Έμ§λ§ νμλ©λλ€.
PHPickerViewController λ UIKit κΈ°λ°μΈλ° μ΄λ»κ² macOS λ watchOS μ±μμ μ¬μ©ν μ μμκΉμ?
μ§μνμ ¨κ² μ§λ§ μ΄μ AppKit κ³Ό SwiftUI μμ μλ‘μ΄ picker API λ₯Ό μ¬μ©ν μ μμ΅λλ€.
(AppKit μ macOS λ₯Ό μν μ μ μΈν°νμ΄μ€λ₯Ό ꡬννλλ° νμν objects λ₯Ό ν¬ν¨ν©λλ€.)
λ¨Όμ , AppKit API λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
UIKit API μ λ§€μ° μ μ¬ν©λλ€.
λμΌν PHPickerConfiguration νμ κ³Ό νλ‘νΌν°μ μ‘μΈμ€ ν μ μμ΅λλ€. μ½κ°μ μ°¨μ΄μ μ PHPickerViewController κ° AppKit μ±μ μν NSViewController νμ ν΄λμ€λΌλ κ²μ λλ€.
(NSβ¦ : NextSoftware λ objective-C μ λΌμ΄μ μ€λ₯Ό λ°μ NEXTSTEP μ΄λΌλ κ°λ° νκ²½κ³Ό λΌμ΄λΈλ¬λ¦¬λ₯Ό κ°λ°νμλ€. μ΄ν Next Computer μ Sun Microsystems λ NEXTSTEP μμ€ν μ νμ€ κ·κ²©μ λ°ννκ³ μ΄λ₯Ό OPENSTEP μΌλ‘ λͺ λͺ νλ€. μ΄ν μ νμ λ₯μ€νΈ μννΈμ¨μ΄λ₯Ό μΈμνκ³ NEXTSTEP/OPENSTEP μ κ°λ°νκ²½μ μ ν λ²μ μμ Cocoa(μ½μ½μ)λΌκ³ μΉνλ€. NS μ λμ¬λ NEXTSTEP λ μμ±λ μ½λμμ νΈνμ μ μ§νκΈ°μν΄ μ νμ΄ μ¬μ©νκ³ μλ€.)
AppKit κΈ°λ°μ PHPicker μ λμ μΌλ‘ legacy media libraray browser μμ λ²μ΄λ λμ λλ€. PHPicker λ ν¨μ¬ λ κ°λ ₯ν©λλ€. UIKit κ³Ό AppKit μ±μ λμμ μμ ν λ μ μ§κ΄λ¦¬κ° μ½μ΅λλ€.
iOS picker λ₯Ό κΈ°μ΅νμλμ? λͺ μ€μ SwiftUI μ½λλ‘ νμν μ μμ΅λλ€.
λ μ€μν κ²μ iOS, iPadOS, macOS κ·Έλ¦¬κ³ watchOS μ κ°μ΄ picker κ° μ§μλλ λͺ¨λ νλ«νΌμμ SwiftUI PhotosPicker API μ μ‘μΈμ€ν μ μλ€λ κ²μ λλ€. picker λ μλμΌλ‘ νλ«νΌ, μ±μ ꡬμ±, μ¬μ© κ°λ₯ν μ€ν¬λ¦° 곡κ°μ λ°λΌ μ΅μ μ λ μ΄μμμ μλμΌλ‘ μ νν©λλ€.
picker UI μ λν΄μ κ±±μ ν νμκ° μμΌλ―λ‘ μ±μ κ°μ νλλ° μ§μ€ν μ μμ΅λλ€.
λ°λͺ¨λ₯Ό ν΅ν΄ μλ‘μ΄ API λ₯Ό μμΈν μ΄ν΄λ³΄κΈ° μ μ λ¨Όμ μ νν μ¬μ§λ€κ³Ό λΉλμ€λ€μ λ‘λνλ λ°©λ²μ λν΄ μ΄μΌκΈ°ν΄μΌ ν©λλ€.
SwiftUI λ°μΈλ©μ ν΅ν΄ λ°λ μ ν νλͺ©μ λν΄μ placeholder κ°μ²΄λ§ ν¬ν¨ν©λλ€. μμ² μμ μμ λ°μ΄ν°λ₯Ό μ¦μ λ‘λν΄μΌν μ μμ΅λλ€. νμ§λ§ μΌλΆ μμ λ°μ΄ν°λ€μ μ¦μ λ‘λλμ§ μμ΅λλ€.
μλ₯Ό λ€μ΄ picker κ° iCloud Photos λ‘λΆν° λ°μ΄ν°λ₯Ό λ€μ΄λ‘λνλ €κ³ νμ§λ§ κΈ°κΈ°κ° μΈν°λ·κ³Ό μ°κ²°λμ§ μμ κ²½μ°μ κ°μ΄ μ€λ₯κ° λ°μν λλ λ‘λ μμ μ΄ μ€ν¨ν μ μμ΅λλ€. μΌλΆ λμ©λ λμμκ³Ό κ°μ λ€μ΄λ‘λκ° μ€λ걸리λ ν° νμΌμ κ²½μ°λ loading indicator λμ νλͺ©λ³ inline loading UI λ₯Ό κΆμ₯ν©λλ€.
PhotosPicker λ μ±κ³Ό extensions κ°μ λ°μ΄ν° μ μ‘μ μν μλ‘μ΄ SwiftUI νλ‘ν μ½μΈ Transferable
μ μ¬μ©ν©λλ€. Transfeable μ ν΅ν΄ SwiftUI μ΄λ―Έμ§λ₯Ό μ§μ λ‘λν μ μμ§λ§ advanced use cases μ κ²½μ° λ‘λνλ €λ λ°μ΄ν° νμ
μ μμ ν μ μ΄νκΈ° μν΄ Transfeable νλ‘ν μ½μ μ€μνλ λͺ¨λΈ κ°μ²΄λ₯Ό μ μν΄μΌ ν©λλ€.
Transferable μ λν μμΈν λ΄μ©μ Meet Transferable
μΈμ
μμ νμΈν μ μμ΅λλ€.
λ§μ½ μ±μ΄ λμμ λ§μ μμ΄ν μ μ²λ¦¬νκ±°λ λΉλμ€μ κ°μ ν° μμ μ μ²λ¦¬ν΄μΌ νλ κ²½μ°μλ λμμ λͺ¨λ κ²λ€μ λ©λͺ¨λ¦¬μ λ‘λνλ κ²μ΄ λΆκ°λ₯ν μ μμ΅λλ€. λ©λͺ¨λ¦¬ μ¬μ©λμ μ€μ΄κΈ° μν΄μ FileTransferRepresentation μ μ¬μ©νμ¬ μ νν μμ μ νμΌλ‘μ¨ λ‘λν μ μμ΅λλ€.
μμ μ νμΌλ‘μ¨ λ‘λν λ lifecycles λ₯Ό κ΄λ¦¬ν΄μΌ νλ€λ κ²μ μΌλμ λ¬μΌν©λλ€. νμΌμ λ°μΌλ©΄ μ± λλ ν 리μ 볡μ¬νκ³ λ μ΄μ νμνμ§ μμΌλ©΄ μμ ν΄μΌ ν©λλ€.
μ, μ΄μ λ°λͺ¨λ₯Ό ν μκ°μ λλ€!
μ΄λ―Έ κ³μ νλ‘ν νμ΄μ§λ₯Ό νμνλ λ°λͺ¨ μ±μ μ€μ νμ΅λλ€. νμ¬ νλ‘ν μ΄λ―Έμ§λ placeholder μμ΄μ½μ λλ€. μ°λ¦¬λ PhotosPicker API λ₯Ό μ¬μ©νμ¬ νλ‘ν μ΄λ―Έμ§λ₯Ό λ³κ²½νλ edit button μΆκ°νκ³ μ ν©λλ€.
νλ‘ν μ΄λ―Έμ§ λ·°λ view model μ μ μλ image state μ μλ΅ν μ μμΌλ―λ‘ picker selection μ΄ μμ λ λ μ΄λ―Έμ§ μνλ₯Ό μ λ°μ΄νΈνκΈ°λ§ νλ©΄ λ©λλ€.
λ¨Όμ , view model λ‘ κ°μ imageSelection νλ‘νΌν°λ₯Ό μΆκ°ν΄ λ³΄κ² μ΅λλ€.
selection λ°μΈλ©μΌλ‘ PhotosPicker API μ μ λ¬λ©λλ€. μ΄μ νλ‘ν μ΄λ―Έμ§ λ·°λ‘ λμκ°μ picker λ₯Ό κ°μ Έμ€λ μ€λ²λ μ΄ λ²νΌμ μΆκ°ν΄λ΄ μλ€.
λΉλνκ³ μ€ννλ©΄ νΈμ§ λ²νΌμ λλ¬ picker λ₯Ό λΆλ¬μ¬ μ μμ΅λλ€.
μ΄μ image selection κ³Ό image state λ₯Ό μ°κ²°ν΄ λ³΄κ² μ΅λλ€. view model λ‘ λμκ°μ image selection did set μ μμ ν μ μμ΅λλ€. image selection μ΄ nil μ΄λΌλ©΄ image state λ₯Ό 곡백μΌλ‘ μ€μ ν©λλ€.
μμ§ loadTransferable λ©μλλ₯Ό ꡬννμ§ μμκΈ° λλ¬Έμ μ»΄νμΌ μλ¬λ₯Ό λ³Ό μ μμ΅λλ€.
ꡬνμ κ°λ¨ν©λλ€. completion handler μ μλ΅νκ³ image state λ₯Ό μ λ°μ΄νΈνλ©΄ λ©λλ€.
PhotosPickerItem μ loadTransferable(type:completionHandler:)
λ©μλλ₯Ό μ¬μ©νμ¬ μ»΄ν리μ
νΈλ€λ¬λ₯Ό ν΅ν΄ μ§μ ν νμ
μ μΈμ€ν΄μ€λ‘ λ‘λνλλ‘ κ΅¬ννμ΅λλ€.
νΈμ§ λ²νΌμ ννκ³ μ΄λ―Έμ§λ₯Ό μ νν μ μμ΅λλ€. μμλλ‘ μλν©λλ€!
μ¬μ€ νλ‘μ νΈλ μ΄λ―Έ macOS μμλ μ€νν μ μλλ‘ μ€μ λμ΄ μμ΅λλ€. μ»΄νμΌ ν΄λ΄ μλ€.
picker λ₯Ό μ΄κ³ μ΄λ―Έμ§λ₯Ό μ ννλ©΄ μ±μ λ°μλ κ²μ λ³Ό μ μμ κ²μ λλ€.
iOS μ macOS μμ λ°λͺ¨λ₯Ό 보μμ§λ§ λμΌν μ½λκ° watchOS μμλ μλν©λλ€. κ·Έλ¬λ λͺ μ¬ν΄μΌν κ²μ΄ λͺ κ°μ§ μμ΅λλ€.
watchOS picker λ κ°λ¨ν νλ¦κ³Ό 짧μ μΈν°λ μ μΌλ‘ λμμΈλμ΄μμ΅λλ€. μ΄λ―Έμ§λ κΈ°κΈ°μ μ¬μ΄μ¦μ λ°λΌ ν¬κΈ°κ° μ‘°μ λ©λλ€. μΌλ°μ μΌλ‘ νμ΄λ§λ iPhone μ λκΈ°νλ©λλ€.
κ·Έλ¬λ Family Setup(κ°μ‘± μ€μ ) μ μ¬μ©νλ©΄ μμ μ iPhone μ΄ μλ κ°μ‘± ꡬμ±μμ΄ Apple Watch μ κΈ°λ₯κ³Ό μ΄μ μ μ¦κΈΈ μμμ΅λλ€. κΈ°κΈ°κ° Family Setup λͺ¨λμΈ κ²½μ° picker λ₯Ό μ¬μ©νμ¬ iCloud Photos μ μλ μ΅κ·Ό 1000κ°μ μ΄λ―Έμ§λ₯Ό μ νν μ μμ΅λλ€. picker λ μΈν°λ·μμ μΌλΆ μ΄λ―Έμ§λ₯Ό λ€μ΄λ‘λν΄μΌνκ³ , μ΄ κ²½μ° picker κ° λ«νκΈ° μ loading UI κ° λ³΄μ¬μ§λλ€.
μ¬λ¬λΆμ΄ κ°μκΈ° μ μ μ±μ΄ μ¬μ§κ³Ό λΉλμ€μ μ‘μΈμ€ν μ μλ κ°μ₯ μ’μ λ°©λ²μΌλ‘ systme Photos picker λ₯Ό λ§λ€κΈ° μν΄ μ΅μ μ λ€νκ³ μλ€λ κ²μ λ§μλλ¦¬κ³ μΆμ΅λλ€. λΉμ μ΄ μ»€μ€ν picker λ₯Ό μ¬μ ν μ¬μ©νκ³ μλ κ²½μ° μ ννλ κ²μ΄ μ’μ΅λλ€. κ°μ¬ν©λλ€!