2013-03-23 31 views
0

好吧,所以我分類UIView和視圖有一堆子視圖。這些子視圖具有動畫效果。當我推動另一個視圖控制器頂部,或應用程序進入後臺,動畫停止。我subclassed UIView。它的一些子視圖是動畫的。什麼是重新啓動這些的正確方法?

什麼是在我的子視圖中重新啓動這些動畫的正確方法。我不希望View Controller告訴View重新啓動它們,因爲我覺得View應該知道什麼時候需要重新啓動而不需要被另一個對象明確告知。

但我不能在子類UIView上使用layoutSubviews,因爲正在發生的動畫正在添加新的UIImageView。當發生這種情況時,layoutSubviews在UIView子類上被調用。所以layoutSubviews被稱爲很多,我不能用它來重新啓動動畫。

想法?

更新 - 動畫代碼看起來像這樣...但我不認爲這真的很重要。

[UIView animateWithDuration:ANIMATION_DURATION delay:0 options:UIViewAnimationOptionCurveLinear  animations:^{ 
    [subview setFrame:finalFrame]; 
} completion:^(BOOL finished) { 
    [subview removeFromSuperview]; 
}]; 
+0

你能張貼一些代碼來說明你的問題嗎?具體來說,你是如何做動畫的('+ [UIView animate ...]調用,也許?),你的'-layoutSubviews'做了什麼? – Tim 2013-03-23 00:55:12

+0

您可以通過view.superview!= nil檢查視圖是否可見,並開始動畫。 – user523234 2013-03-23 01:38:14

+0

視圖總是有一個超視圖。我想要一個優雅的方式來觸發重啓。 – perezda 2013-03-23 23:04:44

回答

0

使用NSNotificationCenter通知視圖,視圖控制器已經再次出現像這樣:

在你的UIView,添加這個在init方法:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(methodToExecuteWhenUIViewControllerComesBackUp:) name:@"Came Back" object:nil]; 

然後在你的「其他viewController「中,在您再次展示原始控制器的方法中,添加:

[[NSNotificationCenter defaultCenter] postNotificationName:@"Came Back" object:nil]; 

然後,當您將原始viewController返回時,您的UIView將被通知。爲每個要恢復的子視圖重複第一段代碼。

當任何一個子視圖被刪除(釋放)內存確保執行:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

如果不執行上面的代碼中,通知中心會盡量通知不再存在的對象,從而導致你的應用程序墜毀。

+0

我可以做這樣的事情,但我真的不想把這段代碼放在視圖控制器中。我覺得視圖應該能夠根據需要處理自己。明白我的意思了嗎? – perezda 2013-03-23 14:25:51

+0

我明白了,但UIView並不是簡單地「知道」什麼時候重新開始......這段代碼是相對輕量級的,我真的不知道爲什麼你不能插入代碼,告訴我它是否是一個特定的原因。 – virindh 2013-03-23 19:00:39

+0

是的,我可能會訴諸使用這樣的事情。我希望有一個優雅的方式。它不覺得優雅,因爲我需要在視圖上公開一個方法來重新啓動動畫並從視圖控制器中的兩個位置調用它。那麼當我在其他地方使用這個視圖時,我需要做同樣的事情。我當然可以做到,似乎有更好的辦法。 layoutSubviews幾乎可以工作......除了部分動畫添加新的子視圖,這會觸發layoutSubviews。所以我不能。哦,好吧,也許我現在就解決了,繼續前進。 – perezda 2013-03-23 23:07:28

0

不要使用UIView Animation,你最好使用Core Animation

CAAnimation它具有一個名爲removedOnCompletion屬性設置成默認YES其設置爲NOyourCAAnimation.removedOnCompletion = NO;)它會讓你的應用程序從background到​​,動畫也animated

蘋果說:

removedOnCompletion

Determines if the animation is removed from the target layer’s animations upon completion. 

@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion 
Discussion 
When YES, the animation is removed from the target layer’s animations once its active duration has passed. Defaults to YES. 

Availability 
Available in iOS 2.0 and later. 
Related Sample Code 
MoveMe 
Declared In 
CAAnimation.h 
+0

它聽起來不像removedOnCompletion會幫助我。視圖離開前景時停止動畫,而不是當它們完成時停止。雖然他們也這樣做。似乎這不會幫助我。 – perezda 2013-03-23 23:09:27

相關問題