2010-04-28 9 views
2

종료 기다립니다, 나는 setAnimationDidStopSelector를 사용하여 애니메이션의 엔딩을 잡으려고. 애니메이션이 끝날 때까지 코드 실행을 일시 중단하려고합니다. 나는 이것을 시도했다. 글로벌 BOOL 변수를 설정하고, 애니메이션을 커밋하기 전에 TRUE로 설정하고 while 루프를 사용하여 애니메이션을 커밋 한 후에 커밋하십시오. setAnimationDidStopSelector에서 BOOL 변수를 FALSE로 설정하고 루프가 깨지는 동안 바란다. 하지만 불행히도 이것이 작동하지 않았고, 코드는 setAnimationDidStopSelector에 빠지지도 않았습니다 (일부 추적 출력을 통해 확인했습니다). 편집 : 해당 BOOL 변수 처리가 추가되지 않으면 코드는 처리기 메서드로 실행됩니다.아이폰 애니메이션 아이폰 응용 프로그램에서

애니메이션이 발생하는 코드는 다음과 같습니다 :

- (void)animationDidStop:(NSString*)animationID finished:(NSNumber*)finished context:(void*)context { 
    printf("abc\n"); fflush(stdout); 
    self.AnimationEnded=true; 
} 

당신은 무엇을 제안 않습니다

self.AnimationEnded=FALSE; 
[UIView beginAnimations:NULL context:NULL]; 
[UIView setAnimationDuration:2]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 
// do sth. 
[UIView commitAnimations]; 
while(![self AnimationEnded]); 

는 또한이 핸들러의 코드?

답변

-1

이 루프가 완료 될 때까지 애니메이션이 시작되지 않습니다. 이 루프는 애니메이션이 시작될 때까지 완료되지 않습니다. 당신이 애니메이션은 animationDidStop 방법에 갈 필요 후하고 싶은 무엇이든

while(![self AnimationEnded]); 

.

+0

애니메이션 블록 외부에 있더라도? –

+2

iPhone OS는 실행 루프를 목표로합니다. 자신 만의 긴밀한 루프에 앉아서 기다리는 대신 콜백을 등록하거나 타이머를 설정하고 실행 루프를 실행 시키십시오. – drawnonward

+1

바쁜 루핑은 끔찍한 접근 방식이며 UI 스레드에서 처리하는 것은 더욱 어렵습니다. –

1

당신은 당신이 애니메이션 정지시에라는 선택을 할 개체를 지정 setAnimationDelegate:를 호출해야합니다. 플래그를 FALSE로 설정하는 메서드가 애니메이션을 만드는 클래스와 동일한 클래스에 있다고 가정하면이 애니메이션은 self이됩니다. 자세한 내용은 UIView class reference을 참조하십시오.

+0

내가하지 않았다; 내 질문을 편집하고 코드를 추가했습니다 ... –

3

iOS 4에서는 애니메이션 위임자와 핸들러를 사용하는 대신 블록을 완료 블록 으로 설정할 수 있습니다. 이는 애니메이션이 끝났을 때보다 간단한 조치를 취하는 방법입니다. iOS 4 이전 버전의 기기를 지원하지 않을 경우 사용하는 것이 좋습니다.

self.animationEnded = NO; 
[UIView animateWithDuration:2 
     animations:^{ /* Do something here */ } 
     completion:^(BOOL finished){ 
      printf("abc\n"); 
      fflush(stdout); 
      self.animationEnded = YES; 
     }]; 

더의 아이폰 OS 개발자 사이트에서 +UIView animateWithDuration:animations:completion:를 참조하십시오에

귀하의 예를 변경합니다.

1

이 시도 :

__block BOOL done = NO; 
[UIView animateWithDuration:0.3 animations:^{ 
    // do something 
} completion:^(BOOL finished) { 
    done = YES; 
}]; 
// wait for animation to finish 
while (done == NO) 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; 
// animation is finished, ok to proceed