我正在使用UIView
的{{1}}属性为CALayer
设置动画。我正在制作的转换是以这种方式构建的:affineTransform
。
现在我想改进这个动画并使其具有互动性。因此,我需要使用完成百分比插入CGAffineTransform。但是,我似乎无法找到系统在为我设置动画时插入转换的方式。我总是得到奇怪的曲线,其中平移与缩放不同步。这是我目前的代码:
CGAffineTransformTranslate(CGAffineTransformScale(zoomContainer.layer.transform, scaleX, scaleY), translateX, translateY)
我需要更改以插入变换,就像UIKit为我做的那样?
答案 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
}