apple/iOS, UIKit, Documentation

UICollectionView 공부하기 1편

lgvv 2022. 8. 11. 18:54

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이 존재하고 별도로 채택해서 구현해야 한다.

 

 

cellForItemAt이 호출되기 전에 불림

 

위 설명은 그냥 우리가 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

 

 

Operation을 활용하면 GCD보다 더 자유로운걸 적용할 수 있다.

특히, 파일을 다운로드할 때 갯수를 조정하거나, 멈추거나 등등 ..

세밀하게 스케줄링을 할 수 있어서 좋다.

 

 

Reorder items interactively

아이템이 사용자와 상호작용이 시작하면 위의 나와있는 메소드 순서대로 진행

주목할 점으로는 상호작용이 끝나는 즉시, 컬렉션 뷰가 업데이트 된다고 함.

 

 

이미지

 

 

 

인터페이스 빌더의 속성들

 

아이템의 경우에는 셀이 최소 하나 이상이어야 하며, 다른 유형의 컨텐츠 표시 혹은 같은 유형의 컨텐츠 표시를 위해 여러 셀을 가질 수 있음.

(셀 0개면 딜리게이트 호출되지 않음)


레이아웃의 경우에는 UICollectipnViewFlowLayout에 정의된 레이아웃을 사용하며 커스텀하게 만드려면 UICollectionViewLayout으로 만든 레이아웃 서브 클래스를 지정해주어야 함.
(이게 무슨 말이냐면 Cell도 커스텀하게 만들때 UICollectionViewCell 상속받아서 만드는 것과 동일한 말)

 

주요 내용만 빼서 정리

 

 

베타 API는 해당 형태들도 존재.

UICollectionView 동적 사이즈 대응이 어려운데, iOS 16이상이라 .. 결국 하던대로 하지 않을까 싶다.

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