【发布时间】:2018-12-13 23:40:42
【问题描述】:
我在集合视图的单元格内遇到isHighlighted imageView 状态的问题:我无法按照我的目标设置两个图像之间的过渡动画。
我的收藏视图的每个自定义单元格都有 3 个视图:
- 一个 UIImageView :具有突出显示和未突出显示的相关 .png 的背景图像
- 第二个 UIImageView :另一个带有突出显示和未突出显示的相关 .png 的图像作为前一个 UIImageView 的子视图
- 自定义 UILabel:文本标签
当我触摸单元格时,两个 ImageView 都会立即移动到突出显示状态,但我希望它们转换到这个状态(一个简单的 CrossDissolve 转换)
我尝试了 2 种不同的方法:在自定义单元格类中覆盖 isSelected 方法并将动画放入 collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
覆盖 isSelected 属性:
override var isSelected: Bool {
didSet {
UIView.transition(with: cellImageView, duration: 1, options: .transitionCrossDissolve, animations: {
self.cellImageView.setNeedsLayout()
self.cellImageView.layoutIfNeeded()
self.cellImageView.isHighlighted = self.isSelected
})
}
}
通过这种方式,当我单击模拟器中的单元格时,无论是单元格被选中还是失去选中状态时,我都不会看到动画,除非我单击并按住 一个单元格:然后我得到一个前一个单元格失去其选定单元格的动画(换句话说,我有前一个选定的 imageView 从isHighlighted(true) 到isHighlighted(false) 的过渡)。
didSelectItemAt indexPath 方法
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath) as! SubMenuCell
UIView.transition(with: cell, duration: 1.0, options: .transitionCrossDissolve, animations:
cell.setNeedsLayout()
cell.layoutIfNeeded()
cell.cellImageView.isHighlighted = cell.isSelected
})
}
此方法在单元格被选中时不会触发动画,但在单元格从isSelected(true) 移动到isSelected(false) 时会提供过渡动画:换句话说,我看到之前选择的单元格淡出 并且我没有看到选定的单元格淡入。
我将不胜感激任何关于它为什么不起作用以及如何修复它的提示!
感谢大家花时间阅读和回复! 最好的,
【问题讨论】:
-
你已经实现了
didSelectItemAt。但是didDeselectItemAt呢? -
感谢@Rob 抽出宝贵时间!我假设实现
didDeselectItemAt会触发我想要的相反结果,不幸的是这已经是我所拥有的。但我确实尝试实现你的建议,无论有没有didSelectItemAt方法,在这两种情况下,根本没有动画。
标签: ios swift uicollectionview uiviewanimationtransition