【问题标题】:How to override the default position of UICollectionViewCells?如何覆盖 UICollectionViewCells 的默认位置?
【发布时间】:2021-10-04 12:29:29
【问题描述】:

我有一个垂直的UICollectionView,其中包含 5 种不同类型的单元格。其中 4 个占据了 UICollectionView 的整个宽度,因此 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 完成了工作。

另外2个大小相同,但默认位置需要更改;我希望它们从左到右对齐,而不是默认居中。

这是我设置 UICollectionView 的方式:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    switch typesOfCellsArray[indexPath.row] {
    case .createVoiceRoom:
        return CGSize(width: collectionView.frame.width, height: 70)
    case .voiceRooms:
        let height: CGFloat = content.voiceRooms.count > 3 ? 256 : 128
        return CGSize(width: collectionView.frame.width, height: height)
    case .seeMoreVoiceRooms:
        return CGSize(width: collectionView.frame.width, height: 50)
    case .newStatus:
        let width = collectionView.frame.width / 4
        return CGSize(width: width, height: width + 40)
    case .status:
        let width = collectionView.frame.width / 4
        return CGSize(width: width, height: width + 40)
    }
}

它们的外观如下:

这就是我想要的:

我认为我需要继承 UICollectionViewLayout 来实现这一点,但我失败了......这是我所做的:

class HomeCollectionViewLayout: UICollectionViewLayout {
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        guard let collectionView = collectionView else { return nil }
        let layoutAttributes = super.layoutAttributesForElements(in: rect)
    
        layoutAttributes?.forEach({ attributes in
            if collectionView.cellForItem(at: attributes.indexPath) is NewHomeStatusCollectionViewCell {
                let column = attributes.indexPath.row % 3
                attributes.frame.origin.x = CGFloat(column-1) * attributes.frame.width
            }
        })
    
        return layoutAttributes
    }
}

当然,我已经将这个类设置为 UICollectionView 布局。有什么想法吗?

【问题讨论】:

标签: swift uicollectionview uicollectionviewlayout


【解决方案1】:

您可以将每个单元格插入单独的部分,然后控制以下内容:

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { }

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

【讨论】:

  • 不幸的是,没有任何改变;我将底部单元格放在第二个部分,它们仍然在中心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
相关资源
最近更新 更多