Вращение всегда начинается с исходного положения - PullRequest
1 голос
/ 22 октября 2009

Я пытаюсь реализовать функциональность типа колеса. Я вычисляю центральную точку вида и нахожу угол, созданный при перемещении в методе 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"];
    }
}

1 Ответ

8 голосов
/ 22 октября 2009

Анимация, которую вы выполняете, которая выглядит как нарисованная из этого ответа , имеет указанные значения как to, так и from, поэтому она будет просто поворачиваться от 0 до угловых радиан каждый раз. Это означает, что ваше изображение будет возвращаться к началу каждой анимации.

Обычно, если вы удалите строку fromValue, ваша анимация должна перейти от текущего угла к новому, но похоже, что свойство transform ведет себя немного по-другому. Вам необходимо установить значение 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];

Обратите внимание, что я удалил преобразование градусов в радианы в toValue, потому что ваши вычисления acos () возвращают значения в радианах.

EDIT (23.10.2009): Исправлено мое предыдущее предположение о функционировании fromValue со свойством transform.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...