2011-08-30 4 views
0

UISwipeGesture에 대한 응답으로 Core Animation을 사용하여 회전하는 UIView- 하위 클래스 객체에 문제가 있습니다.Core Animation 및 블록을 사용하여 UIView 객체 회전 문제

컨텍스트를 설명하려면 : 저는 CG로 그린 다이얼을 가지고 기본보기에 하위보기로 추가했습니다. 스 와이프 제스처에 대한 응답으로 어느 방향 으로든 15도 회전하도록 지시하고 있는지 여부에 따라 왼쪽 또는 오른쪽 스 와이프합니다.

한 번만 각 방향으로 회전하는 문제입니다. 후속 제스처가 인식되지만 (트리거 된 다른 동작에서 분명 함) 애니메이션이 반복되지 않습니다. 나는 한 번 왼쪽으로 갈 수 있습니다. 그러나 어느 방향 으로든 여러 번 시도하는 것은 효과가 없습니다. 여기에 관련 코드는 ... 내가 당신의 생각을 알려 주시기입니다

- (IBAction)handleLeftSwipe:(UISwipeGestureRecognizer *)sender 
{ 
    if ([control1 pointInside:[sender locationInView:control1] withEvent:nil]) 
    { 
    //updates the display value 
    testDisplay.displayValue = testDisplay.displayValue + 0.1; 
    [testDisplay setNeedsDisplay]; 

    //rotates the dial 
    [UIView animateWithDuration:0.25 animations:^{ 
     CGAffineTransform xform = CGAffineTransformMakeRotation(radians(+15)); 
     control1.transform = xform; 
     [control1 setNeedsDisplay]; 
    }]; 
} 
+0

나는 아래의 해답을 살펴볼 것이지만 더 복잡한 것은 ... UIView 다이얼에는 그림자가 있습니다. 뷰를 회전하면 그림자도 회전합니다. CTM (변환 매트릭스)의 위치를 ​​다시 15도까지 복원하고 그림자 문제를 피하기 위해 다시 그리는 방법이 필요하다고 생각하십니까? 보기의 drawRect 메소드 외부에서 CTM을 변경하는 방법을 모르겠습니다. 뷰 컨트롤러에서 뷰의 그래픽 컨텍스트를 참조 할 수 없습니다. 나는 생각한다. 나는 틀릴 수도 ... – Cocoadelica

+0

다이얼을 돌리려고하고 있지만 그림자는 회전 시키려고하지 않습니까? 그리고 다이얼과 그림자는 같은 시각에 있습니까? – Kaiser

+0

두 질문에 모두 예. 그림자가있는 다이얼 아래에 다른 뷰를 놓을 수 있으므로 그림자를 제외하고 숨겨져 있으며 우리가 논의한 카운터 방법을 사용합니다. 그저 변환 행렬을 재설정 할 방법이 없다는 것을 믿을 수 없습니다. 나는 문서를 훑어 보았지만 아무것도 볼 수 없었다. 아마 그것은 내가 받아 들여야 할 무언가 일뿐입니다. – Cocoadelica

답변

3

CGAffineTransform하는 XForms = CGAffineTransformMakeRotation (라디안 (15));

총 회전 길이를 유지합니까? CGAffineTransformMakeRotation은 부가 적 요소가 아닙니다. 가장 최근의 것만 사용됩니다. 그래서 매번 15 번이 아니라 매번 15 번으로 설정합니다.

+2

추가 : 'control1.transform' 속성을 통해 순환 읽기를 읽는 것이 매력적이지만 (예 :'CGAffineTransformRotate'를 통해 암시 적으로), 시간이 지남에 따라 반올림 오류가 누적 될 위험이 있습니다. 따라서 인스턴스 변수로 각도를 추적하고'CGAffineTransformMakeRotation'을 계속 사용하는 것이 좋습니다. – Tommy

+0

아 회전식을 트리거 할 때마다 카운터가 증가하고 15 * 카운터만큼 회전한다는 것을 의미합니까? – Cocoadelica

+0

또한 즉각적인 응답을위한 많은 많은 감사합니다 – Cocoadelica

1

다음은보기를 누적 방식으로 회전시키는 간단한 간단한 예입니다. 버튼을 누를 때마다 뷰가 180도 회전합니다.

- (IBAction) onRotateMyView: (id) sender 
    { 

    [UIView animateWithDuration:0.3 animations:^{ 
      myView.transform = CGAffineTransformMakeRotation(M_PI/2*rotationCounter); 
    } completion:^(BOOL finished){ 
     //No nothing 
    }]; 

    ++rotationCounter; 
}