旋转始终从原始位置开始

dia*_*ana 1 iphone core-animation

我正在尝试实现轮式功能.我计算视图的中心点,并找到在touchesMoved:方法中移动时创建的角度.对于第一步,它旋转了一定程度.但是对于下一步移动它会回到视图的原始位置然后旋转.实际上我希望从前一轮的终点开始旋转.什么事都缺了?有任何帮助

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    float a, b,c;   

    UITouch *aTouch = [touches anyObject];
    if ([aTouch view] == dialView) {

        CGPoint loc = [aTouch locationInView:dialView];
        CGPoint prevloc = [aTouch previousLocationInView:dialView];

        c = [self GetSides:prevloc point2:loc]; 
        a = [self GetSides:loc point2:cntrePoint];
        b = [self GetSides:prevloc point2:cntrePoint];

        float angle = acos((a*a+b*b-c*c)/(2*a*b));// Calculating angle created on moving

        CABasicAnimation  *rotate ;
        rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
        rotate.fromValue = [NSNumber numberWithFloat:0];
        rotate.toValue = [NSNumber numberWithFloat:((angle*M_PI)/180)];
        rotate.autoreverses = NO;
        rotate.fillMode = kCAFillModeForwards;
        rotate.duration = 1;
        rotate.repeatCount = 1;
        rotate.removedOnCompletion = NO;
        rotate.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];

        [dialView.layer addAnimation:rotate forKey:@"360"];
    }
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*son 8

您正在执行的动画(看起来是从此答案中绘制的)同时指定了to和from值,因此每次都会从0旋转到角度弧度.这意味着您的图像将在每个动画上跳回到开头.

通常,如果要删除fromValue行,则动画应从当前角度转到新角度,但看起来转换属性的行为略有不同.您需要将fromValue设置为从图层的presentationLayer中提取的旋转变换的当前值.以下代码应从当前角度旋转到目标角度:

CABasicAnimation  *rotate;
rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotate.fromValue = [[dialView.layer presentationLayer] valueForKeyPath:@"transform.rotation.z"];
rotate.toValue = [NSNumber numberWithFloat:angle];
rotate.fillMode = kCAFillModeForwards;
rotate.duration = 1;
rotate.removedOnCompletion = NO;
rotate.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
Run Code Online (Sandbox Code Playgroud)

请注意,我已经删除了toValue中的度数到弧度的转换,因为你的acos()计算以弧度为单位返回值.

编辑(10/23/2009):纠正了我之前关于fromValue与transform属性的功能的假设.