20220121 iOS 일일 개발일지
===
###### tags: `develop`
collectionView의 Compostional Layout을 활용해 pageControl을 만드는 시도
```swift=
section.visibleItemsInvalidationHandler = { items, contentOffset, environment in
let currentPage = Int(max(0, round(contentOffset.x / environment.container.contentSize.width)))
print(currentPage)
}
```
Collection 뷰의 첫 번째 Section에 Footer을 붙이고, Footer의 bottom을 음수값으로 처리했다.
이로 인해 pageControl을 Section 위에 올리는 것까지는 성공
:::danger
문제 발생!

어떠한 기준을 가지고, 이미지와 pageControl을 연결할 것인가?
:::
기준 잡기: 횡 스크롤의 경우, 실제 이미지 하나가 넘어갈 때마다 page Control
해결 방법에 대한 고찰
CollectionView를 Compositional Layout으로 구성했을 때, Cell 내부에 UIPageControl을 넣는 방법에 대한 고민
초기엔 방법이 도통 떠오르지 않았지만, 여기저기 질문도 하고, 인턴 분들에게도 열심히 질의를 진행했음.
**러버덕 디버깅... 하지만, 결과는... so sad...**
레퍼런스 없이 일단 만들어보기.
reddit에서 우연히 읽은 몇 줄의 문장에서 대략적인 아이디어가 떠올랐다.

해당 Section Footer에 UIPageControl로 이뤄진 뷰를 구성하고, contentInset.top을 음수 값을 줘서 Footer을 위로 올렸다. (배경색은 없앰.)
하지만 page control과 collectionView의 Section의 움직임을 동일하게 가져가기 위해서, 한쪽에서의 데이터를 반대편에서 전달해야 함.

-> delegate pattern이 필요하다고 판단됨.
CollectionView의 SupplementaryItem에 해당하는 Section을 결정해주기 위해 직접 enum 화 시켰으나,
현재처럼 section의 Header과 Footer에 대해서는 UICollectionView의 elementHeader, elementFooter 클래스를 사용하는 방법도 있음.
```swift=
extension NSCollectionLayoutSupplementaryItem {
enum ElementKind {
static let badge = "badge-element-kind"
static let background = "background-element-kind"
static let sectionHeader = "section-header-element-kind"
static let sectionFooter = "section-footer-element-kind"
static let layoutHeader = "layout-header-element-kind"
static let layoutFooter = "layout-footer-element-kind"
}
}
```
Scroll 처리를 위한 protocol 선언

delegate 대리자 선언 (weak var)

실제 Footer을 생성할 때 ViewController을 delegate로 만들어 주고, 이에 따라 실제 scroll의 delegate 역할을 하도록 코드를 구성함.

VC에서 V 코드 분리하기
https://medium.com/@aloksubedi/separating-views-from-viewcontroller-522f4439ef95