λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS/WWDC

[WWDC19] Advances in Collection View Layout - Part 1

by Danna 2022. 10. 17.
728x90
728x90
 

Advances in Collection View Layout - WWDC19 - Videos - Apple Developer

Collection View Layouts make it easy to build rich interactive collections. Learn how to make dynamic and responsive layouts that range...

developer.apple.com

πŸ‘‹ WWDC19 - Advances in Collection View Layout

Current State-of-the-Art

  • UICollectionView λŠ” iOS 6 μ—μ„œ 처음 μ†Œκ°œλ˜μ—ˆλ‹€.
  • 데이터λ₯Ό λ Œλ”λ§ν•˜λŠ” ν΄λž˜μŠ€μ™€ CollectionView 의 layout 을 κ΄€λ¦¬ν•˜λŠ” λ‘κ°œμ˜ ν΄λž˜μŠ€κ°€ ν•„μš”ν–ˆλ‹€.
  • CollectionView layout 은 μΆ”μƒν™”λœ νƒ€μž…μ΄κ³ , μ„œλΈŒν΄λž˜μŠ€λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  • μ„œλΈŒ 클래슀인 CollectionView flow layout 을 iOS 6λΆ€ν„° 같이 μ‚¬μš©ν–ˆλ‹€.

  • CollectionView layout 은 라인 기반의 λ ˆμ΄μ•„μ›ƒμ„ λ§Œλ“œλŠ”λ° μ ν•©ν–ˆμ§€λ§Œ, μš”μ¦˜μ˜ 앱듀은 λ ˆμ΄μ•„μ›ƒμ΄ 점점 λ³΅μž‘ν•΄μ§€κ³  μžˆλ‹€.
  • iOS 13 μ—μ„œ μƒˆλ‘­κ²Œ λ‚˜μ˜¨ μ•±μŠ€ν† μ–΄μ˜ UI πŸ€”?!

λ³΅μž‘ν•œ 화면에 λŒ€ν•΄ custom layout class λ₯Ό λ§Œλ“ λ‹€λ©΄ κ³ λ €ν•΄μ•Όν•  점이 λ§Žλ‹€.

  • Boilerplate code 도 많이 μƒμ„±λ˜κ³ ,
  • ν•΄λ‹Ή λ””μžμΈμ΄ 퍼포먼슀 μ΄μŠˆκ°€ μžˆλŠ”μ§€ 체크도 ν•΄μ•Όν•˜κ³ 
  • 헀더 ν‘Έν„° λ“± Supplementary view, decoration view (λ°°κ²½?) 을 λ ˆμ΄μ•„μ›ƒμœΌλ‘œ μ„€μ •ν•˜κΈ°λŠ” κΉŒλ‹€λ‘­λ‹€.
  • μ…€ν”„ 사이징도 μ²˜λ¦¬ν•΄μ•Όν• κ²Œ λ§Žλ‹€ πŸ˜“
  • κ·Έλ¦¬ν•˜μ—¬..! λ ˆμ΄μ•„μ›ƒμ„ λ§Œλ“œλŠ” 클래슀λ₯Ό μƒˆλ‘­κ²Œ κ°€μ Έμ™”κ³ , Compositional Layout 이라고 λΆ€λ₯΄κΈ°λ‘œ ν–ˆλ‹€.

🌟 What is compositional layout?

컴포지셔널 λ ˆμ΄μ•„μ›ƒμ˜ 세가지 κΈ°μ‘°λŠ” Composable, Flexible, Fast (ꡬ성 κ°€λŠ₯ν•œ, μœ μ—°ν•œ, λΉ λ₯Έ) 이닀.

  • μœ μ—°ν•˜κ²Œ μ„€κ³„λ˜μ–΄ μžˆκΈ°μ— compositional layout 으둜 λͺ¨λ“  λ ˆμ΄μ•„μ›ƒμ„ μž‘μ„±ν•  수 μžˆμ„κ²ƒμ΄λ‹€.
  • ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ„±λŠ₯에 λŒ€ν•œ μ΅œμ ν™”λ₯Ό μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ— 기본적으둜 λΉ λ₯΄λ‹€.
  • compositional layout λŠ” μ„€λͺ…ν•˜κ±°λ‚˜ μ •μ˜ν•˜λŠ” μ‹μœΌλ‘œ μ›ν•˜λŠ” μž‘μ—…μ„ μž‘μ„±ν•˜λŠ” μ„ μ–Έν˜• API 의 일쒅이닀.

πŸ‘‹ Hello world compositional layout

  • layout 은 section 으둜 κ΅¬μ„±λ˜μ–΄ 있고,
  • section 은 group 으둜 κ΅¬μ„±λ˜μ–΄ 있고,
  • group 은 size λ₯Ό ν•„μš”λ‘œ ν•˜λ©° item λ“€λ‘œ κ΅¬μ„±λ˜μ–΄ 있고,
  • item 은 size λ₯Ό ν•„μš”λ‘œ ν•œλ‹€.

NSCollectionLayoutSize

  • μ‚¬μ΄μ¦ˆλŠ” λ„ˆλΉ„μ™€ 높이λ₯Ό κ°–λŠ”λ‹€.

  • λ„ˆλΉ„μ™€ λ†’μ΄λŠ” NSCollectionLayoutDimension μœΌλ‘œ λ˜μ–΄μžˆλ‹€.
    • fractionalHeight, fractionalWidth : containing group (row) 을 κΈ°μ€€μœΌλ‘œ λΉ„μœ¨μ— 따라 μ •μ˜ν•  수 μžˆλ‹€.
    • absolute : μ ˆλŒ€μ μΈ point κ°’
    • estimated : μ˜ˆμΈ‘λ˜λŠ” point κ°’, ν•΄λ‹Ή 값보닀 컀질 수 μžˆλ‹€.

NSCollectionLayoutItem

  • μ•„μ΄ν…œμ€ 기쑴의 cell μ΄λ‚˜ supplementary view 와 κ°™λ‹€.
  • μƒμ„±μ‹œμ— Size λ₯Ό λ„˜κ²¨μ£Όλ©΄ λœλ‹€.

NSCollectionLayoutGroup

  • 그룹은 λ ˆμ΄μ•„μ›ƒμ˜ κΈ°λ³Έ λ‹¨μœ„μ΄κ³ , κ°€λ‘œ, μ„Έλ‘œ, μ»€μŠ€ν…€ 세가지 ν˜•νƒœκ°€ μžˆλ‹€.
  • μ•„μ΄ν…œλ“€μ΄ κ°€λ‘œ μ„Έλ‘œ 좕을 따라 그렀지지 μ•ŠλŠ” 경우 μ»€μŠ€ν…€ ν˜•νƒœλ₯Ό μ‚¬μš©ν•΄μ„œ νŠΉμ • μ’Œν‘œμ™€ μœ„μΉ˜λ₯Ό μ§€μ •ν•˜λ©΄ λœλ‹€.

NSCollectionLayoutSection

  • CollectionView 의 κΈ°μ‘΄ μ„Ήμ…˜κ³Ό λ™μΌν•˜κ³ , μ„Ήμ…˜μ— λ‚˜νƒ€λ‚Ό λ°μ΄ν„°λŠ” 데이터 μ†ŒμŠ€μ— λ§€ν•‘λœλ‹€.

UICollectionViewCompositionalLayout

  • iOS 의 κ²½μš°μ—λŠ” UICollectionViewCompositionalLayout 이 μ΅œμƒμœ„ λ ˆμ΄μ•„μ›ƒ ν΄λž˜μŠ€κ°€ λœλ‹€.
  • Mac μ—μ„œμ˜ λ ˆμ΄μ•„μ›ƒ ν΄λž˜μŠ€λŠ” λ‹€λ₯Έλ° μ‚¬μ†Œν•œ 차이점듀이 μžˆλ‹€.
  • sectionProvider κ°€ μžˆμ–΄ ν΄λ‘œμ €λ₯Ό 톡해 μ„Ήμ…˜λ§ˆλ‹€ λ ˆμ΄μ•„μ›ƒμ„ λ‹€λ₯΄κ²Œ μ„€μ •ν•  수 μžˆλ‹€.

Demo πŸ˜‡

  • λͺ¨λ“  μ½”λ“œλŠ” λ™μΌν•˜κ²Œ “Item - Group - Section - Layout” 인 4κ°€μ§€μ˜ 계측 ꡬ쑰둜 λ˜μ–΄μžˆλ‹€.
  • Item 의 크기λ₯Ό μ‹€μ œλ‘œ κ²°μ •ν•˜λŠ”κ±΄ group 의 크기이닀. 1μ€„μ§œλ¦¬μ—μ„œλŠ” ν°μ˜λ―Έκ°€ 없어보일 수 μžˆμ§€λ§Œ, group size 둜 λ ˆμ΄μ•„μ›ƒμ„ λ‹€μ–‘ν•˜κ²Œ λ°°μΉ˜ν•œλ‹€.
    첫번째 μ˜ˆμ œλŠ” groupSize κ°€ 100% 둜, height λŠ” absolute 44 둜 λ˜μ–΄μžˆμŒ
  • λ””λ°”μ΄μŠ€ νšŒμ „μ„ κ°€λ‘œ, μ„Έλ‘œλ‘œ ν–ˆμ„ λ•Œ λ™μΌν•œ 높이λ₯Ό 가짐

GridViewController

λ‘λ²ˆμ§Έ μ˜ˆμ œλŠ” κ°€λ‘œκΈ°μ€€ 5κ°œμ”© λ“€μ–΄κ°€λŠ” μ •μ‚¬κ°ν˜• μ•„μ΄ν…œ

  • group size μ˜ width 기쀀은 row ν•œ 쀄을 μ˜λ―Έν•˜κΈ°μ— 100% 둜 μ„€μ •ν•˜λ©΄ κ°€λ‘œ μ „μ²΄λ‘œ μ„€μ •λœλ‹€. height λŠ” row 에 λŒ€ν•œ 20% 둜 μ„€μ •λ˜μ–΄μžˆλ‹€.
  • item size μ—μ„œ μ„€μ •ν•˜λŠ” width λŠ” ν•˜λ‚˜μ˜ group λ˜λŠ” row λ₯Ό κΈ°μ€€μœΌλ‘œν•œλ‹€. width λŠ” groupSize 의 20% 이기에 ν•˜λ‚˜μ˜ row 에 5개의 μ•„μ΄ν…œμ΄ λ“€μ–΄κ°ˆ 수 μžˆλ‹€.

InsetItemsGridViewController

λ‘λ²ˆμ§Έ μ˜ˆμ œμ—μ„œ item κ°„ 간격을 두고 μ‹Άλ‹€λ©΄

  • item 에 inset 을 μΆ”κ°€ν•˜λ €λ©΄ item.contentInsets = NSDirectionEdgeInsets(...) ν•œμ€„μ˜ μ½”λ“œλ©΄ κ°€λŠ₯ν•˜λ‹€

TwoColumnViewController

μ„Έλ²ˆμ§Έ μ˜ˆμ œλŠ” two column grid example

  • NSCollectionLayoutGroup.horizontal 을 μ΄μš©ν•΄μ„œ column 을 2개둜 λ§Œλ“€μ—ˆλ‹€.
    • 1 개의 row 에 2개의 group 을 λ„£λŠ”λ‹€λŠ” 뜻 ?!
    • item 의 μ΅œλŒ€ width λŠ” group width 와 동일해진닀.
  • group κ³Ό section 에 λŒ€ν•œ 간격 μ„€μ •
    • group 의 spacing 은 interItemSpacing 을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.
    • section 에 λŒ€ν•΄μ„œλ„ contentInsets 을 μΆ”κ°€ν•  수 μžˆλ‹€.

DistinctSectionsViewController

λ„€λ²ˆμ§Έ μ˜ˆμ œλŠ” μ„Ήμ…˜λ§ˆλ‹€ λ ˆμ΄μ•„μ›ƒμ΄ λ‹€λ₯Έ ν˜•νƒœμ΄λ‹€.

  • 첫번째 μ„Ήμ…˜ : 1 column, 리슀트 ν˜•νƒœ
  • λ‘λ²ˆμ§Έ μ„Ήμ…˜ : 5 column, μ •μ‚¬κ°ν˜• μ•„μ΄ν…œ
  • μ„Έλ²ˆμ§Έ μ„Ήμ…˜ : 3 column, μ§μ‚¬κ°ν˜• μ•„μ΄ν…œ

createLayout λ©”μ†Œλ“œλ₯Ό 보면 UICollectionViewCompositionalLayout μƒμ„±μžμ—μ„œ sectionProvider ν΄λ‘œμ €λ₯Ό λ„˜κΈ°λŠ” 뢀뢄이 λ‹€λ₯΄λ‹€.

  • ν΄λ‘œμ €μ˜ λ§€κ°œλ³€μˆ˜ sectionIndex : 0, 1, 2 / layoutEnvironment : λ ˆμ΄μ•„μ›ƒ ν™˜κ²½
  • layoutEnvironment μ—μ„œ μ„€μ •ν•΄λ‘” columns 개수λ₯Ό group μƒμ„±μ‹œ count 인자둜 μ „λ‹¬ν•œλ‹€.
  • item, group, section 을 μ„€μ •ν•˜λŠ” 뢀뢄은 κΈ°μ‘΄ μ½”λ“œλ“€κ³Ό μ „λΆ€ λ™μΌν•˜λ‹€.

AdaptiveSectionsViewController

κ°€λ‘œλ‘œ νšŒμ „ν• λ•Œμ— μ•„μ΄ν…œ κ°œμˆ˜κ°€ λ‚˜νƒ€λ‚˜λŠ”κ²Œ μ„Έλ‘œμ™€ λ‹€λ₯Έ 건 μ–΄λ–»κ²Œ ν–ˆμ„κΉŒμš” πŸ˜‡

  • 이전 μ˜ˆμ œμ™€ λ‹€λ₯Έμ μ€ SectionLayoutKind μ—μ„œ width 에 따라 column 개수λ₯Ό μ‘°μ •ν•΄μ£Όκ³  μžˆλ‹€.

πŸ‘» λ‹€μŒ μ΄μ‹œκ°„μ—λŠ”

  • 아직 item 에 λŒ€ν•΄μ„œλ§Œ μ‚΄νŽ΄λ³΄μ•˜κΈ°μ— supplementary view (헀더, ν‘Έν„°), decoration view (λ°°κ²½?)에 λŒ€ν•΄μ„œλŠ” μ•Œμ•„λ³Ό μ˜ˆμ • !
  • Steve λ₯Ό λ‹€μ‹œ μ΄ˆλŒ€ν•©λ‹ˆλ‹€ 
728x90
728x90