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

我想在iOS中实现一个基本的旋转animation,在这个animation中,视图在中心点不断旋转。

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

这是我正在做的事情:

// 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"]; 

任何帮助,将不胜感激。

path不定义图层的边界。 所以,你的图层有CGRectZero界限。 你的path从CGPointZero开始,相对于边界。 该图层围绕其中心旋转,这也是CGPointZero

所以,我看到几个选项:

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

要么:

 layer.bounds = CGPathGetBoundingBox(layer.path); 

我也遇到了同样的问题。 即使将其手动设置为(0.5,0.5),缩放和旋转似乎也使用左上angular的anchorPoint。 我通过手动设置图层的框架或边界属性使其具有与您的path相同的大小,将其固定在我的代码上。

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

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

这里是你如何绕一个特定的点旋转,而不使用anchorPoint。 我不确定什么anchorPoint应该为旋转animation做,但它似乎并没有做你想做的。

“第一”翻译,所以你的旋转中心在原点。 因此,应用一个翻译左和上。

然后旋转。

然后转回到所需的位置。 所以申请一个翻译权。

你通过连接matrix同时做这些事情。 他们相反的顺序。 从左到右:右/下翻译,旋转,左/上翻译。