2012-04-28 106 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 2012-05-01 15:13:24

+0

setCompletionHandler適用於OS X 1.7及更高版本。 – RocketMan 2012-07-25 17:14:27

+1

請記住,即使動畫被「取消」,也會調用「setCompletionHandler」,即如果您有另一個事件觸發另一個調用動畫blob的方法,並且在其setCompletionHandler中,您將自動調用setApletionHandler [self.view addSubview self .blob],您可能最終會將您的應用掛在SpinLock上,或者您可能會收到不良結果,例如刪除視圖,即使您剛添加它。這是因爲應用程序可以暫停mainThread,優先考慮另一個調度呼叫,並且按順序調用兩個「取消塊」。 – strange 2013-09-12 19:53:38

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]; 
    });