【问题标题】:Negative angle values using CABasicAnimation使用 CABasicAnimation 的负角度值
【发布时间】:2025-10-29 08:15:02
【问题描述】:

我使用CABasicAnimation 使用以下代码连续旋转UIImageView

CABasicAnimation *fullRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
fullRotation.fromValue = [NSNumber numberWithFloat:0];
fullRotation.toValue = [NSNumber numberWithFloat:M_PI * 2];
fullRotation.duration = 6;
fullRotation.repeatCount = HUGE_VAL;
[self.myImageView.layer addAnimation:fullRotation forKey:@"360"];

动画按预期工作,但是当我记录旋转角度时,它从0 变为180,然后从-180 变为0。我希望它从0360 然后回到0

我正在使用以下代码来获取旋转角度:

CGFloat radians = [[self.myImageView valueForKeyPath:@"layer.presentationLayer.transform.rotation.z"] floatValue];

CGFloat degrees = (radians * (180 / M_PI));

NSLog(@"ROTATION = %f", radians);

【问题讨论】:

    标签: ios objective-c rotation transform cabasicanimation


    【解决方案1】:

    唯一确定的旋转角度最多只能是 360 度(或 2*π 弧度)的倍数,例如 -90 度和 270 度描述完全相同的旋转。

    [[self.myImageView valueForKeyPath:@"layer.presentationLayer.transform.rotation.z"] floatValue]
    

    给出图像视图在特定时间点的旋转,并且该旋转 可以使用 0 到 2*π 之间的角度(如您所料)或使用角度来描述 在 -π 和 π 之间(这是实际发生的情况)。

    将任意角度归一化到0 <= degrees < 360范围内 你可以做

    degrees = fmod(degrees, 360.0);
    if (degrees < 0) degrees += 360.0;
    

    【讨论】:

    • 那么...有什么办法可以让角度从 0 到 360?还是我必须手动映射负值?
    • @guardabrazo:如果你需要它在 0 .. 360 范围内,那么你应该映射:if (degrees &lt; 0) degrees += 360.0;