集合视图单元格内imageView的isishighlighted状态动画

时间:2018-12-13 23:40:42

标签: ios swift uicollectionview uiviewanimationtransition

我正陷入一个问题,那就是在集合视图的单元格内imageView的isHighlighted状态:我无法以我想要的方式为两个图像之间的过渡设置动画。

我的收藏集视图的每个自定义单元格都有3个视图:

  1. UIImageView :具有突出显示和未突出显示的相关.png的背景图像
  2. 第二个UIImageView :另一个具有突出显示和非突出显示相关.png的图像作为先前UIImageView的子视图
  3. 自定义UILabel:文本标签

当我触摸单元格时,两个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)时提供过渡动画:换句话说,我看到了先前选择的单元格淡出,但看不到所选单元格淡入

对于它为什么不起作用以及如何解决的任何提示,我将不胜感激!

感谢大家花时间阅读和回复! 最好,

2 个答案:

答案 0 :(得分:0)

我不相信,但我认为您可能还想覆盖;

override func setSelected(_ highlighted: Bool, animated: Bool)

在您的UICollectionViewCellisSelected属性中,并因此在func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)中显示动画代码。

*请注意,您在问题中说isHighlighted,但在实现中利用了isSelectedisHighlightedisSelected之间也有区别。

答案 1 :(得分:0)

感谢你们花时间思考我的问题。 通过进一步调查,我决定检查触发了cell.isHighlightedcell.isSelectedcollectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)这3个事件的方式和时间,实际上发现了一些非常有趣的东西。让我总结一下:

在集合视图中触摸一个单元格(cell1)时,会出现以下事件:

  1. cell1.isHightlighted设置为true
  2. cell1.isHightlighted设置为false
  3. cell1.isSelected设置为true,这会回调cell1.isHighlighted属性
  4. 最后调用collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)方法

现在,当您触摸集合视图中的另一个单元格(cell2)时,会发生以下事件:

  1. cell2.isHighlighted设置为true
  2. cell1.isSelected设置为false,这会回调cell1.isHightlighted属性
  3. cell2.isHighlighted设置为false
  4. cell1.isSelected再次设置为false(!)
  5. cell2.isSelected设置为true,这会回调cell2.isHighlighted属性
  6. 最后,collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)方法是     叫

考虑到这一点,我得出的结论是,在集合视图方法中以isHighlighted状态运行过渡动画将永远无法按预期工作,因为该属性已在到达方法之前设置。 / p>

我发现同时获得两个动画(isHighlighted truefalse)的一种解决方案是对isHighlightedisSelected的属性观察者进行操作我的自定义集合视图单元格,如下所示:

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

我希望它能对您有所帮助,并再次感谢所有花了一些时间试图解决它的人! 如果有人找到更优雅的解决方案,请随时发布!!! 最好,