2014-11-02 48 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