rom*_*rom 8 iphone core-animation properties catransaction
到目前为止,我已经能够动画我的CALayer子类的自定义属性,感谢+ (BOOL)needsDisplayForKey:(NSString *)key和CABasicAnimations.
然而事实证明链接动画可能变得非常棘手,因为所有代码都在一个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];
Run Code Online (Sandbox Code Playgroud)
myProperty值的更新newValue未设置动画.我试图actionForLayer:forKey:在管理myLayer的视图中实现
返回一个CABasicAnimation.但actionForLayer:forKey:永远不会用钥匙打电话myProperty.是的,myLayer它不是view.layer一个子层,是的,我将委托设置myLayer为包含视图.
Jon*_*nam 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];
Run Code Online (Sandbox Code Playgroud)
抱歉,我现在没有项目设置来轻松测试,但我相信它会起作用.
检查这些网站的代码:
我引用的代码:
[CATransaction begin];
[topLayer addAnimation:topAnimation forKey:@"flip"];
[bottomLayer addAnimation:bottomAnimation forKey:@"flip"];
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)