iOS 개발일지
1018 새싹 72회차 정리 - Compositional Layout 본문
iOS 앱 개발자 데뷔 과정 72회차
#1. Compositional Layout
- Collection View APIs
Collection View는 iOS 6에 처음 등장했다.
무엇이 (어떤 데이터가), 어디에 (어떤 레이아웃에), 보여지는지 (어떻게 렌더링 되는지) 의 관점으로 살펴볼 때, 데이터는 인덱스 기반 프로토콜인 UICollectionViewDataSource로 관리되어 있었다.
레이아웃은 UICollectionViewLayout이 있었고, 주로 구체적인 하위 클래스 (Concrete Subclass) 인 UICollectionFlowLayout을 사용하고 있었다.
이후 iOS 13에서 DiffableDataSource, Compositional Layout인 최신 API가 도입이 되었고, iOS 14에서는 이를 기반으로 새로운 기능들 -Section Snapshot, List Configuration- 을 만들었다.
List Configuration은 Compositional Layout 기반으로 만들어졌고, 컬렉션뷰를 테이블뷰처럼 사용할 수 있다.
섹션별로 다른 레이아웃 설정도 가능하며, 스와이프 등의 기능을 컬렉션뷰에서 구현할 수 있게 되었다.
- UICollectionLayoutListConfiguration
https://developer.apple.com/documentation/uikit/uicollectionlayoutlistconfiguration
List는 테이블뷰와 유사한 모양을 컬렉션뷰에서 구현할 수 있는 구조로, UICollectionViewCompositionalLayout과 NSCollectionLayoutSection을 기반으로 구성되어 있다.
참고로, NSCollectionLayoutSection은 섹션 별 레이아웃 설정을 별도로 할 때 사용한다.
따라서 유연한 레이아웃이 대응이 가능하며, 특히 Self-Sizing 기능을 통해 셀 높이를 수동으로 계산 할 필요가 없다.
List 형태의 레이아웃을 만들기 위한 구조체로, 모든 섹션에 동일한 configuration을 적용할 수도 있고, 각 섹션마다 다른 레이아웃을 적용할 수도 있다.
plain, grouped, inset grouped와 같은 appearance 설정이 가능하며 separator, header, footer, swipe 등의 처리도 할 수 있다.
- UICollectionView.CellRegistration
https://developer.apple.com/documentation/uikit/uicollectionview/cellregistration
iOS 14에서 등장한 Registeration API로, 셀 재사용을 보다 쉽게 구현해두었다.
기존의 Cell Identifier나 XIB를 등록하는 메서드 대신 제네릭 형태를 사용하고, 새 셀이 생성될 때마다 클로저가 호출된다.
- UIContentConfiguration
https://developer.apple.com/documentation/uikit/uicontentconfiguration
contentView에 configuration을 제공해주는 객체로, contentView에 대한 기본 스타일과 컨텐츠 구성에 대한 청사진을 제공해준다.
UIListContentConfiguration 구조체도 UIContentConfiguration 프로토콜을 채택하고 있다.
- UIListContentConfiguration
https://developer.apple.com/documentation/uikit/uilistcontentconfiguration
list base의 컨텐츠 뷰를 구성하는 configuration으로, 시스템 기본 스타일을 설정해볼 수 있다.
subtitleCell, valueCell, sideBarCell 등 기본 셀 설정부터 헤더와 푸터 스타일, 객체 속성 정의 등이 가능하다.
- Realm을 활용한 예시 코드
#2. Assignment
- Protocol as Type
- 타입으로서의 프로토콜 개념 정리
UIListContentConfiguration.valueCell() 또는 cell.deraultContentConfiguration()은 UIListContentConfiguration 구조체이다.
그런데 cell.contentConfiguration 프로퍼티는 UIContentConfiguration? 타입이다.
타입이 다른데 어떻게 값을 초기화 할 수 있었을까?
바로, UIContentConfiguration 의 타입 자체가 protocol이기 때문이다.
프로토콜도 First Class Citizen 이기 때문에 변수/상수 프로퍼티의 타입으로 사용될 수 있다.
또 새싹 23회차 정리 에서와 같이 함수에서 리턴 타입으로 사용되거나, array dictionnary 등의 element로도 사용될 수 있다.
즉, UIContentConfiguration 프로토콜을 채택했기 때문에 해당 프로토콜 타입의 프로퍼티를 초기화시킬 수 있다.
사실 프로토콜 타입을 활용한 이러한 코드는, 우리도 모르게 이미 익숙하게 사용해왔다.
예를 들어 tableView.delegate = self 와 같은 코드에서 self 는 클래스의 인스턴스를 의미하지만, delegate를 초기화시킬 수 있다.
delegate가 UITableViewDelegate 프로토콜 타입의 프로퍼티이기 때문에 UITableViewDelegate를 채택한 클래스 ( =self ) 로 초기화가 가능한 것이다.
# 그 외
- UIBackgroundConfiguration
Configuration type은 UIContentConfiguration 과 UIBackgroundConfiguration 이 있다.
UIContentConfiguration 은 ContentView에 addSubView 되는 레이블, 버튼 등 객체들에 대한 설정을 담당한다.
UIBackgroundConfiguration 은 ContentView 자체에 대한 설정을 담당하고 있다.
UIBackgroundConfiguration 은 코드가 동일하더라도 CollectionView Configuration Appearance에 따라 UI가 달라지기도 한다.
예) stroke의 속성은 CollectionView Configuration Appearance 에 따라 다르게 설정되기 때문에, 샐별로 테두리가 적용되거나 되지 않을 수 있다.
'SeSAC iOS 데뷔과정 2기' 카테고리의 다른 글
1020 새싹 74회차 정리 - MVVM API 통신 (0) | 2022.10.20 |
---|---|
1019 새싹 73회차 정리 - DiffableDataSource (0) | 2022.10.20 |
1017 새싹 71회차 정리 - Model Relationship (0) | 2022.10.17 |
1014 새싹 70회차 정리 - Shell/Git 명령어 (0) | 2022.10.14 |
1013 새싹 69회차 정리 - Realm Migration (0) | 2022.10.13 |