2020, Advances in UICollectionView
Last updated
Last updated
이 글은 WWDC 2020 - Advances in UICollectionView의 내용을 공부하고, 개인적으로 정리해놓은 글입니다.
컬렉션뷰의 API는 Data, Layout, Presentation의 세 가지 범주로 나눌 수 있습니다. 여기서 중요한 점은 데이터를 관리하는 부분과 그것을 화면에 그리는 부분이 나눠진다는 것인데, 이것이 컬렉션뷰를 유연하게 만드는 핵심이라고 할 수 있어요.
iOS 6
iOS 6에서 처음 출시되었을 때, Data는 indexPath 기반 프로토콜인 UICollectionViewDataSource를 통해 관리되었습니다.
Layout의 경우 추상 클래스인 UICollectionViewLayout이 있었고 구체적인 하위 클래스인 UICollectionViewFlowLayout이 있었습니다.
Presentation 측면에서는 UICollectionViewCell, UICollectionReusableView라는 두 가지 보기 유형을 게시했습니다.
iOS 13
iOS 13에서 Diffable Data Source 및 Compositional Layout을 사용하여 각각 Data 및 Layout에 대한 두 가지 새로운 구성 요소를 도입했습니다.
iOS 14
iOS 14의 경우 iOS 13을 베이스로 해서 Section Snapshots, List Configuration, List Cell/View Configuration의 기능이 더해졌습니다.
iOS 13
iOS 13에 도입된 Diffable Data Source는 새로운 스냅샷 데이터 유형을 추가하여 UI 상태 관리를 크게 단순화하지요.
자세한 사용 방법이나 심화 영상은 아래의 다른 세션을 참고하시면 될 것 같아요.
iOS 14
자, 14가 바뀌었다고 하니 이 부분이 중요하겠죠. 섹션 스냅샷이라는 기능이 생긴건데요. 섹션 스냅샷은 UICollectionView의 단일 섹션에 대한 데이터를 캡슐화합니다.
또, iOS 14 전체에서 볼 수 있는 일반적인 시각적 디자인인 개요 스타일 UI 렌더링을 지원하는 데 필요한 계층적 데이터의 모델링을 허용합니다.
무슨 말이냐면, 일단 아래의 그림을 보죠. 총 3개의 섹션으로 나누어져 있습니다. 이 섹션 하나하나의 데이터가 섹션 스냅샷으로 캡슐화되어 있다는 거에요.
그리고 아래의 코드에 보면 Emoji에 관한 데이터가 있죠. 그것을 두번째 코드의 applyInitialSnapshots() 이라는 메소드에서 작업해주고 있어요.
먼저 NSDiffableDataSourceSnapshot 이라는 것을 만들고, 다음에 recentsSnapshot 를 만들죠. 얘는 첫번째 섹션이니까 아이템만 넣어주면 됩니다.
하지만 두번째 같은 경우에는 여기서는 outlineSnapshot 인데요. 레이블은 카테고리로 요리, 자연 같은 것들인데 내부는 여우, 거북이, 벌 같은 것들이에요. 즉, 내가 원하는 대로 Emoji의 데이터를 사용해서 새롭게 모델링을 해준 것이죠. 약간 RxDataSource 느낌도 나는 것 같아요.
새로운 재정렬(reordering) API가 추가되었습니다.
공식문서는 여기이고, 관련 세션은 위에 있는 Advances in Diffable Data Source 입니다. 코드도 첨부해놨으니 무슨 느낌인지 대충 알 수 있겠죠.
iOS 14에서는 Compositional Layout을 기반으로 Lists라는 새로운 기능이 추가되었습니다.
Lists를 사용하면 컬렉션뷰에 테이블뷰와 같은 느낌의 셀을 넣어줄 수 있습니다. 아래 그림처럼 말이죠.
Lists에는 테이블뷰에서 기대할 수 있는 Swipe 같은 기능도 포함되어 있습니다.
Compositional Layout으로 List 스타일의 레이아웃을 만드는 것도 코드 2줄이면 됩니다. 더 알고 싶다면 아래의 세션을 참고하면 됩니다.
CellRegisteration을 사용해서 새로운 방법으로 셀을 등록할 수 있습니다. ViewModel에서 셀을 설정하는 간단하고 재사용 가능한 방법입니다.
reuseIdentifier와 연결하기 위해 Cell 클래스와 register하는 과정이 생략됩니다.
제네릭 타입으로 <MyCell, ViewModel> 이 들어가는데, 샘플 코드에서는 <UICollectionViewListCell, Emoji> 입니다.
CellRegistration 클로저 안에는 셀 컨텐츠 구성에 관한 코드가 들어갑니다.
셀 콘텐츠 구성은 UITableView 표준 셀 타입에 표시되는 것과 유사한 셀에 대한 표준화된 레이아웃을 제공합니다.
아래의 코드 순서대로 그림 순서와 같습니다.
실제의 셀 콘텐츠 구성 내용은 위의 코드 처럼 셀 등록하는 부분에 표시됩니다.
이는 콘텐츠 구성과 매우 유사하지만 색상, 테두리 스타일 등과 같은 속성을 조정하는 기능을 통해 모든 셀의 배경에 적용됩니다.
이 녀석도 마찬가지로 CellRegistration 클로저 내부에서 호출됩니다. 더 자세한 사항은 아래의 세션을 참고하시면 됩니다.
https://developer.apple.com/videos/play/wwdc2020/10097 https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/implementing_modern_collection_views
사진을 찍듯이 특정 시점에 데이터를 별도의 파일이나 이미지로 저장, 보관하는 기술을 말합니다. 그래서 스냅샷 기능을 이용하여 데이터를 저장하면 유실된 데이터 복원과 일정 시점의 상태로 데이터를 복원할 수 있습니다.