我正陷入一个问题,那就是在集合视图的单元格内imageView的isHighlighted
状态:我无法以我想要的方式为两个图像之间的过渡设置动画。
我的收藏集视图的每个自定义单元格都有3个视图:
当我触摸单元格时,两个ImageView都会立即移至突出显示状态,但我希望它们过渡到此状态(简单的CrossDissolve过渡)
我尝试了两种不同的方法:在自定义单元格类中覆盖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)
时提供过渡动画:换句话说,我看到了先前选择的单元格淡出,但看不到所选单元格淡入。
对于它为什么不起作用以及如何解决的任何提示,我将不胜感激!
感谢大家花时间阅读和回复! 最好,
答案 0 :(得分:0)
我不相信,但我认为您可能还想覆盖;
override func setSelected(_ highlighted: Bool, animated: Bool)
在您的UICollectionViewCell
和isSelected
属性中,并因此在func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
中显示动画代码。
*请注意,您在问题中说isHighlighted
,但在实现中利用了isSelected
,isHighlighted
和isSelected
之间也有区别。
答案 1 :(得分:0)
感谢你们花时间思考我的问题。
通过进一步调查,我决定检查触发了cell.isHighlighted
,cell.isSelected
和collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
这3个事件的方式和时间,实际上发现了一些非常有趣的东西。让我总结一下:
在集合视图中触摸一个单元格(cell1)时,会出现以下事件:
cell1.isHightlighted
设置为true
cell1.isHightlighted
设置为false
cell1.isSelected
设置为true
,这会回调cell1.isHighlighted
属性collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
方法现在,当您触摸集合视图中的另一个单元格(cell2)时,会发生以下事件:
cell2.isHighlighted
设置为true
cell1.isSelected
设置为false
,这会回调cell1.isHightlighted
属性cell2.isHighlighted
设置为false
cell1.isSelected
再次设置为false
(!)cell2.isSelected
设置为true
,这会回调cell2.isHighlighted
属性collectionView(_ collectionView:
UICollectionView, didSelectItemAt indexPath: IndexPath)
方法是
叫考虑到这一点,我得出的结论是,在集合视图方法中以isHighlighted
状态运行过渡动画将永远无法按预期工作,因为该属性已在到达方法之前设置。 / p>
我发现同时获得两个动画(isHighlighted
true
和false
)的一种解决方案是对isHighlighted
和isSelected
的属性观察者进行操作我的自定义集合视图单元格,如下所示:
override var isHighlighted: Bool {
willSet {
if newValue == true {
UIView.transition(with: cellImageView, duration: 1.0, options: .transitionCrossDissolve, animations: {
self.cellImageView.isHighlighted = newValue
})
}
}
}
override var isSelected: Bool {
willSet {
if newValue == false {
UIView.transition(with: cellImageView, duration: 1.0, options: .transitionCrossDissolve, animations: {
self.cellImageView.isHighlighted = newValue
})
}
}
}
我希望它能对您有所帮助,并再次感谢所有花了一些时间试图解决它的人! 如果有人找到更优雅的解决方案,请随时发布!!! 最好,