iOS核心动画:旋转的锚点不正确

时间:2011-11-15 21:59:31

标签: ios uiview core-animation

我想在iOS中实现基本旋转动画,其中视图围绕其中心点连续旋转。

但是,由于某种原因,旋转的锚点始终是父视图的原点,而不是旋转视图的中心。
因此,即使我手动设置锚点,视图也会围绕屏幕的左上角旋转。

这就是我正在做的事情:

// Add shape layer to view
CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];
CGRect shapeRect = CGRectMake(0, 0, 100, 100);
UIBezierPath *roundedRect = [UIBezierPath bezierPathWithRoundedRect:shapeRect cornerRadius:5];
shapeLayer.path = roundedRect.CGPath;
shapeLayer.anchorPoint = CGPointMake(0.5, 0.5);
shapeLayer.fillColor = [[UIColor redColor] CGColor];

[self.view.layer addSublayer:shapeLayer];

// Set rotation animation
CATransform3D rotationTransform = CATransform3DMakeRotation(M_PI, 0, 0, 1);
CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
rotationAnimation.toValue = [NSValue valueWithCATransform3D:rotationTransform];
rotationAnimation.duration = 1.0f;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = HUGE_VALF;

[shapeLayer addAnimation:rotationAnimation forKey:@"transform"];

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:15)

路径不定义图层的边界。因此,您的图层具有CGRectZero边界。您的路径从相对于边界的CGPointZero开始。图层围绕其中心旋转,也是CGPointZero ...

所以,我看到了几个选项:

layer.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(-50, -50,
                                                                100, 100)
                                        cornerRadius:5].CGPath;

或者:

layer.bounds = CGPathGetBoundingBox(layer.path);

答案 1 :(得分:3)

我也遇到了同样的问题。即使在手动设置为(0.5,0.5)之后,缩放和旋转似乎也在使用左上角的anchorPoint。我通过手动将图层的框架或边界属性设置为与路径大小相同来修复我的代码。

答案 2 :(得分:0)

您可以使用UIView方法而不是图层方法。它们默认围绕中心旋转。

[UIView beginAnimations];
self.view.transform = CGAffineTransformMakeRotation(M_PI);
[UIView commitAnimations];

答案 3 :(得分:0)

以下是在不使用anchorPoint的情况下围绕特定点旋转的方法。我不确定anchorPoint应该为旋转动画做什么,但它似乎没有做你想要的。

“First”翻译,因此您的旋转中心位于原点。因此,请向左和向上应用翻译。

然后旋转。

然后转换回所需的位置。所以正确地应用翻译。

您可以通过连接矩阵同时执行这些操作。它们的顺序相反。从左到右:右/下翻译,旋转,左/上翻译。