티스토리 뷰

iOS

[iOS] UICollectionViewLayout 알아보기

Kim_Baechu 2021. 1. 14. 23:58

UICollectionViewLayout

컬렉션뷰의 레이아웃 정보를 생성하기 위한 추상 클래스입니다.

 

Declaration

class UICollectionViewLayout : NSObject

Overview

레이아웃 객체는 셀, 보조 뷰, 컬렉션 뷰의 바운드 안에 데코 뷰의 배치를 결정하고 해당 정보를 컬렉션뷰에 보고합니다.

컬렉션뷰는 제공된 레이아웃 정보를 해당 뷰에 적용하여 화면에 표시될 수 있습니다.

UICollectionViewLayout를 subclass해야합니다.

Subclass전에 UIcollectionViewCompositionLayout을 레이아웃 요구사항에 적용할 수 있을 지 고려해야합니다.

 

Subclassing Notes

레이아웃 객체는 컬렉션뷰에서 위치, 사이즈, 아이템의 시각적 상태를 결정합니다.

레이아웃에 대한 뷰는 컬렉션 뷰의 data source에 의해 생성됩니다.

 

다음 세 가지 유형의 시각적 요소를 레이아웃 할 수 있습니다.

 

1.

셀은 레이아웃에 의해 배치되는 메인 요소입니다. 

각각의 셀은 컬렉션 뷰의 싱글 데이터 아이템을 나타냅니다.

사용자가 셀 선택, 드래그, 재배치 같은 작업을 수행할 수 있도록 셀을 상호작용하게 만들 수 있습니다.

컬렉션 뷰는 셀의 그룹을 만들거나 여러 섹션으로 나눌 수 있습니다.

레이아웃 객체는 컬렉션뷰의 컨텐츠 area안의 셀을 정렬합니다.

 

2.

보조 뷰는 데이터를 표시하지만 유저가 선택할 수는 없습니다.

보조 뷰를 사용하여 지정된 섹션 또는 전체 컬렉션 뷰에 대한 헤더와 퓨터 같은 항목을 구현할 수 있습니다.

보조 뷰는 선택사항이며, 사용 및 배치는 레이아웃 객체에 의해 정의됩니다.

데코 뷰는 배지와 같은 시각적 장식이며, 선택할 수 없으며 컬렉션 뷰의 데이터에 기본적으로 연결되지 않습니다.

데코 뷰는 보조 뷰의 또 다른 유형입니다. 보조 뷰와 마찬가지로 선택사항이며 레이아웃 객체에 의해 사용 및 배치됩니다.

 

3.

컬렉션 뷰는 레이아웃 객체에 여러 번에 걸쳐 이러한 요소에 대한 레이아웃 정보를 제공하도록 요청합니다.

화면에 나타나는 모든 셀과 뷰는 레이아웃 객체의 정보를 사용하여 배치됩니다.

마찬가지로, 아이템을 컬렉션 뷰에 삽입하거나 삭제할 때마다 추가 또는 제거중인 항목에 대한 레이아웃 pass가 추가로 발생합니다.

그러나 컬렉션 뷰는 항상 화면에 표시되는 객체로 레이아웃을 제한합니다.

 

Methods to Override

모든 레이아웃 객체는 다음 메서드를 구현해야합니다.

이러한 메서드는 컬렉션 뷰가 컨텐츠를 화면에 배치하는 데 필요한 기본 레이아웃 정보를 제공합니다.

레이아웃이 보조 뷰 또는 데코 뷰를 지원하지 않는 경우 해당 메서드를 구현하지 마세요.

 

컬렉션 뷰의 데이터가 변경되고 아이템이 삽입 또는 삭제될 경우 컬렉션 뷰는 레이아웃 객체에 레이아웃 정보를 업데이트 하도록 요청합니다.

특히 이동, 추가, 삭제된 아이템은 레이아웃 정보를 업데이트하여 새 위치를 반영해야 합니다.

이동된 항목의 경우 컬렉션 뷰는 스탠다드 메서드를 사용하여 아이템의 업데이트된 레이아웃 attribute를 찾아옵니다.

삽입되거나 삭제되는 항목의 경우 컬렉션 뷰에서 몇 가지 다른 메서드를 호출합니다.

이 메서드는 적절한 레이아웃 정보를 제공하려면 override해야 합니다. (아래)

이 메서드 외에도 prepare(forCollectionViewUpdates:) 를 override해서 다른 레이아웃 관련된 준비를 다룰 수 있습니다.

finalizeCollectionViewUpdates() 를 override해서 전체 애니메이션 블록에 애니메이션을 추가하거나 final 레이아웃 관련된 task를 구현할 수 있습니다.

 

Optimizing Layout Performance Using Invalidation Contexts

custom 레이아웃을 설계할 때, 실제로 변경된 레이아웃 부분만 무효화하여 성능을 향상시킬 수 있습니다.

아이템을 변경할 때 invalidateLayout()을 호출하면 컬렉션 뷰가 모든 레이아웃 정보를 다시 계산하고 다시 적용합니다.

더 나은 해결책은 변경된 레이아웃 정보만 다시 계산하는 것인데,  invalidation contexts이 수행할 수 있는 작업입니다.

 invalidation contexts 를 사용하여 레이아웃에서 변경된 부분을 지정할 수 있습니다.

그런 다음 레이아웃 객체는 이 정보를 사용하여 계산되는 데이터의 양을 최소화할 수 있습니다.

 

레이아웃에 대한 커스텀invalidation contexts를 정의하려면 UICollectionViewLayoutInvalidationContext 클래스를 subclass하세요.

subclass에서 독릭접으로 계산할 수 있는 레이아웃 데이터의 일부를 나타내는 커스텀 프로퍼티를 정의합니다.

런타임에 레이아웃을 무효화해야 하는 경우,  invalidation contexts subclass의 인스턴스를 만들고, 변경된 레이아웃 정보에 따라 커스텀 프로퍼티를 구성한 다음, 해당 객체를 invalidateLayout(with:) 에 전달합니다.

이 커스텀 메서드는 invalidation contexts의 정보를 사용하여 변경된 레이아웃 부분만 계산할 수 있습니다.

 

레이아웃 객체에 대한 커스텀 invalidation contexts클래스를 정의하는 경우 invalidationContextClass 를 overrid하고 커스텀 클래스를 return해야합니다.

컬렉션 뷰는 항상 invalidation contexts가 필요할 때 지정하는 클래스의 인스턴스를 만듭니다.

이 메서드에서 커스텀 subclass를 return하면 레이아웃 객체가 원하는 invalidation contexts를 항상 가질 수 있습니다.

 

https://developer.apple.com/documentation/uikit/uicollectionviewlayout

댓글
공지사항