到目前为止,由于+ (BOOL)needsDisplayForKey:(NSString *)key
和CABasicAnimations
,我已经能够为我的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
的委托设置为包含视图。
答案 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 }];