我有 UIView,我想用旋转动画它。我也想使用自动布局。我已经看到了很多stackoverflow的常见问题,但是我没有找到任何适用的解决方案。那么,让我们从我的界面和动画代码开始吧;我有一个带有图像的 UIView,它必须被旋转。现在我有按钮,可以激活旋转。在屏幕截图中你可以看到红叉,这一定是旋转中心(现在它在图像上,但我想在旋转的 UIView 之外制作旋转中心,我知道这可以用 AnchorPoint 存档)。
这是我的旋转动画代码:
#define ROTATE_DURATION 3.0
- (IBAction)rotateArrow {
CGAffineTransform transform = self.hand.transform;
NSLog(@"layer possition before animation x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y);
[UIView animateWithDuration:ROTATE_DURATION/3 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{
self.hand.transform = CGAffineTransformRotate(transform, 2*M_PI/3) ;
[self.hand layoutIfNeeded];
NSLog(@"layer possition after animation 1 x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y);
}
completion:^(BOOL finished) {
[UIView animateWithDuration:ROTATE_DURATION/3 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{
self.hand.transform = CGAffineTransformRotate(transform, -2*M_PI/3) ;
[self.hand layoutIfNeeded];
NSLog(@"layer possition after animation 2 x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y);
}
completion:^(BOOL finished) {
[UIView animateWithDuration:ROTATE_DURATION/3 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{
self.hand.transform = CGAffineTransformRotate(transform, 0) ;
[self.hand layoutIfNeeded];
NSLog(@"layer possition after animation 3 x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y);
}
completion:^(BOOL finished) {
}];
}];
}];
}
那么,问题出在哪里:当旋转正在进行时,UIView 会改变它的center
属性layer.position
,这就是为什么我的 UIView 在动画时会“跳跃”。如果关闭自动布局,动画就可以了。我观看了 WWDC 2012 “Auto Layout by Example”,发现我会使用[self.hand layoutIfNeeded];
一切都很好,但根本不是。动画变得更流畅了,但我看到了这个“跳跃”。所以,这是我的“输出”。
动画时,UIView 向右移动,如您在图像上看到的那样,然后返回正常位置。我该如何解决这个“跳跃”?
这是一个日志:
layer possition before animation x: 160.000000; y: 99.500000
layer possition after animation 1 x: 197.349030; y: 114.309601
layer possition after animation 2 x: 197.349030; y: 114.309601
layer possition after animation 3 x: 160.000000; y: 99.500000
谢谢。