Expandable UICollectionViewCell 重新定位问题

Posted

技术标签:

【中文标题】Expandable UICollectionViewCell 重新定位问题【英文标题】:Expandable UICollectionViewCell re-positioning problem 【发布时间】:2018-10-19 13:48:44 【问题描述】:

我有一个带有可扩展 uicollectionviewcells 的 uicollectionview。 在 iPhone 上,每行有 1 列,没有问题。 但在 iPad 上,行有 2 列,展开单元格后出现问题。

这是单元格屏幕截图。 not expanded

expanded

单击箭头按钮时我正在重新加载项目

self.collectionView.reloadItems(at: [indexPath])

sizeforitem 函数

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

    let height = store.pickList[indexPath.row].expanded ? CGFloat(414) : CGFloat(168)
    var width = CGFloat(0)

    if Constants.isPad  width = (self.view.frame.size.width - 25 - 12 - 12) / 2 
    else  width = self.view.frame.size.width - 12 - 12 

    return CGSize(width: width, height: height)

CellforRowAt:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "detailCell", for: indexPath) as! DetailCollectionViewCell


    .....
    if data.expanded 
        UIView.animate(withDuration: 0.25, animations: 
            cell.bottomView.frame = CGRect(x: 0, y: 372, width: cell.frame.width, height: 42)
            cell.expandArrow.setBackgroundImage(UIImage(named: "ok2"), for: .normal)
        , completion:  result in
            UIView.animate(withDuration: 0.2, animations: 
                cell.detailView.alpha = 1
            )
        )
    
    else 
                    UIView.animate(withDuration: 0.25, animations: 
            cell.detailView.alpha = 0
        , completion:  result in
            UIView.animate(withDuration: 0.2, animations: 
                cell.expandArrow.setBackgroundImage(UIImage(named: "ok"), for: .normal)
                cell.bottomView.frame = CGRect(x: 0, y: 124, width: cell.frame.width, height: 42)
            )
        )
    

    return cell

当我展开单元格时,行也在展开。 我的实施有什么问题? 谢谢

【问题讨论】:

能否附上 iPhone 上的屏幕截图,其外观必须在 iPad 上模仿? 我现在无法访问 web api。它似乎是逐行的,每一行在 iPhone 上都有 1 列。单击按钮时行扩展 【参考方案1】:

发生这种情况是因为在 iPad 上显示单元格时,您似乎使用 (self.view.frame.size.width - 25 - 12 - 12) / 2 作为单元格的宽度。

计算值除以 2 仅适用于 iPad,为 UICollectionView 提供了足够的空间来在同一行中显示超过 1 个单元格。在其他设备的情况下,您没有这种除以 2 的方法,它只允许在一行中显示 1 个单元格。

因此,您必须更新计算以删除除以 2,或者,如果是这种情况,对于 iPad,您需要单元格仅为计算值的一半,请实施 minimumInterItemSpacing委托方法:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat 
    if Constants.isPad 
        // Replace this with whatever that suits your need.
        return 70.0
     else 
        // Replace this with whatever that suits your need.
        return 10.0
    

这将为两个连续的项目提供足够的空间,以便在一行中仅显示 1 个项目。您可以修改上述值以使单元格以您想要的方式显示。

【讨论】:

如果我删除 sizeForItemAt 方法,我该如何调整单元格高度?单元格高度根据单元格展开动态变化 您不需要删除 sizeForItemAt 方法。您只需添加这个新的 minimumInteritemSpacingForSectionAt 方法以及之前的方法来调整项目之间的“间距”。 我添加了 minimumInteritemSpacingForSectionAt。我从宽度计算中删除了“/2”。但这一次,iPad 连续 1 列。我想在 iPad 上连续显示 2 列。

以上是关于Expandable UICollectionViewCell 重新定位问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在QML中设计一个expandable ListView

scrollview下Expandable Listview的setOnScrollListener()

使用自定义适配器实现 Expandable ListView

Vuetify Expandable Data Table:展开行位置

向下滚动时不会出现 Swift Expandable tableView 单元格按钮

Android - 如何在 Android 的 Expandable ListView 的子视图下添加另一个视图?