【问题标题】:CollectionView SizeForItemAt based on Cell Class?CollectionView SizeForItemAt 基于 Cell 类?
【发布时间】: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)
    }

}

提前谢谢你!

【问题讨论】:

    标签: swift xcode uicollectionview uicollectionviewcell uicollectionviewlayout


    【解决方案1】:

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

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

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

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

    【讨论】:

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