WWDC20 영상을 보면서 번역, 정리한 내용입니다
iOS14에서의 Lists는 UICollectionView는 UITableView와 유사한 모양을 제공합니다.
2019년에 도입한 Compositional Layout 위에 만들 수 있다.
preferredLayoutAttributesFitting(_:)
을 오버라이드하여 수행이 가능합니다.)구축 다이어그램
// 사용예시
let configuration = UICollectionLayoutListConfiguration(appearance: .insetGrouped)
let layout = UICollectionViewCompositionalLayout.list(using: configuration)
섹션별 설정(Per-Section Setup)
let layout = UICollectionViewCompositionalLayout() {
[weak self] sectionIndex, layoutEnvironment in
guard let self = self else { return nil }
if sectionIndex == 0 {
let section = self.createGridSection()
retrun section
}
else {
let configuration = UICollectionLayoutListConfiguration(appearance: .insetGrouped)
let section = NScollectionLayoutSection.list(using: configuration)
return section
}
}
구성은 동일하지만, 컴포지셔널 레이아웃 대신 NSCollectionLayoutSection
을 사용합니다.
이 코드는 컴포지션레이아웃의 기존 섹션 init
내에서 사용이 가능하며, 모든 섹션에 대해 호출되어, 특정 섹션에 고유한 개별 레이아웃 정의를 반환 가능합니다.
var configuration = UICollectionLayoutListConfiguration(appearance: .insetGrouped)
configuration.headerMode = .supplementary
dataSource.supplementaryViewProvider = { (collectionView, elementKind, indexPath) in
if elementKind == UICollectionView.elementKindSectionHeader {
return collectionView.dequeConfiguredReusableSupplementary(using: header, for: indexPath)
}
// ...
}
headerMode
를 .firstItemInSection
으로 지정합니다.iOS14에서 추가 됨 UICollectionViewCell의 서브클래스입니다. SwipeAction
, 악세사리 API 등이 향상 되었습니다.
이는 구분기호이며, 셀의 렌더링을 할 때 UITableView에선 Separator inset
이라는 Point 기반 값을 제공하여 수행됩니다. 레이블의 x-offset
을 수동 계산하는데, 만약 여러 변수사항(safeareainset, 레이아웃 여백, 동적 글꼴 크기)이 있다면 매번 계산하기가 쉽지 않습니다.
ListCell 에서는 SeparatorLayoutGuide
라고 부르는 새로운 개념이 도입됩니다.
이 레이아웃 가이드는 기존의 UIKit과는 다르게 작동합니다. 컨텐츠를 레이아웃 가이드에 제한거는 대신, 레이아웃 가이드를 컨텐츠로 제한을 걸 수 있습니다.
// Configured like cell content
let makeFavorite = UIContextualAction(style: .normal, title: "Mark as Favorite") {
[weak self] (_, _, completion) in
guard let self = self else { return }
self.markItemAsFavorite(with: item.identifier)
completion(true)
}
cell.leadingSwipeActionsConfiguration = UISwipeActionConfiguration(actions: [makeFavorite])
주의 ! 스와이프 액션의 핸들러에서 셀의
indexPath
를 캡처하지 마시오 !indexPath
는 식별자가 아닙니다. 이 셀의indexPath는 컨텐츠의 변경마다 수정되므로, 특정셀을 매번 로드하지는 않습니다. 데이터 모델을 직접 캡처하거나, 셀의 컨텐츠를 식별하는데 사용할 수 있는 안정적인 식별자를 캡처하세요.
DiffableDataSource와item identifier는 이때 잘 어울립니다.
그 다음 셀의 Accessories view가 있는데 재정렬, 삭제등의 기능을 사용할 수 있습니다.