Animation 如何沿路径设置contentsRect属性的动画?

Animation 如何沿路径设置contentsRect属性的动画?,animation,calayer,bounds,cakeyframeanimation,Animation,Calayer,Bounds,Cakeyframeanimation,我加载了一个png精灵表和相应的plist文件,我正在尝试设置CALayer的contentsRect属性的动画,以显示上述aprite表中的精灵动画。下面是一个代码: CGFloat width = myLayer.frame.size.width; CGFloat height = myLayer.frame.size.height; myLayer.bounds = CGRectMake( 0, 0, width, height ); myLayer.contentsGravity = k

我加载了一个png精灵表和相应的plist文件,我正在尝试设置CALayer的contentsRect属性的动画,以显示上述aprite表中的精灵动画。下面是一个代码:

CGFloat width = myLayer.frame.size.width;
CGFloat height = myLayer.frame.size.height;
myLayer.bounds = CGRectMake( 0, 0, width, height );
myLayer.contentsGravity = kCAGravityCenter;
myLayer.contents=(id)pImage; // This is my sprite sheet


CAKeyframeAnimation *keyFrameContentsRectAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contentsRect"];
keyFrameContentsRectAnimation.path = pAnimationPath; // This is a path to animate on
keyFrameContentsRectAnimation.values = pRects; // This is an array of normalized CGRects representing sprite sheet
keyFrameContentsRectAnimation.fillMode = kCAFillModeRemoved;
keyFrameContentsRectAnimation.calculationMode = kCAAnimationDiscrete;
keyFrameContentsRectAnimation.duration=pAnimationDuration;
keyFrameContentsRectAnimation.repeatCount = 1;
只要我禁用路径动画(即,从keyFrameContentsRectAnimation中注释掉路径属性),上述代码似乎就能按预期工作-动画工作,内容在精灵工作表中移动

但问题是:我的所有精灵都需要在层帧内进行一些偏移,以使动画看起来正确(偏移量根据透明度裁剪而变化)

所以我想,如果我从这些偏移点创建一条路径,并将其放入动画的路径属性中,应该可以解决这个问题。不幸的是,事实并非如此。。。
一旦我添加路径属性,我就会看到整个精灵表图像,而不是精灵动画。。。我错过了什么?

好吧,经过一些阅读和实验,我有了一个有效的解决方案。。。为了让精灵显示在正确的位置,我必须将另一个动画添加到动画组中,并将CALayer剪辑到精灵的尺寸:

myLayer.bounds = CGRectMake( 0, 0, 256.0, 256.0 ); //my sprite dimentions

myLayer.contentsGravity = kCAGravityCenter;
myLayer.contents=(id)pImage; // This is my sprite sheet


CAKeyframeAnimation *keyFrameContentsRectAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contentsRect"];

keyFrameContentsRectAnimation.values = pRects; // This is an array of normalized CGRects representing sprite sheet
keyFrameContentsRectAnimation.fillMode = kCAFillModeRemoved;
keyFrameContentsRectAnimation.calculationMode = kCAAnimationDiscrete;
keyFrameContentsRectAnimation.duration=pAnimationDuration;
keyFrameContentsRectAnimation.repeatCount = 1;  

CAKeyframeAnimation* kfanim = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
kfanim.path = pAnimationPath;
kfanim.values = pRects;
kfanim.fillMode = kCAFillModeBoth;
kfanim.calculationMode = kCAAnimationDiscrete;
kfanim.duration=pAnimationDuration;
kfanim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];


NSArray *animations = [NSArray arrayWithObjects:keyFrameContentsRectAnimation,
                       kfanim, nil];

CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
[animationGroup setDuration:pAnimationDuration];
[animationGroup setRepeatCount: 1];
[animationGroup setAnimations:animations];