我需要一个自定义视图作为UICollectionView
第一节的标题。这样的视图有一个我事先不知道的高度,它取决于在加载viewController的视图之后需要检索的某些数据,因此我在其中有一个属性可以实例化此类自定义标头视图,然后实现该方法:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
if section == 0 {
myCustomHeader.layoutIfNeeded()
let height = myCustomHeader.containerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
return CGSize(width: collectionView.frame.width, height: height)
}
// Handle other sections header heights
}
这对我来说是正确的,我将自定义视图注册为UICollectionElementKindSectionHeader
,并在那里获得了合适的高度。
但是正如我所说,为此,我需要在视图控制器中保留对该自定义视图的实例的引用,因此,在之后调用此其他方法时:
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
switch kind {
case UICollectionElementKindSectionHeader:
if indexPath.section == 0, let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind,
withReuseIdentifier: MyCustomHeader.reuseIdentifier,
for: indexPath) as? MyCustomHeader {
self.myCustomHeader = header
return self.myCustomHeader
}
// Handle other sections headers
fatalError("No view")
default:
fatalError("No view")
}
}
我有几个问题:
MyCustomHeader
类型的标题视图,因为我仅需要一个实例用于第一部分。但是如果不调用dequeueReusableSupplementaryView
... header = self.myCustomHeader
?如果我错了,请纠正我:集合视图没有像表视图那样的“全局”标头(它具有tableHeaderView
属性),对吗?因此,集合视图的唯一方法是将标头作为 section 标头视图处理,我需要调用前面提到的两个委托方法(referenceSizeForHeaderInSection
和viewForSupplementaryElementOfKind
)。 ..还是有其他更好的方式来处理我的特定情况?