2013-01-18 79 views
4

我有三個UIButton物體可視地堆疊在另一個之上。當用戶點擊一個按鈕時,下面的按鈕應該向下移動一定的距離。我正在使用以下動畫塊:同時動畫多個UIViews

// Assuming button 1 was clicked... 
[UIView animateWithDuration:0.25f 
         delay:0.0f 
        options:UIViewAnimationOptionCurveLinear 
       animations:^(void) { 
        self.button2.frame = CGRectOffset(self.button2.frame, 0.0f, 20.0f); 
        self.button3.frame = CGRectOffset(self.button3.frame, 0.0f, 20.0f); 
       } 
       completion:^(BOOL finished) { NSLog(@"Finished"); }]; 

如果我增加動畫持續時間,例如從0.250.75,按鈕不會在一起,但它們開始在不同的時間間隔內移動。我嘗試過使用核心動畫方法,通過分組動畫和其他東西,但還沒有找到任何解決方案。

你有什麼想法嗎?現在我保持在0.25的持續時間,直到我拿出一些東西。

+0

正如一個註釋,在0.25他們更可能以不同的速度移動,因爲速度不明顯。獲取動畫鏈接的最具體解決方案是使用@ bobnoble的解決方案。 UIView動畫默認情況下只動畫原始圖像,以確保它們保持在一起。 –

+0

@RyanPoolos當然,你是對的。直到我找到更好的解決方案時,才注意到這種效果是足夠的:) – elitalon

回答

7

一種解決方案是將button2和button3設置爲另一個UIView中的子視圖,併爲視圖設置動畫效果,而不是分別爲每個按鈕設置動畫效果。這是否是一種好方法取決於你想用堆疊按鈕來完成什麼。

編輯:

由於我的經驗是,一個塊中的動畫是同步的,我實現了代碼,如下所示。我嘗試了很多動畫持續時間值(0.15,0.25,0.75,1.25),並且按鈕2和按鈕3同步移動(並且因爲按鈕2位於按鈕3的頂部,所以我實際上看不到按鈕3,直到我點擊按鈕2 ,這會導致button3從按鈕3下方移動)。

- (IBAction)button1Tapped:(id)sender { 
    NSLog(@"button1Tapped..."); 

    [UIView animateWithDuration:0.75f 
          delay:0.0f 
         options:UIViewAnimationOptionCurveEaseOut 
        animations:^(void) { 
         self.button2.frame = CGRectOffset(self.button2.frame, 0.0f, 20.0f); 
         self.button3.frame = CGRectOffset(self.button3.frame, 0.0f, 20.0f); 
        } 
        completion:^(BOOL finished) { NSLog(@"Finished"); }]; 
} 

- (IBAction)button2Tapped:(id)sender { 
    NSLog(@"button2Tapped..."); 

    [UIView animateWithDuration:0.75f 
          delay:0.0f 
         options:UIViewAnimationOptionCurveEaseOut 
        animations:^(void) { 
         self.button3.frame = CGRectOffset(self.button3.frame, 0.0f, 20.0f); 
        } 
        completion:^(BOOL finished) { NSLog(@"Finished"); }]; 
} 

- (IBAction)button3Tapped:(id)sender { 
    NSLog(@"button3Tapped..."); 
} 
+0

我想到了這一點,但如果明天按鈕數量增加,此解決方案不是「可擴展的」。 – elitalon

+0

@elitalon爲什麼不呢?你的按鈕已經是視圖的子視圖,只是把它們分組到另一個視圖的問題。我不明白你爲什麼會遇到問題。事實上,它看起來更具可擴展性,因爲您的動畫代碼只需要動畫一個視圖。除非我誤解了你的要求。 – nebs

+0

@Nebs請注意,如果我有5個按鈕,我必須將2,3,4和5分組到子視圖中。但是,如果我點擊按鈕2,我不得不在另一個子視圖中將3,4和5分組。這是一種遞歸分組... – elitalon