插值CGAffineTransform

时间:2013-11-06 17:37:03

标签: cocoa-touch uikit core-graphics

我正在使用UIView的{​​{1}}属性为CALayer设置动画。我正在制作的转换是以这种方式构建的:affineTransform

现在我想改进这个动画并使其具有互动性。因此,我需要使用完成百分比插入CGAffineTransform。但是,我似乎无法找到系统在为我设置动画时插入转换的方式。我总是得到奇怪的曲线,其中平移与缩放不同步。这是我目前的代码:

CGAffineTransformTranslate(CGAffineTransformScale(zoomContainer.layer.transform, scaleX, scaleY), translateX, translateY)

我需要更改以插入变换,就像UIKit为我做的那样?

1 个答案:

答案 0 :(得分:3)

如果您希望能够与动画交互(可能使用手势或滑块或其他机制),那么您可以使用一个小技巧,通过设置speed来“暂停”动画视图的图层为0,然后通过设置图层的timeOffset将动画移动到特定时间点。

我在an answer to a similar (but animating a different property) question中对此有一个解释,我在the context of animation timing in a blog post中有更详细的解释。


因此,这不仅仅是一个链接答案,这是您进行此交互所需的极少代码。在这种情况下,我假设一个滑块。博客文章展示了如何将它与滚动事件一起使用,如果你想用手势做,那么我相信你可以弄明白:)

在你的动画设置中(注意我使用的是CATransform3D而不是CGAffineTransform)

CABasicAnimation *yourAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
yourAnimation.duration  = 1.; // For convenience (so that timeOffset is from 0.0 to 1.0)
yourAnimation.fromValue = [NSValue valueWithCATransform3D:fromTransform];
yourAnimation.toValue   = [NSValue valueWithCATransform3D:toTransform];
[self.yourView.layer addAnimation: yourAnimation forKey:@"Your Animation"];

self.yourView.layer.speed = 0.0; // Pause every animation on that layer

用于驱动动画交互的滑块(滑块配置为从0.0到1.0):

- (IBAction)sliderChanged:(UISlider *)sender {
    self.yourView.layer.timeOffset = sender.value; // Change the "current time" of the animation
}