更改layoutAttributesForElements中的帧会减慢动画速度

问题描述 投票:0回答:1

我有一个自定义的CollectionViewFlowLayout,我在其中覆盖layoutAttributesForElements(in rect: CGRect),以便像设计规范中那样定位元素。

一切都很好,但在某些情况下,为了制作“选择模式”动画,我需要更新帧的y位置,但是当我这样做时,我的动画会受到一点延迟。

如果我保持y位置并更新属性的x,宽度和高度,动画就可以了。

为什么会这样?我怎么能避免它?

这是我的布局的模型:

mockup of layout

这是选择的模式:

selected mode

基本上我的动画包括更改可见单元格的变换,以使它们更小但居中,并保持对齐和正确的间距我操作layoutAttributesForElements中的帧并使布局无效。

编辑:

  • 其他解决方案,如更改cellSize和minimumInteritemSpacing对我来说不起作用,因为用于cellSize更改的UICollectionView动画非常不稳定
ios uicollectionview uicollectionviewlayout
1个回答
1
投票

正如我在评论中提到的那样,似乎有一种更简单的方法:通过改变从collectionView(_:layout:sizeForItemAt:)collectionView(_:layout:minimumLineSpacingForSectionAt:)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
}

然后你只需在动画块内切换selectionMode,同时使布局无效。

我做了一个demo project here和一个demo video here

© www.soinside.com 2019 - 2024. All rights reserved.