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

GBe*_*gen 5 core-animation ios

我正在尝试创建一个使用speed0.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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

mye*_*xec 1

我会尝试以下操作:

dispatch_async(dispatch_get_main_queue(), ^{
    self.transformerView.layer.timeOffset = 0.5;
});
Run Code Online (Sandbox Code Playgroud)