处理集合视图中唯一节的动态标题的合适方法?

时间:2018-07-13 03:04:30

标签: ios swift uicollectionview uicollectionreusableview

我需要一个自定义视图作为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")
    }
}

我有几个问题:

  1. 我真的不需要重用MyCustomHeader类型的标题视图,因为我仅需要一个实例用于第一部分。但是如果不调用dequeueReusableSupplementaryView ...
  2. ,该方法就会崩溃
  3. 那么是否适合在那里header = self.myCustomHeader

如果我错了,请纠正我:集合视图没有像表视图那样的“全局”标头(它具有tableHeaderView属性),对吗?因此,集合视图的唯一方法是将标头作为 section 标头视图处理,我需要调用前面提到的两个委托方法(referenceSizeForHeaderInSectionviewForSupplementaryElementOfKind)。 ..还是有其他更好的方式来处理我的特定情况?

0 个答案:

没有答案