본문 바로가기
WWDC

WWDC 19 - Advances in Collection View Layout

by vapor3965 2021. 6. 23.

목차


    • 세션보면서 정리한 내용입니다. 해석이 잘못된 경우가 있을수있으니 발견하시면 댓글로 남겨주시면 감사하겠습니다🙏🏻

     

     

     

    https://developer.apple.com/videos/play/wwdc2019/215

     

    Advances in Collection View Layout - WWDC 2019 - 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

     


    관련내용

    • 서브클래싱하지않는! 완전히새로운 layout system을 배워보자.

    요약

    • 👍Compositional Layout 을 통해 더 쉽게, 빠르게 유연하게 만들수있다.
      • item -> group -> section -> Layout으로 구성된다.
      • 👍하나의 섹션에는 하나의그룹이 여러개들어갈수있다. 그룹안에 아이템들이여러개이면서, 그룹이여러개가된다는말슴.
    • 👍여러섹션인경우에는 CompositionalLayout의 provider 클로저를 이용하여분기처리한다.
    • 👍직각스크롤이가능하다 .

     

     

     


     

    Current State-of-the-Art


    CustomLayout만들면서 문제점

    • boilerplate code
    • Self-sizing

     

     

     

    Compositional Layout

    • iOS13부터 새롭게등장한 레이아웃
    • 빠르고, 유연하고, Composable하다

     

     

    Three Core Components
    Item, Group, Section

    하나의레이아웃에
    여러개의섹션,
    섹션안에 여러개의그룹,
    그룹안에 item들이있다.

     


    우선 각 개념부터 살펴보자

    1.NSCoolectionLayoutSize

    • 사이즈는 width,height이며, 상수값이아닌, 타입이다. Dimension이라는 타입.!

    fractional

    • 외부컨테이너의 비율을 나타낸다. ( 외부컨테이너는 collectionView가된다 )
    • 즉 50%


    • 이것은 30%


    • 그래서 25%,25%비율로나타낸다.


    • 특정 포인트를 지정할수있다 .
      • 200points를 지정함!


    • 또는정확히 잘모르게싿. 추정값을정하겠따.


    • 그리고, 증가될수있다. 아이템을 렌더링ㅇ하면서,

     

     

    2.NSCollectionLayoutItem

    • cell또는 supplementary를 나타내는 Item이다!

    3.NSCollectionLayoutGroup

    • 각 아이템들을 어떻게 나타낼지 3가지형식이있다.
    • 수평,수직, 커스텀

    4.NSCollectionLayoutSection

    5.UICollectionViewCopositionalLayout

    • 마지막,
    • 👍흥미로운점은 SectionProvider 클로저가있다.
      • 각섹션마다 다르게 레이아웃을 주겠다는 뜻!!


     

     


    Demo 1
    간단한 테이블뷰형식

    이것은 하나의 그룹에 하나의 셀이 들어간다

    • 🤔group이 horizontal인점.
      • 개념에서는 그룹마다 여러개의아ㅣ탬이들어간다했는데, 아이탬size가 1:1이니, 하나의그룹안에 한개아이탬이들어갈듯,
      • 🤔아이탬사이즈는 그룹의사이즈안에서반영하나봐? ㅇㅇㅇ
      • 그룹사이즈는 컬렉션뷰의사이즈바탕으로,


     


    DEMO 2

    항상다섯개의 사이즈를 유지하도록 하는방법


    그룹은 컬렉션뷰의 width를 그대로갖고,
    height는 커렉션뷰의 width20%를 갖겠다. !!

    • height 20%가아니라!!
    • 👍그러므로, 아이템은 width 20%를 갖으니, 1:1비율을갖게된다 !!!

    그리고 그룹의아이템들은 다섯개씩 나타내고싶으니까, 그룹의 width의 20%를갖겠다.
    height는 동일하게 그룹의 height를 갖겠다!


     

     


    DEMO 3
    간격있는거

    👍각아이템에게 inset을 주었다!

     

     

     


    DEMO 4

    간격 나타내는 두번쨰방법 2

    👍특별한점은 그룹이니셜라이저가 다르다. 특정 카운트를 넣었다.
    ( 기존은 subItems: [Item] 끝이였는데, )
    item를 두개로넣겠다.

    • 👍즉 이렇게하면, 자동적으로 재계산하게된다.
    • 각 아이템들은 그룹의 사이즈를 그대로받는것이아닌, 2로나눈만큼의 크기를 얻게된다.
    • 즉, 아이템width가 1:1이여도, 재계산된 그룹의 width에대해서 비율을나누게되낟.

    또한,섹션의 spacing을ㅈ ㅜ었다. leading, trailing만
    👍또한 아이템들간의 spcaing 을 주었다.

     

     

     


    DEMO 5

    각 섹션마다 다른 레이아웃정하기
    아래는 3개의섹션

    👍처음부터 CompositionalLayout 초기화할때 클로저를 넣을수있다!

    • 이클로저는 👍SectionProvider이다!
    • 클로저에는 sectionIndex와,
    • layoutEnvironment 가있다. - 이는 참조할수이쓴 ㄴ되게유용한 프로퍼티가있다.

    👍그리고 각 섹션마다 컬럼개수를 다르게하기위해, Group이니셜라이저에서 count를 동적으로 넣어주었다!



    DEMO 6

    Adaptive 한 레이아웃
    * 모든 기종에 대해 대응할 수 있는 layout입니다

    다 비슷하지만! columns를 만들떄, 더이상 연산프로퍼티가아닌, 메소드로바뀌었고,
    👍그때 layoutEnvironment가 사용됐다!

    • 레이아웃의 전반적인width,
    • iOS에서는 trait collections정보가담겨있다.


     

     


    Supplementary items


    CollectioinView는 기본적으로 3가지뷰를 다룬다

    • Cell
    • Supplementary itmes
    • Decoration items

    그래서 Compositional layout에는 3가지로만들었다.

    추가적으로 Anchor

    • Anchor를 통해서 위치를 잡아준다.

     

     

     


    아래와 같이 만들어보자.

    Badge

     

    사용방법

    • fractionalOffset은 30% , Y는 -30%
    • 😀SupplementaryItem을 이용한다
    • 👍Item 이니셜라이저에 supplementaryItem 에 [ ] 어레이로 넣어준다
      • 이전에는 layoutSize만 넣었었음!



    Header Footer는?

    • 약간 다르다. - Boundary supplementary Item을 이용한다.

    👍BoundarySupplementaryItem 으로 만든다.
    Section에서 넣어주도록한다.

     

     

     

     

    👍Decoration VIew

    • 그룹핑하게해준다 ?

     

     

     

     


     

     

    Estimated self-Sizing

    헤더와 푸터에 다이나믹타입에 대응할수있다. ( 글자크기커지고작아지는거 )

    Nested Layout GRoup

    • LayoutItem의 subclass이다.

     

    👍오홍, leading, trailing item 으로나누고,
    trialing 2개로 trailinggroup만들고,
    leading 과 trailigngroup을 합한, containerGRoup을 만들었다.

     

     

     

     


    Nested CollecitonViews

    • 어렵고,어렵다

    👍하지만, compisitionalLayou에서는 한줄로가능하다. ( 박수 ㅋㅋ ) 
    ( orthogonal - 직각의 ,수직 )


    none을 제외하고 5가지종류가있다.


    continu는 계속 흐르게하고,


    continuousGroupleadingBoundary는 boundary만큼 움직이게하고,

     

    paging은 하나의 페이지만큼만 이동시킨다. 보여지는 페이지만큼 이동하고, 나머지페이지로이동!

     

     

     

     

    App Store

     

    compositional layout과 함께라면,
    이제는 아래와같은뷰는 하나의 컬렉션뷰로가능하다.

     

    댓글