如何在布局转换期间为 UICollectionView 单元格的边框宽度/颜色设置动画?
How can I animate border width / color of UICollectionViewCells during layout transition?
我有一个 UICollectionView
,它使用 UICollectionViewFlowLayout
的自定义子 class。这又使用 UICollectionViewLayoutAttributes
的自定义 subclass,其属性会影响单元格上的边框颜色和厚度。在我的集合视图上执行动画布局更改时,如何将这些内容包含在动画中?
实施细节:
在 MyLayoutAttributes
中说我有一个枚举 属性 LayoutType
,其值为 TypeBig
和 TypeSmall
。我有一个 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"];
感谢 获得正确动画持续时间的技巧。
我有一个 UICollectionView
,它使用 UICollectionViewFlowLayout
的自定义子 class。这又使用 UICollectionViewLayoutAttributes
的自定义 subclass,其属性会影响单元格上的边框颜色和厚度。在我的集合视图上执行动画布局更改时,如何将这些内容包含在动画中?
实施细节:
在 MyLayoutAttributes
中说我有一个枚举 属性 LayoutType
,其值为 TypeBig
和 TypeSmall
。我有一个 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"];
感谢