2014-05-22 43 views
5

我正在嘗試創建一個交互式動畫,它使用0.016的speed並操縱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 

此視圖控制器有一個看法,我加入了一個動畫將在從-320pt到+ 320pt X軸平移,我想在中間啓動它,所以沒有翻譯,直到用戶與它交互。我也有一個滑塊,當更改時,將timeOffset屬性設置爲與滑塊位置匹配。

如果我省略timeOffset設置爲0.5的問題行,所有按預期工作,但視圖開始翻譯-320pt。然後從該點開始適當地跟蹤滑塊。

當問題線出現時,這一切都變得非常可怕。該視圖仍然開始翻譯-320pt,並且只在滑塊值大於0.5時跟蹤滑塊。即使如此,翻譯只是從-320pt到0pt,並且永遠不會翻譯更高。對於低於0.5的滑塊值,根本沒有翻譯。

如果我在將圖層添加到動畫之前或之後放置問題線,則沒有區別。如果我使用-performSelector:withObject:afterDelay延遲0.0來設置初始timeOffset在運行循環的未來迭代中,但在用戶與滑塊交互之前有什麼幫助。不幸的是,這個解決方法對於真正的項目並不實用,因爲我需要在用戶開始交互時即時創建動畫。

爲什麼timeOffset屬性在將動畫添加到圖層時設置在相同的運行循環迭代中時不起作用?我認爲發生的事情是當timeOffset這次設置時,它成爲動畫的新基準時間。

任何人都可以提出一種方法,我可以創建一個可以與timeOffset屬性進行交互的動畫,並將它設置爲在開始之外的某處開始?

+0

@馬特 - 沒想好,但在原來的項目這個樣品是改編自,發生在這是viewDidLoad中後調用以及其他方法的問題。 – GBegen

回答

1

我會嘗試以下方法:

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