UICollectionView 공부하기 1편
최근에 UITableView를 지양하고 UICollectionView만 사용하고자 한다.
UITableView가 UICollectionView보다 단순해서 코드 개발도 빠르고 단순해서 좋다고 생각했는데, 프로젝트 과정에서 UICollectionView의 UI 요구사항이 생기면 UITableView의 코드를 UICollecionView로 전환하는데 비용이 너무 크다고 느꼈다.
특히, UICollectionView는 UITableView의 요구사항을 모두 구현할 수 있지만,
그 역은 성립하기 어렵다
목표
- UICollectionViewCell 프로그래밍 기반으로 작성
- UICollectionViewCell 안에 위치한 아이템에 대한 특정 이벤트 처리
- UICollectionViewCell 서로 다른 섹션 및 서로 다른 셀
- UICollectionView self resizing cell 구현
- UICollectionViewCell 페이지 네이션
- UICollectionView에 RxSwift + RxDataSource 적용
- 다양한 메소드 연습
공식문서
https://developer.apple.com/documentation/uikit/uicollectionview
Apple Developer Documentation
developer.apple.com
공식 문서에 나온 UICollectionView 이미지


컬렉션 뷰는 확실히 UITableView보다 제공하는게 많다.
즉, 자유도가 높다는 의미인데, 모르는게 많아서 기본부터 천천히 사용해보자.
문서를 읽어보니까 아래 문서를 보라고 한다.
https://developer.apple.com/documentation/uikit/uicollectionview/1618047-collectionviewlayout
Apple Developer Documentation
developer.apple.com
위 문서에는 레이아웃과 관련한 문서를 제공하는데, UICollectionView의 꽃은 레이아웃이 아닐까 싶다.

위의 문서를 보니 레이아웃과 관련한 몇가지 메소드가 존재함.
커스텀을 화려하게 해보지 않아서, 사용해보지 않은 메서드가 더 많은데, 기본기부터 읽고 모르는건 추후에 사용 사례와 함께 더 공부해보자.
Data perfetching
셀은 Visible하지 않더라도 미리 준비되기도 하는데 prefetching은 visible하지 않는 영역에 대한 처리 메서드이다.
여기서 이미지 로딩 같은거 하면 더 좋다.

https://developer.apple.com/documentation/uikit/uicollectionviewdatasourceprefetching
Apple Developer Documentation
developer.apple.com
위의 공식문서를 들어가면 UICollectionViewDataSourcePrefetching이 존재하고 별도로 채택해서 구현해야 한다.

위 설명은 그냥 우리가 CollectionView에서 prefetching을 사용할 때의 가이드이다.
프로그래밍 기반으로 Cell을 만드는 경우, Cell이 해당 프로토콜을 채택합니다.
- 그리고 collectionView(_ prefetchItemsAt: )을 구현하여서 여기서 셀에 필요한 데이터 중 비동기에 해당하는 부분을 작성.
- 그리고 collectionView(_: cellForItems: )에서 prefetched된 데이터를 사용하여 작성.
- 아직 직접 사용해 본 적이 없는데 prefetchItem을 어딘가 저장할 배열이 필요하지 않을까 싶다.
- 그래야 prefetced된 데이터를 꺼내고 비동기 취소 등을 처리할 수 있지 않을까?
- 더이상 필요하지 않으면 coolectionView(_: cancelPrefetchingForItemsAt: )을 호출.
- 이 메서드도 사용해 본 적이 없어서 아마 컬렉션 뷰에 데이터를 더이상 로드할 필요가 없을 때, 해당 메서드에 코드를 작성하자
- ID 비교해서 진행해야 할 것으로 보인다.
NOTE: - 모든 셀에 대해서 반드시 호출되는 것은 아니라고 한다.

3가지 케이스가 존재
- 데이터 prefetch 요청을 통해 데이터 로드가 끝났고, 디스플레이에 보여줄 준비 완료
- 현재 prefetced 진행중이라 아직 사용할 수 없음
- 아직 요청도 안함.
이 개념을 이해하려면 GCD에서 자주 보았던 Operation에 대해서 알아야 한다.
이거 그냥 운영체제의 Process Cycle과 같은걸 제공해주는 거다.
https://developer.apple.com/documentation/foundation/operation
Apple Developer Documentation
developer.apple.com
Operation은 OS의 프로세스 상태와 닮아있다.
An abstract class that represents the code and data associated with a single task.

Operation을 활용하면 GCD보다 더 자유로운걸 적용할 수 있다.
특히, 파일을 다운로드할 때 갯수를 조정하거나, 멈추거나 등등 ..
세밀하게 스케줄링을 할 수 있어서 좋다.
Reorder items interactively
아이템이 사용자와 상호작용이 시작하면 위의 나와있는 메소드 순서대로 진행
주목할 점으로는 상호작용이 끝나는 즉시, 컬렉션 뷰가 업데이트 된다고 함.

인터페이스 빌더의 속성들
아이템의 경우에는 셀이 최소 하나 이상이어야 하며, 다른 유형의 컨텐츠 표시 혹은 같은 유형의 컨텐츠 표시를 위해 여러 셀을 가질 수 있음.
(셀 0개면 딜리게이트 호출되지 않음)
레이아웃의 경우에는 UICollectipnViewFlowLayout에 정의된 레이아웃을 사용하며 커스텀하게 만드려면 UICollectionViewLayout으로 만든 레이아웃 서브 클래스를 지정해주어야 함.
(이게 무슨 말이냐면 Cell도 커스텀하게 만들때 UICollectionViewCell 상속받아서 만드는 것과 동일한 말)

베타 API는 해당 형태들도 존재.
UICollectionView 동적 사이즈 대응이 어려운데, iOS 16이상이라 .. 결국 하던대로 하지 않을까 싶다.

(WWDC 영상 참고)
https://developer.apple.com/videos/play/wwdc2022/10068/
What's new in UIKit - WWDC22 - Videos - Apple Developer
Discover the latest updates and improvements to UIKit and learn how to build better iPadOS, iOS, and Mac Catalyst apps. We'll take you...
developer.apple.com
'apple > iOS, UIKit, Documentation' 카테고리의 다른 글
| iOS 시뮬레이터에서 Remote Notification (시뮬레이터 푸시알림) (0) | 2022.08.17 |
|---|---|
| UICollectionView 공부하기 2편 (0) | 2022.08.12 |
| warning: 'windows' was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene instead (0) | 2022.08.10 |
| [iOS] present 이후 pushViewController (1) | 2022.08.05 |
| iOS 최상단 ViewController + UIWindow (keywindow) (1) | 2022.03.15 |