我正在编写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
。这是行不通的地方。方向更改后,某些单元格似乎没有向下转换。如果我点击这些单元格,它们将进一步向上变形,超出集合视图的范围。
我检查了调试器,发现这些异常单元确实在选定状态下具有标识转换。那不应该发生的,对吧?默认情况下,集合视图应该将其所有单元格都置于其边界内,对吗?
我如何才能做到,即使在方向改变后,所有单元也都向下转化?