2014-02-13 1 views
0

이상한 층 360도 회전하므로 I 코딩 :CATransaction는 I 무한 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_PI0에를 회전축 선 것으로 밝혀졌습니다.

나는 그것은 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을 사용하면 from 값 (암시 적 또는 명시 적)과 to 값을 가질 수 있으므로 "증가"개념을 표현할 수 있습니다. 즉, 양의 차이는 시계 방향으로 회전하는 것을 의미합니다. byValue으로 설정하면 애니메이션이 더 명확 해집니다.

+0

고마워, 매트! – Bzmario

관련 문제