Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

iOS 개발일지

1018 새싹 72회차 정리 - Compositional Layout 본문

SeSAC iOS 데뷔과정 2기

1018 새싹 72회차 정리 - Compositional Layout

Lia's iOS 2022. 10. 18. 22:32
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를 등록하는 메서드 대신 제네릭 형태를 사용하고, 새 셀이 생성될 때마다 클로저가 호출된다.

 

예시 코드 (1)

 

예시 코드 (2)

 

예시 코드 (3)

 

결과물

 


 

- 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 ) 로 초기화가 가능한 것이다.

 

 

 

UIContentConfiguration 프로토콜

 

UIListContentConfiguration 구조체

 

UICollectionViewListCell, UITableViewCell 등에서 사용되는 프로퍼티와 메서드

 

 


 

 

그 외

- UIBackgroundConfiguration

Configuration type은 UIContentConfiguration 과 UIBackgroundConfiguration 이 있다.

 

UIContentConfiguration 은 ContentView에 addSubView 되는 레이블, 버튼 등 객체들에 대한 설정을 담당한다.

UIBackgroundConfiguration 은 ContentView 자체에 대한 설정을 담당하고 있다.

 

UIBackgroundConfiguration 은 코드가 동일하더라도 CollectionView Configuration Appearance에 따라 UI가 달라지기도 한다.

예) stroke의 속성은 CollectionView Configuration Appearance 에 따라 다르게 설정되기 때문에, 샐별로 테두리가 적용되거나 되지 않을 수 있다.