오늘은 UICollectionViewLayout
의 prepare()
에 대해서 알아보자.
공식문서에 따르면 UICollectionViewLayout
은 CollectionView의 레이아웃 정보를 생성하기 위한 추상 class라고 한다.
cell
과 supplementary view
그리고 decoration view
들의 배치를 결정하고 이를 CollectionView에 알려준다.
CollectionView는 UICollectionViewLayout이 알려준 정보를 view에 적용하여 화면에 표시될 수 있도록 한다.
prepare()
는 UICollectinViewLayout의 Instance Method이다.
공식문서
이 메서드는 레이아웃 object에게 현재 레이아웃을 업데이트하도록 시킨다.
레이아웃 업데이트는 CollectionView가 해당 콘텐츠를 처음으로 표시할 때와 view가 변경되어 레이아웃이 무효화될때 발생한다.
레이아웃을 업데이트 할 때마다 CollectionView는 prepare()
를 호출해 레이아웃 object에 이후 레이아웃 작업을 준비하도록 한다.
이 메서드의 기본 구현은 아무 작업도 수행하지 않고, subClass에서 재정의한다.
재정의 과정에서 데이터 구조를 설정하거나 레이아웃을 수행하는데 필요한 초기 계산을 수행할 수 있다.
즉, 정리하자면
- 레이아웃 연산이 발생할때 마다 호출된다.
- CollectionView의 사이즈, item의 위치등을 결정하기 위한 초기 계산 등을 수행할 수 있다.
UICollectionView를 이용한 LINE iOS 대화방 리팩토링 <- 이 포스팅에서 prepare()
를 어떻게 사용하는지 조금 엿볼 수 있다.
기존에 UITableView
로 구성되어 있던 라인 대화방을 UICollectionView
로 변경하는 과정을 담은 포스팅이다.
UICollectionViewLayout의 prepare() 함수에서는 UICollectionView에 표시되는 전체 크기를 계산하고 각 셀의 레이아웃 속성을 미리 계산하여 메모리에 적재한 뒤 유지합니다.
레이아웃의 데이터 구조를 설계할 때는, UICollectionView에서 특정 화면 영역이나 특정 IndexPath에 대한 레이아웃 속성을 요청할 때 빠르게 응답할 수 있도록 설계하는 것이 중요합니다.
내부적으로 Dictionary나 Array 등을 활용하여 최대한 빠르게 응답할 수 있도록 설계했습니다.
포스팅을 읽다보면 위의 글을 찾을 수 있는데 그 이후로 쭉 읽다보면 prepare()
를 이용해 다양한 콘텐츠/기능에 대응하기 위해 cell/item의 콘텐츠 크기를 미리 계산해 빠른 레이아웃 작업을 하고 잇다.
오늘은 UICollectionViewLayout의 prepare()에 대해서 알아봤다.
그럼 이만👋