当我想顺时针走时,为什么我的旋转只能逆时针旋转?
[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 }
- 为什么当我为我的CABasicAnimation设置一个较低的持续时间值时,它会跳转吗?
- drawViewHierarchyInRect:afterScreenUpdates:延迟其他animation
- 无限旋转UIView,直到调用停止方法,并将视图animation回到起始点
- 在UIImageView中向上和向下移动UIImage(像hover)循环
- 在iOS6中控制MKMapView的animation速度
- iOS – animation效果 – 图像popup
- 使用90%CPU的UIViewanimation
- iOS中非常自定义的UIButtonanimation
- 如何获得项目的坐标,而它是animation?