Ios 同时设置多个UIView的动画

Ios 同时设置多个UIView的动画,ios,animation,uiview,Ios,Animation,Uiview,我有三个ui按钮对象,一个叠在另一个上面。当用户点击按钮时,下面的按钮应向下移动一定距离。我正在使用以下动画块: // Assuming button 1 was clicked... [UIView animateWithDuration:0.25f delay:0.0f options:UIViewAnimationOptionCurveLinear animations:^

我有三个
ui按钮
对象,一个叠在另一个上面。当用户点击按钮时,下面的按钮应向下移动一定距离。我正在使用以下动画块:

// 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.25
增加到
0.75
,则按钮不会保持在一起,而是开始以不同的时间间隔移动。我尝试过核心动画方法,通过分组动画和其他东西,但还没有找到任何解决方案


你有什么想法吗?现在,我将持续时间保持在
0.25
中,直到我想出一个解决方案。

一个解决方案是将button2和button3都设置为另一个
UIView
中的子视图,并设置视图动画,而不是单独设置每个按钮。这是否是一个好的方法取决于您试图用堆叠按钮实现什么

编辑:

由于我的经验是块中的动画是同步的,所以我实现了如下所示的代码。我为动画持续时间尝试了许多值(0.15、0.25、0.75、1.25),button2和button3同步移动(由于button2位于button3的顶部,我实际上根本看不到button3,直到我点击button2,这导致button3从按钮3下方移动)


值得注意的是,在0.25时,它们很可能也以不同的速率移动,只是因为速度的原因而不明显。链接动画最具体的解决方案是使用@bobnoble的解决方案。UIView动画默认情况下仅为原始图像设置动画,以确保它们保持在一起。@RyanPoolos当然,你是对的。在我找到更好的解决方案之前,没有注意到这种效果是足够的:)我已经想到了,但是如果明天按钮的数量增加,这个解决方案是不“可伸缩的”。@elitalon为什么不呢?您的按钮已经是一个视图的子视图,只需将它们分组到另一个视图中即可。我不明白为什么你在扩展这个方面会有困难。事实上,它看起来更具可伸缩性,因为动画代码只需要为一个视图设置动画。除非我误解了您的要求。@Nebs请注意,如果我有5个按钮,我必须将2、3、4和5分组到子视图中。但如果我点击按钮2,我必须在另一个子视图中分组3、4和5。这是一种递归分组…@elitalon-您使用的
ui按钮
s有什么“特殊”之处吗?它们是带有图像等的自定义按钮,还是???@bobnoble是的,它们有一个
UIImageView
添加为带有自定义图标的子视图
- (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...");
}