当我想顺时针走时,为什么我的旋转只能逆时针旋转?

[CATransaction begin]; [CATransaction setAnimationDuration:5]; CGAffineTransform currentTransform = squareLayer.affineTransform; CGFloat angle = M_PI; squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, angle); [CATransaction commit]; 

 [CATransaction begin]; [CATransaction setAnimationDuration:5]; CGAffineTransform currentTransform = squareLayer.affineTransform; CGFloat angle = (M_PI * -1); squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, angle); [CATransaction commit]; 

我会以为-1会扭转方向,但显然不是?

angular度是一样的。 要走完整圈你需要2 * Pi,所以半个圈就是Pi。 如果你采取-Pi它将在同一点结束。

编辑:如果你需要使它顺时针转动,你可以稍微离开-Pi。 例如,而不是-M_PI使用-3.141593。

刚刚碰到这个,而@激进分子的解决scheme工作正常,我宁愿调整起始angular度之前旋转与旋转angular度小于所需的终点。 此外,您可以使用animation块为CALayer变换制作animation效果。

我的代码:

 // iOS will rotate the shortest distance to the end angle, // using counter-clockwise if equal. // Force the rotation to open clockwise and close counter-clockwise by bumping // the initial angle CGFloat startRadians, endRadians; if (isOpening) { startRadians = 0.01f; endRadians = M_PI; } else { startRadians = M_PI - 0.01f; endRadians = 0.0f; } self.myImageView.layer.affineTransform = CGAffineTransformMakeRotation(startRadians); [UIView animateWithDuration:0.3f animations:^{ self.myImageView.layer.affineTransform = CGAffineTransformMakeRotation(endRadians); }]; 

我与核心animatinon的经验不符合苹果报价。 我发现唯一重要的是最终的angular度值。 正pi和负pi旋转导致相同的变换matrix,所以系统不pipe反钟钟。

我已经做了一个特定的方向旋转或完整的360度旋转,是使用transform.rotation.ztypes创build一个明确的CABasicAnimation,填充模式设置为kCAFillModeForwards,只提供一个toValue 。 这会导致animation从以前的值开始。 然后,您可以设置一个旋转,这个旋转是所需的总旋转的一小部分,然后重复计数。

例如,下面的代码会创build一个旋转5圈或450度的animation。 如果您想顺时针旋转180度,则可以重复计数为2来旋转π/ 2。对于逆时针,使用重复计数为2的-pi / 2。

  CABasicAnimation* rotate = [CABasicAnimation animationWithKeyPath: @"transform.rotation.z"]; rotate.removedOnCompletion = FALSE; rotate.fillMode = kCAFillModeForwards; //Do a series of 5 quarter turns for a total of a 1.25 turns //(2PI is a full turn, so pi/2 is a quarter turn) [rotate setToValue: [NSNumber numberWithFloat: -M_PI / 2]]; rotate.repeatCount = 5; rotate.duration = duration/rotate.repeatCount * 2 ; rotate.beginTime = start; rotate.cumulative = TRUE; rotate.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 

看看这个前面的问题: 为UIImageView的CABasicAnimation强制顺时针/逆时针旋转代码有点不同,但它确实有效。

以下是苹果文档中的一段引文:“在iOS中,正值指定逆时针旋转,负值指定顺时针旋转。 你有没有试过这样做:

 squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, -M_PI); 

那就是过去我所做的顺时针旋转。

编辑:而不是-M_PI使用-3 * M_PI,为逆时针

并删除相反方向的“ – ”符号。

同意Duncan和XJones。 最终的价值是所有似乎重要的。 CA会find最短的path。

使用XJones的想法。 这似乎适用于我:

 private let angleRadians = CGFloat(M_PI) private let angleRadiansOffset = CGFloat(0.1 * M_PI/180.0) let turnAngle = angleRadians - angleRadiansOffset; //pre-rotate by an 'invisible amount', to force rotation in the same direction every time primView.layer.transform = CATransform3DRotate(primView.layer.transform, angleRadiansOffset, 0.0, 1.0, 0.0) UIView.animateKeyframesWithDuration(duration, delay: 0, options: [.BeginFromCurrentState], animations: { () -> Void in UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 0.8, animations: { () -> Void in //now we will complete the rotation to the correct end value primView.layer.transform = CATransform3DRotate(primView.layer.transform, turnAngle, 0.0, 1.0, 0.0) }) //... other code .... }) { (finished) -> Void in }