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

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

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

为什么会这样呢?我该如何避免呢?

这是我的布局的模型:

ios - 更改layoutAttributesForElements中的帧会使动画变慢-LMLPHP

这是选定的模式:

ios - 更改layoutAttributesForElements中的帧会使动画变慢-LMLPHP

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

编辑:


其他解决方案(例如更改cellSize和minimumInteritemSpacing)对我不起作用,因为针对cellSize更改的UICollectionView动画极不稳定

最佳答案

正如我在评论中提到的那样,似乎有一个更简单的方法:通过适当地更改从collectionView(_:layout:sizeForItemAt:)collectionView(_:layout:minimumLineSpacingForSectionAt:)collectionView(_:minimumInteritemSpacingForSectionAt:)返回的值并调用和invalidateLayout()

真正基本项目布局的返回值可能看起来像这样(其中layoutIfNeeded()根据选择状态返回更大或更小的值):

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
}


然后,您只需在动画块内切换separatorSize(isInSelectionMode:)即可同时使布局无效。

我做了一个demo project heredemo video here

关于ios - 更改layoutAttributesForElements中的帧会使动画变慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48079691/

10-14 22:03
查看更多