/
UICollectionViewFlowLayoutAdapter.swift
36 lines (29 loc) 路 1.73 KB
/
UICollectionViewFlowLayoutAdapter.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import UIKit
/// An adapter for `UICollectionView` with `UICollectionViewFlowLayout` inherited from `UICollectionViewAdapter`.
open class UICollectionViewFlowLayoutAdapter: UICollectionViewAdapter {}
extension UICollectionViewFlowLayoutAdapter: UICollectionViewDelegateFlowLayout {
/// Returns the size for item at specified index path.
open func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let node = cellNode(at: indexPath)
return node.component.referenceSize(in: collectionView.bounds) ?? collectionViewLayout.flowLayout?.itemSize ?? .zero
}
/// Returns the size for header in specified section.
open func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
guard let node = headerNode(in: section) else {
return .zero
}
return node.component.referenceSize(in: collectionView.bounds) ?? collectionViewLayout.flowLayout?.headerReferenceSize ?? .zero
}
/// Returns the size for footer in specified section.
open func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
guard let node = footerNode(in: section) else {
return .zero
}
return node.component.referenceSize(in: collectionView.bounds) ?? collectionViewLayout.flowLayout?.footerReferenceSize ?? .zero
}
}
private extension UICollectionViewLayout {
var flowLayout: UICollectionViewFlowLayout? {
return self as? UICollectionViewFlowLayout
}
}