UICollectionView

Panther·2021년 8월 20일
0

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

"An object that manages an ordered collection of data items and presents them using customizable layouts."

정렬된 아이템들의 컬렉션을 관리하고 커스터마이징 가능한 레이아웃을 사용해서 나타내는 객체입니다.

Declaration

@MainActor class UICollectionView : UIScrollView

Overview

UI에 컬렉션 뷰를 추가하면 앱의 주요 작업은 해당 컬렉션 뷰에 연결된 데이터를 관리하는 것입니다. 컬렉션 뷰는 컬렉션 뷰의 dataSource 속성에 저장된 데이터 소스 객체로부터 데이터를 가져옵니다. 데이터 소스에서 간단하고 효율적으로 컬렉션 뷰의 데이터 및 UI를 업데이트하는 것을 관리하는 데 필요한 동작을 제공하는 UICollectionViewDiffableDataSource 객체를 사용할 수 있습니다. 대안으로 UICollectionViewDataSource 프로토콜을 채택해서 커스텀 데이터 소스 객체를 생성할 수 있습니다.

컬렉션 뷰에 있는 데이터는 나타나는 모양에서 섹션으로 그룹화시킬 수 있는 개별적인 아이템으로 조직화됩니다. 아이템은 나타내길 원하는 데이터의 가장 작은 단위입니다. 예를 들어 사진 앱에서 아이템은 하나의 이미지일 것입니다. 컬렉션 뷰는 데이터 소스가 설정하고 제공하는 UICollectionViewCell 클래스의 인스턴스인 셀을 사용해서 아이템을 표시합니다.

Figure 1 A collection view using the flow layout

셀과 더불어 컬렉션 뷰는 다른 타입의 뷰를 사용해서 데이터를 표시할 수도 있습니다. 예를 들어 이러한 보완 뷰는 개별 셀로부터 분리되어 있는 섹션 헤더 및 footer가 될 수 있습니다. 셀로부터 분리되어 있지만 헤더와 footer 역시 정보를 전달합니다. 보완 뷰를 지원하는 것은 선택적이고, 보완 뷰의 위치를 정의하는 데 책임이 있기도 한 컬렉션 뷰의 레이아웃 객체에 의해 정의됩니다.

UI에서 UICollectionView를 포함하는 것 외에도 아이템의 시각적 표현이 데이터 소스 객체에 있는 순서로 나타날 수 있도록 컬렉션 뷰의 관련 메소드를 사용할 수도 있습니다. UICollectionViewDiffableDataSource 객체는 이러한 과정을 자동으로 처리합니다. 커스텀 데이터 소스를 사용하는 경우 컬렉션에 데이터를 추가, 삭제, 재정렬하길 원할 때마다 상응하는 셀의 삽입, 삭제, 재정렬을 위한 UICollectionView의 메소드를 사용할 수 있습니다.

선택된 아이템 관리를 위해 컬렉션 뷰 객체를 사용할 수도 있습니다. 이 동작은 컬렉션 뷰 관련 딜리게이트 객체와 동일하게 동작합니다.

Layouts

레이아웃 객체는 컬렉션 뷰 내부에 있는 컨텐트의 시각적 정렬을 정의합니다. UICollectionViewLayout의 서브클래스인 레이아웃 객체는 모든 셀 및 컬렉션 뷰에 포함되는 보완 뷰의 조직화 및 위치를 정의합니다. 위치를 정의하고 있을지라도 레이아웃 객체는 실제로 해당 정보를 상응하는 뷰에 적용하지는 않습니다. 컬렉션 뷰는 레이아웃 정보를 상응하는 뷰에 적용합니다. 왜냐하면 셀 및 보완 뷰의 생성은 컬렉션 뷰와 데이터 소스 객체 사이의 조정과 관련이 있기 때문입니다. 레이아웃 객체는 아이템 데이터 대신 시각적 정보를 제공한다는 것을 제외하면 다른 데이터 소스와 같습니다.

보통 컬렉션 뷰 생성 시 레이아웃 객체를 구체화하지만 컬렉션 뷰의 레이아웃을 동적으로 변경시킬 수도 있습니다. 레이아웃 객체는 CcollectionViewLayout 속성에 저장됩니다. 이 속성을 직접 설정하면 변경에 대한 애니메이션 없이 레이아웃을 즉시 업데이트합니다. 변경에 대한 애니메이션 처리를 원하는 경우 대신 setCollectionViewLayout(_:animated:completion:) 메소드를 호출하시기 바랍니다.

상호작용 가능한 전환을 생성하려면(제스쳐 리코그나이저 혹은 터치 이벤트로 시작되는) 레이아웃 객체 변경을 위해 startInteractiveTransition(to:completion:) 메소드를 사용해야 합니다. 이 메솟드는 전환 과정을 추적하기 위한 제스쳐 리코그나이저 혹은 이벤트 처리 코드와 함께 작동하는 중간 레이아웃 객체를 설치합니다. 이벤트 처리 코드가 전환이 완료되었다고 확인하면 중간 객체 삭제를 위해 finishInteractiveTransition(), cancelInteractiveTransition() 메소드를 호출하고, 의도한 타깃 레이아웃 객체를 설치합니다.

더 많은 정보는 Layouts를 보시기 바랍니다.

Layouts
https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/layouts
https://velog.io/@panther222128/Layouts

Cells and Supplementary Views

컬렉션 뷰의 데이터소스 객체는 아이템을 위한 컨텐트와 해당 컨텐트 표시를 위해 사용되는 뷰 모두를 제공합니다. 컬렉션 뷰가 자신의 컨텐트를 처음 로드하면, 컬렉션 뷰는 데이터 소스에게 각각의 시각화할 수 있는 아이템 제공을 요청합니다. 컬렉션 뷰는 데이터 소스가 재사용을 위하 표시한 뷰 객체의 큐 혹은 리스트를 유지합니다. 명시적으로 코드를 통해 새 뷰를 생성하는 것 대신 항상 뷰를 디큐해야 합니다.

뷰를 디큐하기 위한 메소드로 두 가지가 있습니다. 어떤 타입의 뷰가 요청되는지에 따라 사용할 메소드가 달라집니다.

  • 컬렉션 뷰에서 아이템에 대한 셀을 가져오려면 dequeueReusableCell(withReuseIdentifier:for:)를 사용합니다.
  • 레이아웃 객체에 의해 요청되는 보완 뷰를 가져오려면 dequeueReusableSupplementaryView(ofKind:withReuseIdentifier:for:) 메소드를 사용합니다.

이와 같은 메소드 중 어느 것이든 호출하기 전에 뷰가 이미 존재하지 않다면 컬렉션 뷰에게 어떻게 상응하는 뷰를 생성할지 알려줘야 합니다. 이를 위해 컬렉션 뷰에 대한 클래스 혹은 nib 파일을 등록해야 합니다. 예를 들어 셀을 등록할 때 클래스 등록을 위해 register(_:forCellWithReuseIdentifier:) 메소드를 사용할 수 있고, nib 파일 등록을 위해 register(_:forCellWithReuseIdentifier:) 메소드를 사용할 수 있습니다. 등록 과정의 일부로 뷰의 목적을 식별하는 재사용 아이덴티파이어를 구체화할 수 있습니다. 이후에 뷰를 디큐할 때 사용하는 스트링와 같습니다.

데이터 소스 메소드에서 적합한 뷰를 디큐한 후 컨텐트를 설정하고 컬렉션 뷰에 컨텐트를 반환해야 합니다. 레이아웃 객체로부터 레이아웃 정보를 가져온 후 컬렉션 뷰는 이 정보를 뷰에 적용하고 뷰를 표시합니다.

Data Prefetching

컬렉션 뷰는 반응성을 향상시키기 위해 사용할 수 있는 두 가지 프리패치 테크닉을 제공합니다.

  • 셀 프리패치는 필요한 시간보다 미리 셀을 준비합니다. 컬렉션 뷰가 많은 수의 셀을 동시에 요구하면(예를 들어 그리드 레이아웃에서 셀의 새로운 행), 셀은 표시가 요청되는 시점보다 더 빠르게 요청됩니다. 그러므로 셀 렌더링은 여러 레이아웃 패스에 걸쳐 분산됩니다. 이는 보이기에 더 부드러운 스크롤링으로 나타납니다. 셀 프리패치는 기본값으로 활성화되어 있습니다.
  • 데이터 프리패치는 셀 요청 전에 컬렉션 뷰의 데이터 요구사항을 알림받을 수 있는 메커니즘을 제공합니다. 이는 네트워크 요청처럼 비용이 많이 드는 데이터 로딩 프로세스에 셀의 컨텐트가 의존하고 있는 경우 유용합니다. 셀을 위한 데이터 프리패치 시 노티피케이션을 받을 수 있도록 UICollectionViewDataSourcePrefetching 프로토콜을 따르는 객체를 prefetchDataSource 속성에 할당하시기 바랍니다.

Reordering Items Interactively

컬렉션 뷰는 사용자 상호작용에 기반해 아이템을 움직일 수 있도록 해줍니다. 보통 컬렉션 뷰에서 아이템의 순서는 데이터 소스에 의해 정의됩니다. 사용자가 아이템을 재정렬할 수 있도록 허용하면 컬렉션 뷰 아이템에 대한 사용자의 상호작용 추적을 위해 제스쳐 리코그나이저를 설정할 수 있고 해당 아이템의 위치를 업데이트할 수 있습니다.

아이템의 상호작용 위치조정을 시작하려면 컬렉션 뷰의 beginInteractiveMovementForItem(at:)을 호출해야 합니다. 제스쳐 리코그나이저가 터치 이벤트를 추적하는 동안 터치 위치에 대한 변경사항을 알려주기 위해 updateInteractiveMovementTargetPosition(_:) 메소드를 호출해야 합니다. 제스쳐 추적이 마무리되면 상호작용 결과를 끝내고 컬렉션 뷰 업데이트를 위해 endInteractiveMovement() 혹은 cancelInteractiveMovement() 메소들르 호출해야 합니다.

사용자 상호작용 동안 컬렉션 뷰는 아이템의 현재 위치를 반영하기 위해 레이아웃을 동적으로 무효화합니다. 아무것도 하지 않으면 기본값 레이아웃 동작은 아이템의 위치를 조정하지만, 원하는 경우 레이아웃 애니메이션을 커스터마이징 할 수 있습니다. 상호작용이 끝나면 컬렉션 뷰는 아이템의 새 위치와 함게 데이터 소스 객체를 업데이트합니다.

UICollectionViewController 클래스는 아이템 재정렬을 위해 사용할 수 있는 기본값 제스쳐 리코그나이저를 제공합니다. 이 제스쳐 리코그나이저를 설치하려면 컬렉션 뷰 컨트롤러의 installsStandardGestureForInteractiveMovement 속성을 true로 설정해야 합니다.

Interface Builder Attributes

Table 1은 인터페이스빌더에서 컬렉션 뷰에 대해 설정할 수 있는 특성을 보여줍니다.

Table 1 Collection view attributes

AttributeDescription
Items프로토타입 셀의 수입니다. 이 속성은 스토리보드에서 설정하기 위한 프로토타입 셀의 구체화된 수를 제어합니다. 컬렉션 뷰는 항상 적어도 하나의 셀을 가져야 하고, 다른 타입 컨텐트의 표시 혹은 다른 방법으로 같은 컨텐트를 표시하기 위해 여러 셀을 가질 수 있습니다.
Layout사용을 위한 레이아웃 객체입니다. UICollectionViewFlowLayout 객체와 정의한 커스텀 레이아웃 객체 중에서 선택하기 위해 이 컨트롤을 사용하시기 바랍니다.

flow layout이 선택되면 컬렉션 뷰의 컨텐트에 대한 스크롤링 방향을 설정할 수 있고, flow layout이 헤더 및 footer를 가질 것인지를 설정할 수 있습니다. 헤더 및 footer 뷰를 활성화 하는 것은 헤더와 footer 컨텐트를 설정할 수 있는 스토리보드에 재사용 가능한 뷰를 추가합니다. 이러한 뷰를 코드 작성으로 생성할 수도 있습니다.

커스텀 레이아웃이 선택되면 UICollectionViewLayout 서브클래스를 구체화해야 합니다.

flow layout이 선택되면 컬렉션 뷰에 대한 사이즈 인스펙터는 flow layout 메트릭 설정을 위한 추가적인 특성을 포함합니다. 셀의 크기, 헤더 및 footer의 크기, 셀 사이의 최소 간격, 셀의 각 섹션 주변의 모든 마진 설정을 위해 이러한 특성을 사용하시기 바랍니다. flow layout 메트릭의 의미에 대한 더 많은 정보는 UICollectionViewFlowLayout을 보시기 바랍니다.

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

Internationalization

컬렉션 뷰는 internationalize를 위한 직접적인 컨텐트를 갖고 있지 않습니다. 대신 컬렉션 뷰의 셀과 재사용 가능한 뷰를 internationalize해야 합니다. internationalization에 대한 더 많은 정보는 Internationalization and Localization Guide를 보시기 발바니다.

Internationalization and Localization Guide
https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPInternational/Introduction/Introduction.html#//apple_ref/doc/uid/10000171i

Accessibility

컬렉션 뷰는 접근 가능한 형태로 만들 수 있는 컨텐트를 갖고 있지 않습니다. 셀과 재사용 가능한 뷰가 UILabel, UITextField처럼 표준 UIKit 컨트롤을 포함하고 있다면 이러한 컨트롤을 접근 가능하도록 만들 수 있습니다. 컬렉션 뷰가 스크린 레이아웃을 변경하면 UIAccessibilityLayoutChangedNotification 노티피케이션을 포스트합니다.

인터페이스를 접근 가능한 형태로 만드는 것에 대한 정보는 Accessibility Programming Guide for iOS를 보시기 바랍니다.

Accessibility Programming Guide for iOS
https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/iPhoneAccessibility/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008785

Topics


Providing the Collection View Data

UICollectionViewDiffableDataSource

컬렉션 뷰에서 데이터를 관리하고 셀을 제공하기 위해 사용하는 객체입니다.

https://developer.apple.com/documentation/uikit/uicollectionviewdiffabledatasource
https://velog.io/@panther222128/UICollectionViewDiffableDataSource


See Also


View

UICollectionViewController

컬렉션 뷰 관리에 특화된 뷰 컨트롤러입니다.

https://developer.apple.com/documentation/uikit/uicollectionview
https://velog.io/@panther222128/UICollectionViewController


0개의 댓글