我有UICollectionView
使用UICollectionViewFlowLayout
的自定义子类。这反过来使用UICollectionViewLayoutAttributes
的自定义子类,其属性会影响单元格上的边框颜色和粗细等。在我的集合视图上执行动画布局更改时,如何在动画中包含这些内容?
实施细节:
在MyLayoutAttributes
中说我有一个枚举属性LayoutType
,其值为TypeBig
和TypeSmall
。我有一个单元格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:]
),单元格大小和位置更改会按预期动画,但边框不会。
答案 0 :(得分:6)
事实证明,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关于获得正确动画持续时间的技巧。