我有一个自定义的CollectionViewFlowLayout,我在其中覆盖layoutAttributesForElements(in rect: CGRect)
,以便像设计规范一样定位元素。
一切都很好,但在某些情况下,为了制作“选择模式”动画,我需要更新帧的y位置,但是当我这样做时,我的动画会有一点延迟。
如果我保持y位置并更新属性的x,宽度和高度,动画就可以了。
为什么会这样?我怎么能避免它?
这是我布局的模型:
这是选择的模式:
基本上我的动画包括更改可见单元格的变换,以使它们更小但居中,并保持对齐和正确的间距我操作layoutAttributesForElements中的帧并使布局无效。
编辑:
答案 0 :(得分:1)
正如我在评论中提到的那样,似乎有一种更简单的方法:通过改变collectionView(_:layout:sizeForItemAt:)
,collectionView(_:layout:minimumLineSpacingForSectionAt:)
和{{1]返回的值,我能够获得非常顺利的实现在适当的时候,在适当的时刻在动画块中调用collectionView(_:minimumInteritemSpacingForSectionAt:)
和invalidateLayout()
。
项目的真正基本布局的返回值可能如下所示(其中layoutIfNeeded()
根据选择状态返回更大或更小的值):
separatorSize(isInSelectionMode:)
然后,您只需在动画块内切换func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let totalRowHeight: CGFloat = 100
let widthRatio: CGFloat
switch indexPath.item % 4 {
case 0, 3: widthRatio = (2.0 / 3.0)
case 1, 2: widthRatio = (1.0 / 3.0)
default: widthRatio = 1.0
}
return CGSize(width: (collectionView.bounds.width - separatorSize(isInSelectionMode: selectionMode).width) * widthRatio,
height: totalRowHeight - separatorSize(isInSelectionMode: selectionMode).height)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return separatorSize(isInSelectionMode: selectionMode).height
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return separatorSize(isInSelectionMode: selectionMode).width
}
,同时使布局无效。