使用CGAffineTransform旋转UIView - 如何使其成为完整路径而不是短路径?

Dvo*_*ole 6 objective-c ios

我正在制作一个速度计应用程序,我希望箭头表现正确 - 如果我在一秒钟内从0到200公里发射,我希望它绕过条形图,但是如果我将旋转角度设置得足够大,那么短道,从底部.
如何让它几乎完整的圆圈而不是通过短路径?

这是我用于轮换的(普通)代码:

[UIView animateWithDuration:0.3 animations:^(){

        self.arrow.transform = CGAffineTransformRotate(CGAffineTransformIdentity, -4.4);

    }];
Run Code Online (Sandbox Code Playgroud)

我想我可以用小块旋转它,但有时可能需要将它从零快速旋转到最大值(例如,如果我们没有读取速度并且已经高速运行它,所以我们需要旋转箭头的大部分屏幕).

作为一个附带问题 - 如何对动画进行排队,以便我可以逐个应用它们?

Pau*_*nne 3

不久前我也遇到过类似的问题。我只需要旋转 180 度,但有时需要顺时针,有时需要逆时针,但我总是在两者之间来回翻转,因此代码中出现了“旋转”属性。

您需要使用 CALayer 和 CAKeyframeAnimations,这是对我有用的代码:

-(void) showHideSpinnerWithDuration:(float) duration;
{
    CALayer* layer = _spinner.layer;
    CAKeyframeAnimation* animation;
    animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

    animation.duration = duration;
    animation.cumulative = YES;
    animation.repeatCount = 1;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;

    if (_rotated) {
        animation.values = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:DegreesToRadians(180)],
                            [NSNumber numberWithFloat:DegreesToRadians(0)],
                            nil];
        self.rotated = NO;
    } else {
        animation.values = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:DegreesToRadians(0)],
                            [NSNumber numberWithFloat:DegreesToRadians(180)],
                            nil];
        self.rotated = YES;
    }

    animation.keyTimes = [NSArray arrayWithObjects:
                          [NSNumber numberWithFloat:0.0],
                          [NSNumber numberWithFloat:duration], nil];

    animation.timingFunctions = [NSArray arrayWithObjects:
                                 [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],
                                 [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut], nil];

    [layer addAnimation:animation forKey:@"transform.rotation.z"];
}
Run Code Online (Sandbox Code Playgroud)