我正在尝试创建一个使用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
属性进行交互的动画,并将其设置为从开头以外的其他位置开始吗?
答案 0 :(得分:1)
我会尝试以下方法:
dispatch_async(dispatch_get_main_queue(), ^{
self.transformerView.layer.timeOffset = 0.5;
});