1οΈβ£ μ μ
μ λ ¬λ λ°μ΄ν° νλͺ© 컬λ μ
μ κ΄λ¦¬νκ³ μ¬μ©μ μ§μ κ°λ₯ν λ μ΄μμμ μ¬μ©νμ¬ νμνλ λ·°
@MainActor
class UICollectionView : UIScrollView
2οΈβ£ μ€λͺ
- 컬λ μ
λ·°λ λ°μ΄ν° μμ€ κ°μ²΄μμ λ°μ΄ν°λ₯Ό κ°μ Έμμ 컬λ μ
λ·°μ
dataSource νλ‘νΌν°μ μ μ₯
dataSourceμ κ²½μ° μ»¬λ μ
λ·°μ λ°μ΄ν° λ° μ¬μ©μ μΈν°νμ΄μ€μ λν μ
λ°μ΄νΈλ₯Ό κ°λ¨νκ³ ν¨μ¨μ μΌλ‘ κ΄λ¦¬νλ λ° νμν λμμ μ 곡νλ UICollectionViewDiffableDataSource κ°μ²΄λ₯Ό μ¬μ©
- λλ
UICollectionViewDataSource νλ‘ν μ½μ μ±ννμ¬ μ¬μ©μ μ§μ λ°μ΄ν° μμ€ κ°μ²΄λ₯Ό λ§λ€ μ μμ
- 컬λ μ
λ·°μ λ°μ΄ν°λ κ°λ³ νλͺ©μΌλ‘ ꡬμ±λλ©°, μ΄λ₯Ό μΉμ
μΌλ‘ κ·Έλ£Ήννμ¬ νλ μ ν
μ΄μ
ν μ μμ
itemμ νμνλ €λ λ°μ΄ν°μ κ°μ₯ μμ λ¨μ
- μλ₯Ό λ€μ΄ μ¬μ§ μ±μμ
itemμ λ¨μΌ μ΄λ―Έμ§μΌ μ μμ
- 컬λ μ
λ·°λ λ°μ΄ν° μμ€μμ ꡬμ±νκ³ μ 곡νλ
UICollectionViewCell ν΄λμ€μ μΈμ€ν΄μ€μΈ μ
μ μ¬μ©νμ¬ νλ©΄μ νλͺ©μ νμ
- 컬λ μ
λ·°λ μ
μΈμλ λ€λ₯Έ μ νμ λ·°λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό νμν μ μμ
- μ΄λ¬ν
supplementary view λ€μ κ° μ
κ³Ό λ³κ°λ‘ μΉμ
ν€λμ νΈν°λ₯Ό ν¬ν¨ν μ μμΌλ©° μ 보λ₯Ό μ λ¬ν¨
supplementary view ꡬνμ μ νμ μ΄λ©° 컬λ μ
λ·°μ λ μ΄μμ κ°μ²΄μ μν΄ μ μλλ©° λν ν΄λΉ λ·°λ€μ λ°°μΉλ₯Ό μ μνλ μν μ μν
- μ¬μ©μ μΈν°νμ΄μ€μ
UICollectionViewλ₯Ό μλ² λνλ κ² μΈμλ 컬λ μ
λ·°μ λ©μλλ₯Ό μ¬μ©νμ¬ νλͺ©μ μκ°μ νμκ° λ°μ΄ν° μμ€ κ°μ²΄μ μμμ μΌμΉνλλ‘ ν μ μμ
UICollectionViewDiffableDataSource κ°μ²΄κ° μ΄ νλ‘μΈμ€λ₯Ό μλμΌλ‘ κ΄λ¦¬ν¨
- μ¬μ©μ μ§μ λ°μ΄ν° μμ€λ₯Ό μ¬μ©νλ κ²½μ° μ»¬λ μ
μμ λ°μ΄ν°λ₯Ό μΆκ°, μμ λλ μ¬μ λ ¬ν λλ§λ€
UICollectionViewμ λ©μλλ₯Ό μ¬μ©νμ¬ ν΄λΉ μ
μ μ½μ
, μμ λ° μ¬μ λ ¬ν¨
- 컬λ μ
λ·° κ°μ²΄λ₯Ό μ¬μ©νμ¬ μ νν νλͺ©μ κ΄λ¦¬ν μλ μμ§λ§, μ΄ λμμ κ²½μ° μ»¬λ μ
λ·°λ μ°κ²°λ λΈλ¦¬κ²μ΄νΈ κ°μ²΄μ ν¨κ» μλν¨
π Layouts
- λ μ΄μμ κ°μ²΄λ 컬λ μ
λ·°μμ μ½ν
μΈ μ μκ°μ λ°°μ΄μ μ μν¨
UICollectionViewLayout ν΄λμ€μ νμ ν΄λμ€μΈ λ μ΄μμ κ°μ²΄λ 컬λ μ
λ·° λ΄μ λͺ¨λ μ
λ° λ³΄μ‘° 보기μ ꡬμ±κ³Ό μμΉλ₯Ό μ μν¨
- λ μ΄μμ κ°μ²΄λ ν΄λΉ μμΉλ₯Ό μ μνμ§λ§ μ€μ λ‘ ν΄λΉ μ 보λ₯Ό ν΄λΉ λ·°μ μ μ©νμ§λ μμ
- μ
λ° λ³΄μ‘° λ·°λ₯Ό λ§λ€λ €λ©΄ 컬λ μ
λ·°μ λ°μ΄ν° μμ€ κ°μ²΄ κ°μ μ‘°μ μ΄ νμνκΈ° λλ¬Έμ 컬λ μ
λ·°λ ν΄λΉ λ·°μ λ μ΄μμ μ 보λ₯Ό μ μ©ν¨
- λ μ΄μμ κ°μ²΄λ νλͺ© λ°μ΄ν° λμ μκ°μ μ 보λ₯Ό μ 곡νλ€λ μ μ μ μΈνλ©΄ λ€λ₯Έ λ°μ΄ν° μμ€μ λΉμ·ν¨
- μΌλ°μ μΌλ‘ 컬λ μ
λ·°λ₯Ό λ§λ€ λ λ μ΄μμ κ°μ²΄λ₯Ό μ§μ νμ§λ§ 컬λ μ
λ·°μ λ μ΄μμμ λμ μΌλ‘ λ³κ²½ν μλ μμ
- λ μ΄μμ κ°μ²΄λ
collectionViewLayout νλ‘νΌν°μ μ μ₯λ¨
- μ΄ νλ‘νΌν°λ₯Ό μ€μ νλ©΄ λ³κ²½ μ¬νμ μ λλ©μ΄μ
μ μ μ©νμ§ μκ³ λ μ΄μμμ΄ μ¦μ μ
λ°μ΄νΈλ¨
- λ³κ²½ μ¬νμ μ λλ©μ΄μ
μ μ μ©νλ €λ©΄ λμ
setCollectionViewLayout(_:animated:completion:) λ©μλλ₯Ό νΈμΆνλ©΄ λ¨
gesture recognizer λλ touch eventsμ μν΄ κ΅¬λλλ μΈν°λν°λΈ νΈλμ§μ
μ λ§λ€λ €λ©΄ startInteractiveTransition(to:completion:) λ©μλλ₯Ό μ¬μ©νμ¬ λ μ΄μμ κ°μ²΄λ₯Ό λ³κ²½ν΄μΌν¨
- μ΄ λ©μλλ
gesture recognizer λλ event-handling codeμ ν¨κ» μλνμ¬ μ ν μ§ν μν©μ μΆμ νλ μ€κ° λ μ΄μμ κ°μ²΄λ₯Ό μ€μΉν¨
- μ΄λ²€νΈ μ²λ¦¬ μ½λκ° μ νμ΄ μλ£λμλ€κ³ νλ¨νλ©΄
finishInteractiveTransition() λλ cancelInteractiveTransition() λ©μλλ₯Ό νΈμΆνμ¬ μ€κ° λ μ΄μμ κ°μ²΄λ₯Ό μ κ±°νκ³ μλν λμ λ μ΄μμ κ°μ²΄λ₯Ό μ€μΉν¨
π Cells and supplementary views
- 컬λ μ
λ·°μ λ°μ΄ν° μμ€ κ°μ²΄λ μμ΄ν
μ μ½ν
μΈ μ ν΄λΉ μ½ν
μΈ λ₯Ό νμνλ λ° μ¬μ©λλ λ·°λ₯Ό λͺ¨λ μ 곡
- 컬λ μ
λ·°κ° μ²μ μ½ν
μΈ λ₯Ό λ‘λν λ, κ° κ°μμ μΈ μμ΄ν
μ λν΄ λ°μ΄ν° μμ€μκ² λ·°λ₯Ό μ 곡νλλ‘ μμ²
- 컬λ μ
λ·°λ λ°μ΄ν° μμ€κ° μ¬μ¬μ©μ μν΄ νμν λ·° κ°μ²΄λ€μ νλ 리μ€νΈλ₯Ό μ μ§ν¨
- μ½λμμ μλ‘μ΄ λ·°λ₯Ό λͺ
μμ μΌλ‘ μμ±νλ λμ μ, νμ λ·°λ₯Ό μ¬μ¬μ© λκΈ° νμμ
dequeue ν¨
- λ·°λ₯Ό dequeueνλ λ°μλ λ κ°μ§ λ°©λ²μ΄ μλλ°, μ΄λ€ μ νμ λ·°κ° μμ²λμλμ§μ λ°λΌ λ€μκ³Ό κ°μ λ κ°μ§ λ©μλλ₯Ό μ¬μ©ν¨
λ·°λ₯Ό dequeueνλ λ©μλ
dequeueReusableCell(withReuseIdentifier:for:) : μ΄ λ©μλλ 컬λ μ
λ·°μ μμ΄ν
(μ
)μ λν λ·°λ₯Ό κ°μ Έμ€λ λ° μ¬μ©λ¨
dequeueReusableSupplementaryView(ofKind:withReuseIdentifier:for:) : μ΄ λ©μλλ λ μ΄μμ κ°μ²΄κ° μμ²ν 보좩 λ·°(μ: μΉμ
ν€λ λλ νΈν°)λ₯Ό κ°μ Έμ€λ λ° μ¬μ©λ¨
- λ λ©μλ μ€ νλλ₯Ό νΈμΆνκΈ° μ μ, ν΄λΉ λ·°κ° μ‘΄μ¬νμ§ μμ κ²½μ° μ»¬λ μ
λ·°μκ² λ·°λ₯Ό μ΄λ»κ² μμ±ν΄μΌ νλμ§ μλ €μ£Όμ΄μΌ ν¨
- μ΄λ₯Ό μν΄ μ»¬λ μ
λ·°μ ν΄λμ€(class) λλ λλΈ(NIB) νμΌμ λ±λ‘ν΄μΌ ν¨
- μ
μ λ±λ‘ν λλ
register(:forCellWithReuseIdentifier:) λ©μλλ₯Ό μ¬μ©νμ¬ ν΄λμ€λ₯Ό λ±λ‘νκ±°λ register(:forCellWithReuseIdentifier:) λ©μλλ₯Ό μ¬μ©νμ¬ λλΈ νμΌμ λ±λ‘ν¨
- λ±λ‘ κ³Όμ μμ λ·°μ μ¬μ¬μ© μλ³μ(reuse identifier)λ₯Ό μ§μ ν¨
- μ΄ μλ³μλ λμ€μ λ·°λ₯Ό
dequeueν λ μ¬μ©νλ λ¬Έμμ΄κ³Ό λμΌ
- λ°μ΄ν° μμ€ λ©μλμμ μ μ ν λ·°λ₯Ό
dequeueν ν, ν΄λΉ λ·°μ μ½ν
μΈ λ₯Ό ꡬμ±νκ³ μ»¬λ μ
λ·°μ λ°ννμ¬ μ¬μ©ν¨
- λ μ΄μμ κ°μ²΄λ‘λΆν° λ μ΄μμ μ 보λ₯Ό κ°μ Έμ¨ ν, 컬λ μ
λ·°λ μ΄λ₯Ό ν΄λΉ λ·°μ μ μ©νκ³ νλ©΄μ νμν¨
π Data prefetching
- 컬λ μ
λ·°λ λ°μμ±μ ν₯μμν€κΈ° μν΄ μ¬μ©ν μ μλ λ κ°μ§ μ¬μ κ°μ Έμ€κΈ°(prefetching) κΈ°μ μ μ 곡ν¨
1οΈβ£ Cell prefetching
- μ
μ¬μ κ°μ Έμ€κΈ°(Cell prefetching)λ ν΄λΉ μ
λ€μ΄ νμν μκ° μ΄μ μ 미리 μ€λΉνλ κΈ°μ
- μλ₯Ό λ€μ΄, 그리λ λ μ΄μμμμ μλ‘μ΄ μ
νμ νμν΄μΌ ν λ, ν λ²μ λ§μ μμ μ
μ΄ νμνκ² λ¨
그리λ λ μ΄μμ
- μμλ€μ 격μ ννλ‘ λ°°μΉνλ λ μ΄μμ λ°©μ
- μΌμ ν κ°κ²©μΌλ‘ νκ³Ό μ΄μ νμ±νμ¬ μμλ€μ μ λ ¬νλ λ°©λ²
- μ΄λ μ
λ€μ νλ©΄μ νμλκΈ° μ μ 미리 μμ²λ¨
- λ°λΌμ μ
λ λλ§μ μ¬λ¬ λ μ΄μμ ν¨μ€(layout pass)μ κ±Έμ³ λΆμ°λλ©°, μ΄λ‘ μΈν΄ λ λΆλλ¬μ΄ μ€ν¬λ‘€λ§ κ²½νμ΄ μ΄λ£¨μ΄μ§
- μ
μ¬μ κ°μ Έμ€κΈ°λ κΈ°λ³Έμ μΌλ‘ νμ±νλμ΄ μμ
2οΈβ£ Data prefetching
- λ°μ΄ν° μ¬μ κ°μ Έμ€κΈ°(Data prefetching)λ μ
μμ²μ΄ λ°μνκΈ° μ μ 미리 컬λ μ
λ·°μ λ°μ΄ν° μꡬ μ¬νμ λν΄ μλ €μ£Όλ λ©μ»€λμ¦μ μ 곡
- μ΄λ μ
μ μ½ν
μΈ κ° λΉμ©μ΄ λ§μ΄ λλ λ°μ΄ν° λ‘λ© κ³Όμ (μ: λ€νΈμν¬ μμ²)μ μμ‘΄νλ κ²½μ°μ μ μ©ν¨
- λ°μ΄ν° μ¬μ κ°μ Έμ€κΈ°λ₯Ό μν΄
UICollectionViewDataSourcePrefetching νλ‘ν μ½μ μ€μνλ κ°μ²΄λ₯Ό prefetchDataSource μμ±μ ν λΉνμ¬ μ
λ°μ΄ν°λ₯Ό μ¬μ μ κ°μ Έμ¬ μμ μ λν μλ¦Όμ λ°μ μ μμ
π Reorder items interactively
- 컬λ μ
λ·°λ μ¬μ©μ μνΈμμ©μ λ°λΌ νλͺ©λ€μ μ΄λν μ μλλ‘ νμ©
- μΌλ°μ μΌλ‘ 컬λ μ
λ·°μ νλͺ©λ€μ μμλ λ°μ΄ν° μμ€μ μν΄ μ μλ¨
- νμ§λ§ νλͺ©λ€μ μ¬μ λ ¬μ μ¬μ©μμκ² νμ©νλ€λ©΄, μ μ€μ² μΈμκΈ°(gesture recognizer)λ₯Ό ꡬμ±νμ¬ μ¬μ©μμ 컬λ μ
λ·° νλͺ©κ³Όμ μνΈμμ©μ μΆμ νκ³ ν΄λΉ νλͺ©μ μμΉλ₯Ό μ
λ°μ΄νΈν μ μμ
- νλͺ©μ μνΈμμ©μ μΈ μ¬λ°°μΉλ₯Ό μμνλ €λ©΄, 컬λ μ
λ·°μ
beginInteractiveMovementForItem(at:) λ©μλλ₯Ό νΈμΆν¨
- μ μ€μ² μΈμκΈ°(gesture recognizer)κ° ν°μΉ μ΄λ²€νΈλ₯Ό μΆμ νλ λμ,
updateInteractiveMovementTargetPosition(_:) λ©μλλ₯Ό νΈμΆνμ¬ ν°μΉ μμΉμ λ³κ²½ μ¬νμ λ³΄κ³ ν¨
- μ μ€μ² μΆμ μ λ§μΉλ©΄,
endInteractiveMovement() λλ cancelInteractiveMovement() λ©μλλ₯Ό νΈμΆνμ¬ μνΈμμ©μ λ§λ¬΄λ¦¬νκ³ μ»¬λ μ
λ·°λ₯Ό μ
λ°μ΄νΈν¨
- μ¬μ©μ μνΈμμ© μ€μ 컬λ μ
λ·°λ νλͺ©μ νμ¬ μμΉλ₯Ό λ°μνκΈ° μν΄ λμ μΌλ‘ λ μ΄μμμ 무ν¨νν¨
- μ무 μ‘°μΉλ₯Ό μ·¨νμ§ μμΌλ©΄, κΈ°λ³Έ λ μ΄μμ λμμ λ°λΌ νλͺ©λ€μ΄ μλμΌλ‘ μ¬λ°°μΉλμ§λ§, μνλ€λ©΄ λ μ΄μμ μ λλ©μ΄μ
μ μ¬μ©μ μ μν μλ μμ
- μνΈμμ©μ΄ λλλ©΄, 컬λ μ
λ·°λ λ°μ΄ν° μμ€ κ°μ²΄λ₯Ό μλ‘μ΄ νλͺ© μμΉλ‘ μ
λ°μ΄νΈν¨
UICollectionViewController ν΄λμ€λ κ΄λ¦¬νλ 컬λ μ
λ·°μμ νλͺ©λ€μ μ¬λ°°μΉνκΈ° μν΄ μ¬μ©ν μ μλ κΈ°λ³Έ μ μ€μ² μΈμκΈ°λ₯Ό μ 곡ν¨
- μ΄ κΈ°λ³Έ μ μ€μ² μΈμκΈ°λ₯Ό μ€μΉνλ €λ©΄, 컬λ μ
λ·° 컨νΈλ‘€λ¬μ
installsStandardGestureForInteractiveMovement μμ±μ trueλ‘ μ€μ νλ©΄ λ¨
μΆμ²π
πApple Docs: UICollectionView