gpt4 book ai didi

ios - Collection View 单元格内 imageView 的 Animate isHighlighted 状态

转载 作者:行者123 更新时间:2023-11-30 10:57:34 27 4
gpt4 key购买 nike

我遇到了 Collection View 单元格内 imageView 的 isHighlighted 状态问题:我无法按照我的目标方式为两个图像之间的过渡设置动画。

我的 Collection View 的每个自定义单元格都有 3 个 View :

  1. UIImageView:带有突出显示和非突出显示相关 .png 的背景图像
  2. 第二个 UIImageView :另一张图像,其中突出显示和非突出显示相关的 .png 作为前一个 UIImageView 的 subview
  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) 时提供过渡动画:换句话说,我看到之前选定的单元格淡出,但没有看到选定的单元格淡入

如果您能提供有关其为何不起作用以及如何修复的提示,我将不胜感激!

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

最佳答案

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

当您触摸 Collection View 中的单元格 (cell1) 时,会发生以下事件:

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

现在,当您触摸 Collection View 中的另一个单元格 (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)
    方法是 称为

考虑到这一点,我得出的结论是,在 Collection View 方法中的 isHighlighted 状态上运行过渡动画永远不会按预期工作,因为该属性在到达方法。

我发现获得两种动画(isHighlighted truefalse)的一种解决方案是对 的属性观察器进行操作我的自定义 Collection View 单元格的 >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
})
}
}
}

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

关于ios - Collection View 单元格内 imageView 的 Animate isHighlighted 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53771635/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com