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

Posted

技术标签:

【中文标题】如何在布局转换期间为集合视图单元格的边框宽度/颜色设置动画?【英文标题】:How can I animate border width / color of UICollectionViewCells during layout transition? 【发布时间】:2015-01-23 16:01:32 【问题描述】:

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

实现细节:

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

-(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:])时,单元格大小和位置的变化会按预期进行动画处理,但边框不会。

【问题讨论】:

【参考方案1】:

事实证明,UIView 上的动画方法不会像 animateWithDuration 那样捕获对图层属性的更改。因此必须使用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"];

感谢 this answer 提供的关于获得正确动画持续时间的技巧。

【讨论】:

以上是关于如何在布局转换期间为集合视图单元格的边框宽度/颜色设置动画?的主要内容,如果未能解决你的问题,请参考以下文章

给定具有多行标签的集合视图单元格的宽度,如何获得首选的 AutoLayout 高度?

如何通过自动布局设置集合视图单元格大小

集合视图中单元格的宽度不正确

集合视图单元格的自动布局行为怪异

设置集合视图单元格的动态宽度时出现问题

Css中控制table单元格的间距