可展开的UICollectionViewCell重新定位问题

时间:2018-10-19 13:48:44

标签: ios swift ipad uicollectionviewcell uicollectionviewlayout

我有一个带有可扩展uicollectionviewcell的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
}

当我扩展单元格时,行也会扩展。 我的实现有什么问题? 谢谢

1 个答案:

答案 0 :(得分:0)

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

仅将iPad的计算值除以2,即可为UICollectionView提供足够的空间以在同一行中显示多个单元格。对于其他设备,您无需将此数字除以2,从而只能在一行中显示1个单元格。

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

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
    }
}

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