如何为集合视图中的所有单元格设置相同的转换?

时间:2018-09-09 09:33:49

标签: ios swift uicollectionview

我正在编写iOS纸牌游戏。我正在通过横向滚动在收藏视图中显示玩家的纸牌。

选择一张卡后,我希望该卡稍微“弹出”。这意味着它应该向上移动其高度的10%。

这是我解决问题的方式:

我否决了这种方法来计算每个像元的大小:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    // the height of each card should be a bit smaller than the collection view
    // height so there is some space for the card to pop up
    let height = collectionView.height / 1.15
    // 5:7 is the W:H ratio of each card
    let width = height * 5 / 7
    return CGSize(width: width, height: height)
}

在每个单元格中,有一个imageView完全填充了该单元格。我这样做是有限制的。这是单元格类:

class CardCell: UICollectionViewCell {
    @IBOutlet var imageView: UIImageView!

    override var isSelected: Bool {
        didSet {
            if isSelected {
                self.transform = .identity
            } else {
                // when it is not selected, it is transformed downwards because
                // identity transformation will place the cell at the top of the
                // collection view
                self.transform = CGAffineTransform(translationX: 0, y: self.bounds.height * 0.1)
            }
        }
    }
}

cellForItemAt中,我执行了以下操作:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CardCell
    cell.isSelected = false
    cell.imageView.image = ...
    return cell
}

这一切都很好,而且似乎可以正常工作。

当设备方向更改时,集合视图将相应地更改其大小(我也对集合视图添加了约束)。这意味着我需要再次重新计算单元格的大小,因此我在collectionView.reloadData()中调用viewWillTransitionTo。这是行不通的地方。方向更改后,某些单元格似乎没有向下转换。如果我点击这些单元格,它们将进一步向上变形,超出集合视图的范围。

我检查了调试器,发现这些异常单元确实在选定状态下具有标识转换。那不应该发生的,对吧?默认情况下,集合视图应该将其所有单元格都置于其边界内,对吗?

我如何才能做到,即使在方向改变后,所有单元也都向下转化?

0 个答案:

没有答案