2012-06-04 5 views
4

:iOS에서 이미 애니메이션이 재생되는 동안보기 애니메이션이 시작되면 어떻게됩니까? 도면은 주 화면을 탭의 제스처 인식기에 의해 애니메이션

-(void) doAnimate { 
    [UIView animateWithDuration:3 

        animations:^{ 
         self.circleView.center = CGPointMake(100, 300); 
        } 

        completion:^(BOOL finished) { 
         NSLog(@"finished is %i", finished); 
         [UIView animateWithDuration:1 animations:^{ 
          self.circleView.center = CGPointMake(250, 300); 
         }]; 
        } 
    ]; 
} 

(체인이되는 애니메이션). 애니메이션을 적용하고 기본 뷰를 다시 탭하면 실제로는 두 번 호출되는 완료 핸들러 (처음에는 TRUE, 두 번째는 FALSE)가 표시됩니다. 거짓이라면 한 번만 부름 받았다고 생각 했나요? Apple's doc에서 찾을 수 없습니다. 이미 애니메이션이 적용될 때 애니메이션이 시작되면 어떻게 작동하는지에 대한 규칙이 있습니까? (나는 그것이 다시 애니메이션되는 동일한 뷰이며, 뷰 1은 애니메이션 동안 뷰 2가 움직이는 경우에는 적용되지 않습니다 적용 할 생각?)


업데이트 : 더 통찰력을 보여줄 수있는 다음 코드를

-(void) dropAnimate:(UIGestureRecognizer *) g { 

    int n = arc4random() % 10000; 
    int y = 501 + arc4random() % 200; 
    NSLog(@"y is %i", y); 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, y, 10, 10)]; 
    label.text = @"x"; 
    [self.view addSubview:label]; 

    [UIView animateWithDuration:3 

        animations:^{ 
         NSLog(@"n is %i", n); 
         self.circleView.center = CGPointMake(100, y); 
        } 
        completion:^(BOOL finished) { 
         NSLog(@"n is %i", n); 
         NSLog(@"finished is %i y is %i", finished, y); 
         [UIView animateWithDuration:3 animations:^{ 
          self.circleView.center = CGPointMake(250, y); 
         } 
          ]; 

        } 

    ]; 
    NSLog(@"finished the method call"); 

} 

아래의 @ Kai의 답변 외에도 이미 진행중인 애니메이션이있는 경우 동일한 UIView 개체에 대한 새로운 애니메이션 규칙이있는 것으로 보입니다. 이전 애니메이션의 효과가 즉시 끝나고 새 애니메이션 가 실행되면 다음으로 이전 애니메이션의 completion이와 함께 호출됩니다.3210이고 이제는 세 번째 애니메이션이 시작되어 애니메이션 2가 효과를 끝내지만 NO과 함께 completion 블록이 호출되고 애니메이션 3이 즉시 적용됩니다. 애니메이션 4는 다음과 같이 실행됩니다. 3 초.

위의 샘플 코드를 시도해 볼 수 있습니다 ... 그리고 간단하게하기 위해 completion 블록을 제거한 다음 시도해보고 다음과 같은 규칙을 확인합니다. 동일한 객체에서 새 애니메이션을 시작하면,

그리고 completion 블록이 또 다른 애니메이션을 시작하면 completion 블록, 꽤 복잡 할 수

...

그래서 나는 생각 ... 오래된 애니메이션이 즉시 적용, 새로운 애니메이션이 실행됩니다 마침내 것은 : 모든 문서 또는 사양이 동작을 지정합니까?

+0

UIView의 apple doc에서 이상하게 보임 animateWithDuration : 애니메이션 : 완료 : 읽을 수 있음 : 애니메이션을 실행하는 동안 애니메이션이 재생되는 동안 사용자 상호 작용이 일시적으로 사용 중지됩니다. (iOS 5 이전에는 전체 애플리케이션에서 사용자 상호 작용이 사용 중지되었습니다.) – meronix

+1

@meronix @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) –

+0

@kay : 미안하지만, 당신 말이 맞아요, 그가 "메인 뷰"를 탭핑했다고 썼다는 것을 깨닫지 못했습니다 ... 전혀 신비가 없습니다. – meronix

답변

1

나는 무슨 일하면 다음과 같은 생각 :

첫 번째 트리거가 (100,300)center를 설정하고 이상이 뷰 애니메이션 (주 당신이 실제로 그것을 참조하기 전에 center property 변경!). 두 번째 트리거는 즉각적으로 반환됩니다 (으로 completion 호출). 애니메이션을 적용 할 항목이 없으므로 (속성은 이미 이전과 동일한 값으로 설정되어 있음) center을 재설정하고 첫 번째 애니메이션 (여전히 실행 중)을 NO로 중지하도록합니다 (circleviewcenter property은 변경되지 않았기 때문에 circleviewcenter이됩니다. 두 번째 트리거는 completion을 호출하기 전에 첫 번째 애니메이션을 방해하지 않습니다).

+0

메인 뷰에서 탭하지 않으면 그럴 것입니다. 3 초 동안 애니메이트 한 다음, TRUE에 대한 NSLog 문을 출력하십시오. 항상 TRUE로 즉시 출력한다는 말입니까? –

+1

주 뷰에서 탭을 사용하여 애니메이션을 트리거하는 경우 코드에서 중심 값을 설정 한 다음 체인 된 애니메이션의 첫 번째 부분 (3 초)을 시작합니다. 애니메이션 중에 아무 것도 나타나지 않으면 (다른 스레드가 원보기를 변경하지 않음을 의미) 애니메이션이 완전히 실행 되었기 때문에 3 초 후에 TRUE를 인쇄합니다. 그러나 애니메이션 중에 원형 뷰가 변경되면 FALSE로 완료가 호출됩니다. 또한 애니메이션 블록에서 뷰의 내용을 실제로 변경하지 않으면 완성 블록이 TRUE로 즉시 호출됩니다. 애니메이션을 적용 할 것이 없기 때문입니다. 결합하면 .... –

+1

... 3 초 이내에 애니메이션을 두 번 트리거하면 정확히 어떻게되는지 알 수 있습니다. 첫 번째 트리거는 FALSE로 완료 블록을 호출합니다. _ 두 번째 트리거는 TRUE로 호출합니다. –

관련 문제