๐Ÿ‘จโ€๐ŸŽ“
Today I Learned
  • Today-I-Learend
  • ๐ŸŽWWDC
    • Developer Tools
      • Testing in Xcode
    • UIKit
      • UIDiffableDataSource
        • [WWDC 19] Advances in UI Data Sources
      • [WWDC2019] Advances in CollectionView Layout
  • ์ž๋ฃŒ๊ตฌ์กฐ
    • Heap ์ž๋ฃŒ๊ตฌ์กฐ
  • Clean code
    • ๋„ค์ด๋ฐ
    • ์ฃผ์„๊ณผ ํฌ๋งทํŒ…
    • ํ•จ์ˆ˜
    • ํด๋ž˜์Šค
    • ์—๋Ÿฌ ํ•ธ๋“ค๋ง
    • ๊ฐ€๋…์„ฑ ๋†’์ด๊ธฐ
    • ๊ฐ์ฒด์ง€ํ–ฅ
  • Network
    • RestAPI
  • Swift
    • DateType
    • ARC
    • Availablity
    • KeyPath
    • Network
    • Neverํƒ€์ž…
    • Result
    • Selector
    • ๊ฒ€์ฆํ•จ์ˆ˜
    • ๋ฉ”ํƒ€ํƒ€์ž…
    • ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    • ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „
    • ์—๋Ÿฌ์ฒ˜๋ฆฌ
    • ์ ‘๊ทผ์ œ์–ด (Access Control)
    • ์ œ๋„ค๋ฆญ
    • ์ฃผ์š” ํ”„๋กœํ† ์ฝœ
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๊ทธ๋ž˜ํ”„
    • ๊ธฐ์ดˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๋ˆ„์ ํ•ฉ(Prefix)
    • ๋ณต์žก๋„
    • ๋น„ํŠธ๋งˆ์Šคํ‚น
  • ์šด์˜์ฒด์ œ
    • ์šด์˜์ฒด์ œ์˜ ๊ฐœ์š”
    • ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ
    • CPU ์Šค์ผ€์ค„๋ง
    • ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”
    • ๊ต์ฐฉ์ƒํƒœ
    • 07. ๋ฉ”๋ชจ๋ฆฌ
    • 08.๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ
    • ์ž…์ถœ๋ ฅ ์žฅ์น˜
    • ํŒŒ์ผ ์‹œ์Šคํ…œ
  • UIKit
    • UITableView xib์œผ๋กœ ๋งŒ๋“ค์–ด๋ณด๊ธฐ
  • ๐Ÿ–Š๏ธ์ •๋ณด ๊ธฐ๋ก
    • ์ฝ”์ฝ”์•„ํŒŸ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•
  • iOS Project
    • ์ฑ„ํŒ… ์•ฑ ๋งŒ๋“ค๊ธฐ
      • Trouble shooting
      • 1. ๋””์ž์ธ
      • 2. AutoLayout
    • ๋‚ ์”จ ์กฐํšŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜
      • Figma๋ฅผ ์ด์šฉํ•œ UI ์„ค๊ณ„
      • TableView ์—ฐ๊ฒฐํ•˜๊ธฐ
      • Networking
    • MVC -> MVVM์œผ๋กœ ๊ตฌ์กฐ ๋ณ€๊ฒฝํ•ด๋ณด๊ธฐ
      • MVC
      • MVVM
    • OAuth Project
      • ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ œ์ž‘
      • Github์˜ OAuth App ์„ค์ •
    • Rest API ํ”„๋กœ์ ํŠธ
      • UI์„ค๊ณ„ (with Figma)
      • Network Model
      • MVVM ๊ตฌ์กฐ ์ „ํ™˜
  • ๐Ÿ•ถ๏ธUIKit
    • Compositional Layout
Powered by GitBook
On this page
  • 1. CollectionView์˜ ํ˜„์žฌ ๊ธฐ์ˆ  (current state of the art)
  • 2. ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹ (a new approach)
  1. WWDC
  2. UIKit

[WWDC2019] Advances in CollectionView Layout

CollectionView Layout์˜ ๋ฐœ์ „ ๋ชฉ์ฐจ

  1. CollectionView์˜ ํ˜„์žฌ ๊ธฐ์ˆ  (current state of the art)

  2. (iOS, tvOS, MacOS) ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹ (a new approach)

  3. Demo

  4. ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ (advanced layouts)


1. CollectionView์˜ ํ˜„์žฌ ๊ธฐ์ˆ  (current state of the art)

UICollectionViewFlowLayout

  1. CollectionViewLayout

    • Layout์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ์—ญํ• ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค๋กœ ์ถ”์ƒํ™”๋˜์–ด์žˆ๋‹ค.

      • rendering์„ ํ•˜๋Š” class

      • collectionView Layout์ด ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€?์— ๋Œ€ํ•ด ์ฑ…์ž„์„ ์ง€๋Š” class

      • CollectionView Layout์€ ์ถ”์ƒํ™”๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•ญ์ƒ Subclassing์„ ํ•ด์•ผํ•œ๋‹ค.

        ์ด๊ฒƒ์„ Concrete type์œผ๋กœ ์ •์˜ํ•œ ๊ฒƒ์ด iOS 6์—์„œ ๋ฐœํ‘œํ–ˆ๋˜ CollectionView Flow Layout์ด๋‹ค.

  2. CollectionViewFlowLayout

    • line based layout system์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, iOS6์„ ์‚ฌ์šฉํ–ˆ๋˜ ํ™˜๊ฒฝ์—์„œ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋๋‹ค.

      • (2018 WWDC ์˜์ƒ ์ฐธ๊ณ ) ๋‹จ์ˆœํžˆ Line๋“ค์„ ๋ฐฐ์น˜ํ•˜๊ณ , ์ถ•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐ์น˜ํ•ด์„œ Layout์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

      • ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ , ์ถ”๋ก ์ด ์‰ฌ์šฐ๋ฉฐ, ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

      • ํ•˜์ง€๋งŒ ์š”์ฆ˜์— ์ด์ข…ํ™”๋˜๋Š” ๊ธฐ๊ธฐ์™€, ๋‹ค์–‘ํ•œ custom layout์ด ๋‚˜์˜ค๋ฉด์„œ UI๊ฐ€ ๋งค์šฐ ๋ณต์žกํ•ด์กŒ๋‹ค.


  • ๋ณต์žกํ•ด์ง„ UI๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ ์„ ์‚ดํŽด๋ณด์ž.

  • AppStore์˜ ๋ฉ”์ธํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ณ ๋ฏผํ•  ๊ฒƒ์ด๋‹ค.

    • ๋‹ค์–‘ํ•œ ๋ชจ์–‘์˜ Cell์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, CollectionView๋ฅผ ์„ ํƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

      ์ด๋•Œ, โ€œFlowโ€๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์ž๋งˆ์ž CollectionView ์‚ฌ์šฉ์„ ํฌ๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค. (์ด์œ ๋Š” ๋ชฐ๊นŒ)

  • Custom Layout์„ ์„ค๊ณ„ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ 

    • Boilerplate code

    • Performance considerations

    • Supplementary and decoration view challenges

      • CollectionView์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” View, DecorationView๋Š” CustomLayout์—์„œ ๊นŒ๋‹ค๋กญ๊ฒŒ ์ž‘์šฉํ•œ๋‹ค.

    • Self-sizing challenges

    โ‡’ ์ด ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Flow์™€ ๋™์ผํ•œ Concrete class์ธ ์ƒˆ๋กœ์šด ํ”Œ๋žซํผ์„ ๋„์ž…ํ–ˆ์œผ๋ฉฐ, ์ด๊ฒƒ์ด ๋ฐ”๋กœ Compositional Layout์ด๋‹ค.


2. ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹ (a new approach)

Compositional Layout์˜ ๊ฐœ๋…

  • Compositional Layout์˜ ์ค‘์‹ฌ ๊ฐœ๋… 3๊ฐ€์ง€

    1. Composable

      ๊ฐ„๋‹จํ•œ ๊ฒƒ์„ ์ด์šฉํ•ด์„œ ๋ณต์žกํ•œ ๊ฒƒ์„ ๋งŒ๋“ ๋‹ค.

    2. Flexible

      ์œ ์—ฐํ•˜๊ฒŒ ์„ค๊ณ„๋˜์–ด, ์–ด๋–ค ๋ ˆ์ด์•„์›ƒ์ด๋“  ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    3. Fast

      ์ž์ฒด ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋น ๋ฅด๋‹ค.

  • Compositional Layout์€ Layout์„ ์„ค๋ช…ํ•˜๊ฑฐ๋‚˜, ์ •์˜ํ•˜๋Š” ์„ ์–ธํ˜• API์ด๋‹ค.

Compositional Layout์˜ ํ™œ์šฉ

  • Composing small layout groups together

    ์ž‘์€ ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“ค๊ณ , ์ด๋“ค์„ ์กฐํ•ฉํ•ด์„œ ๋” ํฐ ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•œ๋‹ค.

  • Layout groups are line-based

    FlowLayout์˜ ์žฅ์ ์„ ์ด์–ด๊ฐ€๊ธฐ ์œ„ํ•ด line based์— ๋”ฐ๋ผ ๋ ˆ์ด์•„์›ƒ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. (๊ต‰์žฅํžˆ ๋งŽ์€ UI)

    ์ž‘์€ ๋ ˆ์ด์•„์›ƒ ๊ทธ๋ฃน์„ ํ•œ ์ค„๋กœ Item์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • composition instead of subclassing

    Subclassing์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. (Concrete type)

    ์ถ”๋ก  ๊ฐ€๋Šฅํ•œ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋‹จ์ˆœํ•˜๋‹ค.

Compositional Layout Code ๋ฐ ๊ฐœ๋…

  • Core Concepts

  • Type(์œ ํ˜•)์— ๋Œ€ํ•ด ์ž์—ฐ์Šค๋Ÿฌ์šด Flow๊ฐ€ ์กด์žฌํ•œ๋‹ค.

    • 5๊ฐ€์ง€ ์œ ํ˜•์ด ์กด์žฌํ•œ๋‹ค. (Item, Group, Section, Layout)

Layout Types

  1. Size

    • ๋ชจ๋“  ๊ฒƒ๋“ค์€ ๋ช…๋ฐฑํ•œ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

    • ์‚ฌ์ด์ฆˆ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• (๊ฐ Type์ด ์–ผ๋งˆ๋‚˜ ํฐ์ง€ ํ™•์ธ)

      Size = Width + Height dimension

    class NSCollectionLayoutSize {
    	init(widthDimension: NSCollectionLayoutDimension,
    			 heightDimension: NSCollectionLayoutDimension)
    }
    • NSCollectionLayoutDimension

      • ์ถ•๊ณผ ๋ฌด๊ด€ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ, ํญ๊ณผ ๋†’์ด, ์ฐจ์›์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ์„ ์ด์šฉํ•ด์„œ ์ถ•์˜ ํฌ๊ธฐ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

        ์ด๋•Œ, ํญ๊ณผ ๋†’์ด์˜ ๊ฒฝ์šฐ, NSCollectionLayoutDimension์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์œ ํ˜•์œผ๋กœ ์ •์˜ํ•œ๋‹ค.

      • NSCollectionLayoutDimension์˜ 4๊ฐ€์ง€ ์œ ํ˜•

        // ์ถ•์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” "์ถ• ๋…๋ฆฝ์  ๋ฐฉ๋ฒ•"
        class NSCollectionLayoutDimension {
        	class func fractionalWidth(_ fractionalWidth: CGFloat) -> Self 
        	class func fractionalHeight(_ fractionalHeight: CGFloat) -> Self 
        	class func absolute(_ absoluteDimension: CGFloat) -> Self
        	class func estimated(_ estimatedDimension: CGFloat) -> Self
        }
      • ํŠน์ • Item์˜ width = Container ํญ์˜ 50%๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค.

      • Item์˜ Height = Container ํญ์˜ 30% ์ฐจ์ง€

      • ํŠน์ • ์ข…ํšก๋น„๋ฅผ ๊ฐ–๋„๋ก ์ •์˜ (Container์˜ 25%์”ฉ aspect ratio)

      • ์ •ํ™•ํ•œ ์น˜์ˆ˜๋ฅผ ๊ฐ–๋„๋ก ์ •์˜ (point based value)

  2. Item

    • ๊ธฐ์กด์˜ Cell์˜ ๊ฐœ๋…๊ณผ ๋™์ผ

      class NSCollectionLayoutItem {
      	convenience init(layoutSize: NSCollectionLayoutSize)
      	var contentInsets: NSDirectionalEdgeInsets
      }
  3. Group

  4. Section (NScollectionLayoutSection)

    • CollectionView์˜ ๋‹จ๋ฉด์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ Layou์˜ ์ •์˜

    • Section์— ๋ช‡ ๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด DataSource์— ์ง์ ‘ ๋งคํ•‘๋˜๋Š” ๊ฐœ์ฒด

    • Initializer๊ฐ€ Group์„ ํ—ˆ์šฉํ•œ๋‹ค.

      class NSCollectionLayoutSection {
      	convenience init(layoutGroup: NSCollectionLayoutGroup)
      	var contentInsets: NSDirectionalEdgeInsets
      }
  5. Layout

  • ์ตœ์ƒ์œ„ Layout class

  • iOS, tvOS์˜ ๊ฒฝ์šฐ, UICollectionViewCompositionalLayout ์‚ฌ์šฉ

  • MacOS์˜ ๊ฒฝ์šฐ, NSViewCompositionalLayout ์‚ฌ์šฉ

  • ํ”Œ๋žซํผ๊ณผ ์ƒ๊ด€ ์—†์ด, ๋ชจ๋“  ์ •์˜๊ฐ€ ๋™์ผํ•˜๋‹ค.

    class UICollectionViewCompositionalLayout: UIcollectionViewLayout {
    	init(section: NSCollectionViewSection)
    	init(sectionProvider: @escaping SectionProvider)
    }
Previous[WWDC 19] Advances in UI Data SourcesNext์ž๋ฃŒ๊ตฌ์กฐ

Last updated 1 year ago

Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-09-26 แ„‹แ…ฉแ„’แ…ฎ 12.43.37.png
Untitled
๐ŸŽ