2012-04-28 3 views
1

왜 그렇게 어려운지 알 수는 없지만 기본적으로 NSView를 내 화면에 애니메이션으로 적용하고 애니메이션이 완료되면 해당 NSView를 제거합니다. 그러나 나는 이것을하는 방법에 대한 절대적인 언급을 찾을 수없는 것으로 보인다. 누군가 제발 도와 줄 수 있니? 나는이NSView 애니메이션 후 제거

NSRect frame = blob.frame; 
frame.origin.x = animationStopX; 
[NSAnimationContext beginGrouping]; 
[[NSAnimationContext currentContext] setDuration:timeToDisappear]; 
[[blob animator] setFrame:frame]; 
[NSAnimationContext endGrouping]; 

처럼 내 애니메이션을 시작하고

나는이 완료 또는 아무것도 일단이에서 콜백을 얻는 방법이 없습니다.

답변

7

바로 beginGrouping 문 다음에,이 추가

[[NSAnimationContext currentContext] setCompletionHandler:^{ 
     [self.blob removeFromSuperview]; 
    }]; 

setCompletionHandler:NSAnimationContext 클래스의 방법이다.

경우
+0

아 남자 . 나는 막 분석하고 일부 속성을 확인한 별도의 실행 루프를 작성하게되었습니다. 특정 조건이 충족되면 오브젝트가 제거됩니다. 나는 이런 식으로하려고 할 때 다음에 염두에 두겠다. – MZimmerman6

+0

setCompletionHandler는 OS X 1.7 이상에서 사용할 수 있습니다. – RocketMan

+1

애니메이션이 '취소됨'인 경우에도 'setCompletionHandler'가 호출됩니다. 즉, 애니메이션 'blob'및 'setCompletionHandler'메소드에 대한 다른 호출을 발생시키는 이벤트가있는 경우 [self.view addSubview self .blob]을 사용하면 SpinLock에서 앱을 걸거나, 방금 추가 한 경우에도보기 제거와 같은 바람직하지 않은 결과를 초래할 수 있습니다. 앱이 mainThread를 일시 중지하고 다른 디스패치 호출에 우선 순위를 부여하고 두 개의 '취소 블록'을 잘못 호출 할 수 있기 때문입니다. – strange

1

10.6 이하 (따라서 NSAnimationContext의 completionHandler)이 접근 방식은 단지 블록을 사용하고 10.6 이상에서 작동합니다 옵션을 선택하지 않습니다 :이 며칠 전에 본 것 내가 원하는

double delayInSeconds = 1.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [mySubView removeFromSuperview]; 
    }); 
관련 문제