如何在任意时间偏移处启动交互式动画?

时间:2014-05-22 01:52:21

标签: ios core-animation

我正在尝试创建一个使用speed 0.0的交互式动画,并操纵timeOffset属性以响应用户操作。我希望动画的初始状态位于定义动画的中间,因为用户动作允许动画从起点向前和向后进行。

以下是一些示例代码,它是我尝试做的简化案例。

@interface TestViewController : UIViewController {}
@property (strong, nonatomic) IBOutlet UIView * transformerView;
@property (strong, nonatomic) IBOutlet UISlider * slider;
@end

@implementation TCTestViewController {}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.slider.minimumValue = 0.0f;
    self.slider.maximumValue = 1.0f;
    self.slider.value = 0.5f;

    CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform"];
    animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(-320.0f, 0.0f, 0.0f)];
    animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(320.0f, 0.0f, 0.0f)];
    animation.duration = 1.0f;

    self.transformerView.layer.speed = 0.0;
    [self.transformerView.layer addAnimation:animation forKey:@"test"];

    //  *** THIS IS THE PROBLEM LINE ***
    self.transformerView.layer.timeOffset = 0.5;
}

- (IBAction)onSliderValueChanged {
    self.transformerView.layer.timeOffset = self.slider.value;
}

@end

这个视图控制器有一个视图我正在添加一个动画,它将在X轴上从-320pt转换到+ 320pt,我想在中间启动它,所以在用户与之交互之前没有翻译。我还有一个滑块,当更改时,设置timeOffset属性以匹配滑块位置。

如果我省略timeOffset设置为0.5的问题行,则所有问题都按预期工作,但视图开始翻译为-320pt。然后它会从该点开始正确跟踪滑块。

当出现问题时,一切都变得非常糟糕。视图仍然以-320pt开始转换,并且仅在滑块值高于0.5时跟踪滑块。即便如此,翻译只是从-320pt到0pt,并且永远不会翻译得更高。对于低于0.5的滑块值,根本没有转换。

如果我在将动画添加到图层之前或之后放置问题行没有区别。如果我使用延迟为0.0的-performSelector:withObject:afterDelay在运行循环的未来迭代中设置初始timeOffset,但在用户与滑块交互之前,有什么帮助呢?不幸的是,这种解决方法对于真实项目来说并不实用,因为我需要在用户开始交互时动态创建动画。

为什么timeOffset属性在与动画添加到图层相同的运行循环迭代中设置时不起作用?我认为发生的事情是,当此时设置timeOffset时,它将成为动画的新基准时间。

任何人都可以建议一种方法,我可以创建一个可以与timeOffset属性进行交互的动画,并将其设置为从开头以外的其他位置开始吗?

1 个答案:

答案 0 :(得分:1)

我会尝试以下方法:

dispatch_async(dispatch_get_main_queue(), ^{
    self.transformerView.layer.timeOffset = 0.5;
});