2014-11-02 40 views
1

我正在將一個翻譯應用到UILabel,這會導致標籤在它開始的x位置處結束,但由於某種原因它似乎處於左側。CGAffineTransform動畫沒有以正確的位置結束

[UIView animateWithDuration:1 delay:0 usingSpringWithDamping:0.1 initialSpringVelocity:0.2 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 

    NSLog(@"PLAYLABEL BEGIN X %f", self.playLabel.frame.origin.x); 

    self.playLabel.transform = CGAffineTransformMakeTranslation(-10, 0); 
    self.playLabel.transform = CGAffineTransformMakeTranslation(+20, 0); 
    self.playLabel.transform = CGAffineTransformMakeTranslation(-10, 0); 

} completion:^(BOOL finished) { 

    NSLog(@"PLAYLABEL DONE X %f", self.playLabel.frame.origin.x); 

}]; 

動畫前標籤的origin.x爲119.500000,完成時origin.x爲109.500000。我錯了譯文如何應用?如果我從原點變換-10,然後從其當前位置變換+20,那麼標籤應該只有原點的+10。因此,-10應該導致label.x成爲它原來的位置。

回答

1

CGAffineTransformMake創建轉換矩陣。看起來你認爲你創建的3個矩陣是按順序應用的。但是,您將覆蓋矩陣兩次。當調用動畫持續時間時,它應用self.playlabel.transform,這等於您上次設置它的時間:CGAffineTransformMakeTranslation(-10, 0);

+0

我明白你在說什麼。但是,動畫的工作方式與我想要的完全相同(從左向右擺動)。標籤向左移動10,向右移動20,但從原點結束-10。有什麼更好的方法來完成這件事? – Brosef 2014-11-02 19:14:46

+0

我寧願使用uibezierpath:http://stackoverflow.com/questions/4538279/moving-an-object-along-a-curve-in-iphone-development你可以使用這段代碼,但只是改變視圖和點。 – 2014-11-02 19:20:17

+0

使用貝塞爾路徑,它是一個更好的解決方案。但如果你想要playlabel結束它的原始位置,將其轉​​換爲cgaffinetransformidentity – Nick 2014-11-02 19:25:10