2011-04-26 4 views
1

CGPathAddEllipseInRect을 사용하여 원을 그리고 CAKeyframeAnimation에서 그 원을 그립니다. 내 문제는 애니메이션이 항상 같은 지점에서 시작된다는 것입니다.CGPathAddEllipseInRect의 변형 속성

CGAffineTransform temp = CGAffineTransformMakeRotation(M_PI/2); 
CGPathAddEllipseInRect(animationPath , &temp, rect); 

나는 이것이 무엇을하고 있는지 모른다 : 나는 그것을 다른 지점에서 시작 만들기 위해 CGAffineTransform로 다음을 수행 할 수 있다고 생각했다. 그것이 실행될 때 나는 애니메이션의이 부분을 보지 못한다. 그것은 화면 밖에서 뭔가를하고 있습니다. 이것을 이해하는 데 도움이 될 것입니다.

답변

5

회전은 기본적으로 원점 (0,0) 주위에 발생,하지만 당신은 원의 중심 주위를 회전 할, 그래서 당신은 추가로 변환 할 필요가 :

기본적으로
float midX = CGRectGetMidX(rect); 
float midY = CGRectGetMidY(rect); 
CGAffineTransform t = 
    CGAffineTransformConcat(
     CGAffineTransformConcat(
      CGAffineTransformMakeTranslation(-midX, -midY), 
      CGAffineTransformMakeRotation(angle)), 
     CGAffineTransformMakeTranslation(midX, midY)); 
CGPathAddEllipseInRect(animationPath, &t, rect); 

,이 체인 세 변형 : 먼저 원을 원점 (0,0)으로 이동 한 다음 회전을 적용한 다음 원래 위치로 다시 이동합니다. 효과를 설명하기 위해 약간의 시각화를 만들었습니다. 회전을보다 쉽게하기 위해 원 대신 사각형을 선택하고 90도 대신 45도를 선택했지만 원칙은 동일합니다.

+0

위대한 답변 -하지만 당신은 그것을 좀 더 설명 할 수 있습니다. 원점을 말할 때, CGPathAddEllipseInRect를 전달하는 것은 rect의 원점이라고 가정합니다. 그러나 그러한 경우라면 여전히 화면에 표시되어야합니다. 이는 일어나지 않습니다. 그것이 화면의 원점이라면, 화면의 아래쪽 모서리에 4 분의 1 회전이 있음을 알 수 있다고 가정합니다. 내가이 중 하나를 호출 할 때 rect를 기록하면 {{633.066, 600.916}, {40, 40}}입니다. 레이어가 무작위로 배치되어 코디가 재미있어 보일 수 있습니다. – Brian

+0

또한 번역에서 코드에서 수행하는 작업을 설명 할 수 있습니까? – Brian

+0

나는 나의 대답에 몇 가지 추가적인 설명과 시각화를 추가했다. 희망이 도움이됩니다. – omz