8

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

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

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

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

那么有没有办法在 a 中制作自定义属性以CALayer进行动画处理CATransaction

编辑: 我的意图是做一些事情:

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

myLayer.myProperty = newValue;

[CATransaction commit];

myProperty 值的更新newValue不是动画的。我试图 actionForLayer:forKey:在管理 myLayer 的视图中实现返回一个CABasicAnimation. 但actionForLayer:forKey:永远不会用 key 调用myProperty。是的,myLayerview.layer只是一个子层,是的,我将委托设置myLayer为包含视图。

4

2 回答 2

10

我相信,根据我对一些源代码的阅读,您仍然可以CABasicAnimationCATransaction. 在和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];
于 2010-11-09T14:07:15.900 回答
1

有一个很棒的类叫做CAAnimationBlocks在这里进行了解释,它是 CAAnimation 上的一个类别,它允许您像在 UIView 上一样使用完成块。

您只需调用以下命令即可使用它:

CABasicAnimation myAnimation;
[myAnimation setCompletion:^(BOOL finished) { // Do something }];
于 2011-12-22T16:38:16.207 回答