如何在布局转换期间为 UICollectionView 单元格的边框宽度/颜色设置动画?

How can I animate border width / color of UICollectionViewCells during layout transition?

我有一个 UICollectionView,它使用 UICollectionViewFlowLayout 的自定义子 class。这又使用 UICollectionViewLayoutAttributes 的自定义 subclass,其属性会影响单元格上的边框颜色和厚度。在我的集合视图上执行动画布局更改时,如何将这些内容包含在动画中?

实施细节:

MyLayoutAttributes 中说我有一个枚举 属性 LayoutType,其值为 TypeBigTypeSmall。我有一个 class MyCell 单元格,其中 UILabel 作为子视图。在那个单元格 class 中,我做了这样的事情:

-(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)attr
{
  [super applyLayoutAttributes:attr];
  MyLayoutAttributes *myAttr = (MyLayoutAttributes *)attr;
  if (myAttr.layoutType == TypeSmall)
    self.layer.borderWidth = 1; //there's already a color set
  else
    self.layer.borderWidth = 0;
}

当集合视图的布局发生变化时(使用 [collectionView setCollectionViewLayout:animated:]),单元格大小和位置的变化会按预期进行动画处理,但边框不会。

事实证明,层属性的更改不会像 animateWithDuration 那样被 UIView 上的动画方法捕捉到。因此必须使用 CAAnimation 将它们添加到层中。所以,在 applyLayoutAttributes 中,我做了这样的事情:

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"borderColor"];
anim.fromValue = (id)[UIColor clearColor].CGColor;
anim.toValue = (id)[UIColor lightGrayColor].CGColor;
self.layer.borderColor = [UIColor lightGrayColor].CGColor;
anim.duration = [CATransaction animationDuration];
anim.timingFunction = [CATransaction animationTimingFunction];
[self.layer addAnimation:anim forKey:@"myAnimation"];

感谢 获得正确动画持续时间的技巧。