同时动画多个UIViews

时间:2013-01-18 15:02:58

标签: ios animation uiview

我有三个UIButton个对象可视地堆叠在一起。当用户点击按钮时,下面的按钮应向下移动一定距离。我正在使用以下动画块:

// 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,按钮不会保持在一起,但它们会以不同的时间间隔开始移动。我已尝试使用Core Animation方法,通过分组动画和其他内容,但尚未找到任何解决方案。

你有什么想法吗?现在我将持续时间保持在0.25,直到我拿出一些东西。

1 个答案:

答案 0 :(得分:7)

一种解决方案是将button2和button3设置为另一个UIView中的子视图,并分别为每个按钮设置动画,而不是每个按钮。这是否是一种好的方法取决于您使用堆叠按钮尝试完成的任务。

编辑:

由于我的经验是块内的动画是同步的,我实现了如下所示的代码。我为动画持续时间(0.15,0.25,0.75,1.25)尝试了很多值,而button2和button3正在同步移动(因为button2位于button3的顶部,我实际上根本看不到button3,直到我点击button2 ,这会导致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...");
}