UICollectionView 🍎

YaR LabΒ·2023λ…„ 7μ›” 23일

iOS 🍎

λͺ©λ‘ 보기
11/26
post-thumbnail

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

0개의 λŒ“κΈ€