CollectionView SizeForItemAt 基于 Cell 类?

Posted

技术标签:

【中文标题】CollectionView SizeForItemAt 基于 Cell 类?【英文标题】:CollectionView SizeForItemAt based on Cell Class? 【发布时间】:2020-01-27 00:17:22 【问题描述】:

是否可以将 sizeForItemAt 代码包含为基于单元格类的动态代码?我有一个collectionView,其中有很多不同类型的单元格的行,但没有任何特定的模式(很难为每个单元格键入'if index path.row == 29'等等)。

我尝试了以下代码的变体,但它始终返回默认值(其他)。这里的代码 sn-p 有 3 种类型的单元格(GroupCell、MatchingButtonsCell 和 MatchingEventCell)。

我可以根据 Cell Class 使尺寸动态化吗?

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 

    if let cell = self.masterCollectionView.cellForItem(at: indexPath) as? GroupCell 
        let cellHeight: CGFloat = (self.view.bounds.height * 0.55)
        let cellWidth: CGFloat = self.masterCollectionView.frame.width
        return CGSize(width: cellWidth, height: cellHeight)
     else if let cell = self.masterCollectionView.cellForItem(at: indexPath) as? MatchingButtonsCell 
        let cellHeight: CGFloat = 60
        let cellWidth: CGFloat = self.masterCollectionView.frame.width
        return CGSize(width: cellWidth, height: cellHeight)
     else if let cell = self.masterCollectionView.cellForItem(at: indexPath) as? MatchingEventCell 
        let cellHeight: CGFloat = 500
        let cellWidth: CGFloat = self.masterCollectionView.frame.width
        return CGSize(width: cellWidth, height: cellHeight)
     else 
        let cellHeight: CGFloat = 10
        let cellWidth: CGFloat = self.masterCollectionView.frame.width
        return CGSize(width: cellWidth, height: cellHeight)
    


提前谢谢你!

【问题讨论】:

【参考方案1】:

我可以根据 Cell Class 使尺寸动态化吗?

基本上没有。问题是您假设在调用sizeForItemAt 时,项目所在的“单元格”。但事实并非如此。如您所知,sizeForItemAt 在有任何个“单元格”之前被调用,此时集合视图仍在规划其布局。

这就是为什么在通话中没有给你一个单元格的原因。您将获得一个索引路径。这应该就是你所需要的。您需要能够根据索引路径给出答案,而不是关于“单元格”的内容。

这应该很容易。毕竟,大概您在cellForItemAt 的实现中设置单元类——并且您必须根据索引路径来执行此操作,因为这就是您拥有的所有信息。好吧,如果你可以根据那里的索引路径来做,那就根据这里的索引路径来做吧。

【讨论】:

好的,明白了...是的,我可以根据索引路径来做,但我只是想知道是否有更简单的选择。在开发过程中,我们不断更改要放置单元格的位置,只需为单元格类型设置大小就可以了!无论如何,感谢您的回复。 如果您认为需要“作为更简单的替代方案”,这仅表明您的方法架构存在问题。某个地方的某个人必须知道进入每个索引路径的单元格类型。您需要将这些知识抽象到一个 cellForRowAtsizeForItemAt 都可以调用的方法中。 编写了一个名为cellTypeForIndexPath 的方法,现在其他两种方法的工作都很简单。如果您“更改我们要放置单元格的位置”,您只需更改一种方法即可。

以上是关于CollectionView SizeForItemAt 基于 Cell 类?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CollectionView 单元格内部其他 collectionView 的大小错误?

CollectionView 单元格出现在 collectionView 之外。

CollectionView 里面的 CollectionView | CollectionViewCell 自动布局错误

当collectionView折叠时隐藏collectionView内容

普通 CollectionView 单元格中的动态 CollectionView 单元格

CollectionView 嵌套在 Collectionview 中