CABasicAnimation问题

Ick*_*cky 1 iphone scale uiimage cabasicanimation

所以,我在文档中读过,使用像

beginAnimation
commitAnimation
Run Code Online (Sandbox Code Playgroud)

不鼓励os4.0.

所以我试图通过使用CABasicAnimation来使我的代码工作.我希望实现一个图像的框架从我的视图中某处的缩略图大小调整到我的iPhone上的全宽位置,例如(0,120,320,240).

到目前为止我所拥有的:

[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:1.0] forKey:kCATransactionAnimationDuration]; 

CABasicAnimation *scalingAnimation;
scalingAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
scalingAnimation.duration=1.0/2;
scalingAnimation.autoreverses=YES;
scalingAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
scalingAnimation.fromValue=[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)];
scalingAnimation.toValue=[NSValue valueWithCATransform3D:CATransform3DMakeScale(4, 4, 1)];

[b.layer addAnimation:scalingAnimation forKey:@"scaling"];

[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

我的nextstep将首先尝试将图像移动到居中位置,然后将其缩放到正确的大小.但是,我怀疑我是否正确行事.任何人都可以评论我的代码/方法....有更好的方法吗?

小智 5

我相信你现在已经解决了这个问题,但无论如何.

你不应该需要[CATransaction begin]; 和[CATransaction commit]; 我发现做这种事情的最简单方法是使用CAAnimationGroup并逐个添加动画.

一个例子是

CABasicAnimation *scaleX = [CABasicAnimation animationWithKeyPath:@"transform.scale.x"];
//this is not used, as the group provides the duration
scaleX.duration = duration;
scaleX.autoreverses = NO;

scaleX.toValue = [NSNumber numberWithFloat:1.0];
scaleX.fromValue = [NSNumber numberWithFloat:scaleFrom]; 
scaleX.fillMode = kCAFillModeForwards;
scaleX.removedOnCompletion = NO;

CABasicAnimation *scaleY = [CABasicAnimation animationWithKeyPath:@"transform.scale.y"];
//this is not used, as the group provides the duration
scaleY.duration = duration;
scaleY.autoreverses = NO;

scaleY.toValue = [NSNumber numberWithFloat:1.0];
scaleY.fromValue = [NSNumber numberWithFloat:scaleFrom]; 
scaleY.fillMode = kCAFillModeForwards;
scaleY.removedOnCompletion = NO;

//add in the translation animations

NSMutableArray* animationsArray = [NSMutableArray arrayWithObjects:scaleX,
                                                                   scaleY, 
//and any other animations you want in the group
                                       nil];

CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
animationGroup.duration = 1.0/2;
animationGroup.timingFunction = [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseIn];
animationGroup.animations = animationsArray;
animationGroup.delegate = self;
animationGroup.removedOnCompletion = YES;
animationGroup.fillMode = kCAFillModeForwards;
[animationGroup setValue:@"imageTransform" forKey:@"AnimationName"];
[b.layer addAnimation:animationGroup forKey:@"imageTransform"];
Run Code Online (Sandbox Code Playgroud)

虽然有一些陷阱.动画纯粹是视觉效果,因此在运行动画之前,请设置最终的视图框.

你会注意到比例结束为1,这是为了确保你不会得到一个缩放的图像层.相反,我们开始缩放并使其恢复正常.

翻译应以同样的方式完成.

希望这可以帮助