我已经使用CAKeyframeAnimations为图层的transform.rotation
和transform.translation.x
属性设置动画效果,但我无法隐式动画设置transform
属性。我有一个必须在两个状态之间动画的图层,而CABasicAnimation的默认插值完全不正确,并且不遵循我想要的路径。 CAKeyframeAnimation来拯救,或者我想。任何使用CAKeyframeAnimation动画transform
的尝试都会导致该视图在其他动画运行时立即捕捉到最终变换。如果我删除了以下函数的前半部分,并让我的“变形”事件在底部使用了CABasicAnimation,则它的动画效果非常好 - 尽管沿途有不正确的插值变换。如何使用CAKeyframeAnimation为CATransform3D设置动画效果?
我的层代表已经实现了以下内容:
- (id <CAAction>) actionForLayer:(CALayer *)layer forKey:(NSString *)event
{
if ([event isEqualToString:@"transform"])
{
CGSize startSize = ((CALayer *)self.layer.presentationLayer).bounds.size;
CGSize endSize = self.layer.bounds.size;
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:event];
animation.duration = 0.25;
NSMutableArray *values = [NSMutableArray array];
int stepCount = 10;
for (int i = 0; i < stepCount; i++)
{
CGFloat p = i/(float)(stepCount - 1);
CGSize size = [self interpolateBetweenSize:startSize andSize:endSize percentage:p];
CATransform3D transform = [self transformForSize:size];
[values addObject:[NSValue valueWithCATransform3D:transform]];
}
animation.values = values;
return animation;
}
// All other animations use this basic animation
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:event];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.removedOnCompletion = YES;
animation.fillMode = kCAFillModeForwards;
animation.duration = 0.25;
return animation;
}
我的变换是平移再旋转,但我认为有独立的关键帧动画,动画通过平移和旋转会导致疯狂的一组动画镇。我已经确认,&变换的大小对于我通过的所有p值都是正确的,并且p的严格范围从0到1.
我试过设置非默认定时功能,我试过设置一组定时函数,我省略了关键时间,我设置了一个0的重复计数,removedOnCompletion = YES,以及一个fillMode的转发并且没有任何效果。我没有正确创建变换关键帧动画?
你能否澄清你试图达到的确切效果?你将它描述为一个翻译后跟一个旋转,但是从你的代码看,它的边界也是动画 - 这是否正确?您希望图层移动,然后旋转,边界在移动/旋转动画的两个阶段中不断增大或缩小? – GSnyder 2012-03-11 01:01:41
它为什么需要隐含?这段代码看起来很拙劣。如果你想细粒度的控制,为什么不创建动画并直接将其添加到图层,你说你已经工作了?如果你想要使用默认动画,只需从该委托方法返回'nil'即可。 – 2012-03-12 01:08:48