在CATransaction中为自定义CALayer属性设置动画

时间:2010-11-08 08:49:54

标签: iphone properties core-animation catransaction

到目前为止,由于+ (BOOL)needsDisplayForKey:(NSString *)keyCABasicAnimations,我已经能够为我的CALayer子类的自定义属性设置动画。

然而事实证明,链接动画会变得非常棘手,因为所有代码都是在一个animationDidStop:finished:方法中进行的。

所以我想切换到CATransactions,因为它们支持新的块语法,这允许我使用+ (void)setCompletionBlock:(void (^)(void))block指定完成块。

但在我看来,CATransaction只能为所谓的“动画属性”设置动画,即使实现了needsDisplayForKey:方法,它也无法使用我的自定义图层属性。

那么有没有办法在CALayer中设置自定义属性,以CATransaction制作动画?

修改 我的意图是做一些事情:

[CATransaction begin];
[CATransaction setAnimationDuration:0.5];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[CATransaction setCompletionBlock:^{
    NSLog(@"blabla");
}];

myLayer.myProperty = newValue;

[CATransaction commit];

myProperty值更新为newValue不是动画。我试图实施 管理myLayer的视图中的actionForLayer:forKey:返回CABasicAnimation。但永远不会使用密钥actionForLayer:forKey:调用myProperty。是的,myLayer不是view.layer,而是子图层,是的,我将myLayer的委托设置为包含视图。

2 个答案:

答案 0 :(得分:10)

我相信,根据我对某些源代码的阅读,您仍然可以在CABasicAnimation中使用CATransaction。在CAAnimations[CATransaction begin]之间添加的任何[CATransaction commit]应该是交易的一部分。

[CATransaction begin];
[CATransaction setAnimationDuration:0.5];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[CATransaction setCompletionBlock:^{
    NSLog(@"blabla");
}];

// Create the CABasicAnimation using your existing code
CABasicAnimation *myPropertyAnim = [CABasicAnimation animationWithKeyPath:@"myProperty"];
// TODO: Setup animation range
myPropertyAnim.toValue = newValue;

// The CATransaction does not observe arbitrary properties so this fails:
//myLayer.myProperty = newValue;

// Add the CAAnimation subclass during the CATransaction
[myLayer addAnimation:myPropertyAnim forKey:@"myKey"];

[CATransaction commit];

道歉,我现在没有项目设置来轻松测试,但我相信它会起作用。

检查这些网站以获取代码:

我引用的代码:

[CATransaction begin];
[topLayer addAnimation:topAnimation forKey:@"flip"];
[bottomLayer addAnimation:bottomAnimation forKey:@"flip"];
[CATransaction commit];

答案 1 :(得分:1)

有一个名为CAAnimationBlocks的优秀课程,并解释了here,这是CAAnimation上的一个类别,允许您像使用UIView一样使用完成块。

您只需致电:

即可使用它
CABasicAnimation myAnimation;
[myAnimation setCompletion:^(BOOL finished) { // Do something }];