2014-02-13 6 views
0

Я хочу, чтобы выполнить бесконечную 360 градусов поворота анимации, так что я закодирован:CATransaction повернуть слой на 360 градусов странных

- (void)rotate 
{ 
    __weak typeof(self) weakSelf = self; 

    [CATransaction begin]; 
    [CATransaction setDisableActions:NO]; 
    [CATransaction setCompletionBlock:^{ 
     [weakSelf rotate]; 
    }]; 
    [CATransaction setAnimationDuration:1.0]; 
    [CATransaction setAnimationTimingFunction: 
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
    self.squareLayer.transform = CATransform3DRotate(self.squareLayer.transform, M_PI, 0, 0, 1); 
    [CATransaction commit]; 
} 

M_PI означает 180 градусов, так что я считаю, что слой может быть повернут от 0 к M_PI * 1, M_PI * 2 ...

Но оказывается, чтобы быть вращение от 0 до M_PI, затем M_PI к 0.

я могу сделать это через CABasicAnimation:

CABasicAnimation *animatin = [CABasicAnimation animationWithKeyPath:@"transform"]; 
animatin.duration = 1.0; 
animatin.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0, 0, 0, 1)]; 
animatin.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0, 0, 1)]; 
animatin.repeatCount = HUGE_VALF; 
animatin.fillMode = kCAFillModeForwards; 
[self.squareLayer addAnimation:animatin forKey:@"a"]; 

коды выше повернуть слой на 360 градусов отлично.

Но я действительно смущен о первой реализации, почему она вращается так странно?

+0

Какова реализация 'rotate'? Является ли это первой реализацией, которая называет себя снова и снова? –

+0

Да, он поворачивает M_PI своим текущим преобразованием каждый раз. – Bzmario

ответ

2

Это краевой кейс. При неявной анимации вы не можете сказать «поверните по часовой стрелке эту сумму». Вы просто говорите: «установите преобразование в это значение и оживите этот эффект». Ну, как это изменение должно быть анимировано? Время выполнения должно составить ответ, и неясно, как это сделать. Преобразование вращения по M_PI - это одно и то же «расстояние» в обоих направлениях, поэтому ответ, который он составляет, произволен. Вы можете увидеть проблему еще более четко, если вы укажете значение M_PI+0.1 против значения M_PI-0.1; вы фактически получаете обратные результаты: один продолжает вращаться по часовой стрелке, а другой вращается против часовой стрелки.

С CABasicAnimation, с другой стороны, у вас есть значение (неявное или явное) и значение, поэтому вы можете выразить понятие «увеличение» (т. Е. Положительная разность означает поворот по часовой стрелке). Еще более ясно, если вы живите, установив только byValue.

+0

Спасибо, матовый! – Bzmario

Смежные вопросы