UICollectionViewLayout

Panther·2021년 8월 23일
0

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

"An abstract base class for generating layout information for a collection view."

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

Declaration

@MainActor class UICollectionViewLayout : NSObject

Overview

레이아웃 객체는 컬렉션 뷰 bounds 내부의 셀 위치, 보완 뷰, 장식 뷰를 결정하고, 컬렉션 뷰에 이 정보를 알려줍니다. 이후 컬렉션 뷰는 제공된 레이아웃 정보를 상응하는 뷰에 적용하고 이로써 뷰는 스크린에 나타날 수 있습니다.

이를 사용하려면 UICollectionViewLayout을 서브클래싱해야 합니다. 그러나 서브클래싱 전에 먼저 UICollectionViewCompositionalLayout을 적용할 수 있는지 여부를 고려해봐야 합니다.

Subclassing Notes

레이아웃 객체는 레이아웃의 디자인에 기반해 컬렉션 뷰에 있는 아이템의 위치, 크기, 시각적 상태를 정의합니다. 레이아웃을 위한 뷰는 컬렉션 뷰의 데이터 소스에 의해 생성됩니다.

컬력션 뷰에 사 가지 타입의 시각적 요소를 넣을 수 있습니다.

  • 셀은 레이에웃에 의해 위치가 정해지는 주요 요소입니다. 각 셀은 컬렉션에서 하나의 데이터 아이템을 나타냅니다. 사용자가 셀에 대해 선택, 드래그, 재정렬과 같은 액션을 수행할 수 있도록 셀을 상호작용 요소로 만들 수 있습니다. 컬렉션 뷰는 셀들의 한 그룹을 가질 수 있거나 여러 섹션으로 셀을 나눌 수 있습니다. 레이아웃 객체는 컬렉션 뷰의 컨텐트 영역에서 셀을 정렬합니다.
  • 보완 뷰는 데이터를 표시할 수 있지만 사용자가 선택할 수는 없습니다. 주어진 섹션 혹은 컬렉션 뷰 전체에서 헤더 및 footer 뷰와 같은 것을 구현하기 위해 보완 뷰를 사용할 수 있습니다. 보완 뷰는 선택적이며, 사용과 위치는 레이아웃 객체에 의해 정의됩니다.
  • 장식 뷰는 선택될 수 없고 컬렉션 뷰의 데이터에 묶일 수 없는 시각적 장식으로 badge와 같은 것이 있습니다. 장식 뷰는 보완 뷰의 다른 타입입니다. 보완 뷰처럼 장식 뷰도 선택적인 것이고 사용과 위치는 레이아웃 객체에 의해 정의됩니다.

컬렉션 뷰는 여러 시점에서 요소에 대한 레이아웃 정보를 제공하길 자신의 레이아웃 객체에게 요청합니다. 스크린에 나타나는 모든 셀과 뷰는 레이아웃 객체의 정보를 사용해서 위치가 정해집니다. 유사하게 모든 시점에 아이템은 컬렉션 뷰로부터 삽이되거나 삭제되고, 추가되거나 삭제되는 아이템에 대해 추가적인 레이아웃 전달이 발생합니다. 그러나 컬렉션 뷰는 스크린에서 시각적인 객체에 레이아웃에 대한 제한을 둡니다.

Methods to Override

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

  • collectionViewContentSize
  • layoutAttributesForElements(in:)
  • layoutAttributesForItem(at:)
  • layoutAttributesForSupplementaryView(ofKind:at:) (레이아웃이 보완 뷰를 지원하는 경우)
  • layoutAttributesForDecorationView(ofKind:at:) (레이아웃이 장식 뷰를 지원하는 경우)
  • shouldInvalidateLayout(forBoundsChange:)

이 메소드들은 컬렉션 뷰가 컨텐츠를 화면에 위치시키는 데 필요한 기본적인 레이아웃 정보를 제공합니다. 레이아웃이 보완 혹은 장식 뷰를 지원하는 경우 상응하는 메소드는 구현하지 않아야 합니다.

컬렉션 뷰에 있는 데이터가 변경되고 아이템이 삽입되거나 삭제될 준비가 되면 컬렉션 뷰는 레이아웃 정보 업데이트를 위해 자신의 레이아웃 객체에게 요청합니다. 구체적으로 이동, 추가, 삭제되는 모든 아이템은 새로운 위치를 반영하기 위해 업데이트된 레이아웃 정보를 갖고 있어야 합니다. 이동된 아이템의 경우 컬렉션 뷰는 아이템의 업데이트된 레이아웃 특성을 가져오기 위해 표준 메소드를 사용합니다. 삽입되거나 삭제되는 아이템의 경우 컬렉션 뷰는 적합한 레이아웃 정보를 제공하기 위해 오버라이드 해야 하는 몇 가지 다른 메소드를 호출합니다.

  • initialLayoutAttributesForAppearingItem(at:)
  • initialLayoutAttributesForAppearingSupplementaryElement(ofKind:at:)
  • initialLayoutAttributesForAppearingDecorationElement(ofKind:at:)
  • finalLayoutAttributesForDisappearingItem(at:)
  • finalLayoutAttributesForDisappearingSupplementaryElement(ofKind:at:)
  • finalLayoutAttributesForDisappearingDecorationElement(ofKind:at:)

이러한 메소드와 더불어 모든 레이아웃 관련 준비를 처리하기 위해 prepare(forCollectionViewUpdates:)를 오버라이드할 수도 있습니다. finalizeCollectionViewUpdates() 메소드를 오버라이드 할 수도 있고 이 메소드를 전체 애니메이션 블록에 애니메이션을 추가하거나 마지막 레이아웃 관련 작업을 구현하기 위해 사용할 수 있습니다.

Optimizing Layout Performance Using Invalidation Contexts

커스텀 레이아웃을 디자인할 때 실제로 변경되는 레이아웃의 일부만을 무효화함으로써 성능을 향상시킬 수 있습니다. 아이템을 변경할 때 invalidateLayout() 메소드를 호출하는 것은 컬렉션 뷰가 모든 레이아웃 정보를 다시 연산하고 다시 적용하는 것을 강제합니다. 더 나은 방법은 변경되는 레이아웃 정보만 다시 연산하는 것입니다. 이는 무효화 컨텍스트에서 허용되는 것과 정확히 같습니다. 무효화 컨텍스트는 레이아웃의 어떤 부분이 변경될지를 구체화할 수 있도록 해줍니다. 이후 레이아웃 객체는 다시 연산하는 데이터의 양을 최소화시키기 위해 해당 정보를 사용할 수 있습니다.

레이아웃에 대한 커스텀 무효화 컨텍스트를 정의하려면 UICollectionViewLayoutInvalidationContext 클래스를 서브클래싱 해야 합니다. 서브클래스에서 독립적으로 다시 연산 가능한 레이아웃 데이터 부분을 나타내는, 커스텀 속성을 정의해야 합니다. 런타임에 레이아웃을 무효화할 필요가 있는 경우 무효화 컨텍스트 서브클래스의 인스턴스를 생성하고, 어떤 레이아웃 정보가 변경되는지에 기반해 커스텀 속성을 설정한 뒤, 해당 객체를 레이아웃의 invalidateLayout(with:) 메소드에 전달해야 합니다. 해당 메소드의 커스텀 구현은 변경되는 레이아웃 일부만을 다시 연산하기 위해 무효화 컨텍스트에 있는 정보를 사용할 수 있습니다.

레이아웃 객체에 대한 커스텀 무효화 컨텍스트 클래스를 정의하는 경우 invalidationContextClass 메소드를 정의해야 하고 커스텀 클래스를 반환해야 합니다. 컬렉션 뷰는 무효화 컨텍스트가 필요할 때, 구체화한 클래스의 인스턴스를 항상 생성합니다. 이 메소드로부터 커스텀 서브클래스를 반환하는 것으 ㄴ레이아웃 객체가 항상 무효화 컨텍스트를 갖고 있음을 보장해줍니다.

See Also


Manual Layouts

UICollectionViewFlowLayout

각 섹션에 선택적인 헤더 및 footer 뷰와 함께 아이템을 그리드로 조직화하는 레이아웃 객체입니다.

https://developer.apple.com/documentation/uikit/uicollectionviewflowlayout
https://velog.io/@panther222128/UICollectionViewFlowLayout

UICollectionViewTransitionLayout

컬렉션 뷰에서 하나의 레이아웃으로부터 다른 레이아웃으로 변경될 때 동작을 구현할 수 있도록 해주는 레이아웃 객체의 특별한 타입입니다.

https://developer.apple.com/documentation/uikit/uicollectionviewtransitionlayout
https://velog.io/@panther222128/UICollectionViewTransitionLayout

UICollectionViewLayoutAttributes

컬렉션 뷰에서 주어진 아이템에 대한 레이아웃 관련 특성을 관리하는 레이아웃 객체입니다.

https://developer.apple.com/documentation/uikit/uicollectionviewlayoutattributes
https://velog.io/@panther222128/UICollectionViewLayoutAttributes

UICollectionViewFlowLayoutInvalidationContext

아이템의 크기를 다시 계산할지 혹은 레이아웃에서 위치를 다시 계산할지 결정하는 속성의 집합입니다.

https://developer.apple.com/documentation/uikit/uicollectionviewflowlayoutinvalidationcontext
https://velog.io/@panther222128/UICollectionViewFlowLayoutInvalidationContext


0개의 댓글