【问题标题】:Animating multiple UIViews simultaneously同时为多个 UIView 设置动画
【发布时间】:2013-01-18 15:02:57
【问题描述】:

我有三个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,直到我想出一些东西。

【问题讨论】:

  • 就像一个注释一样,在 0.25 时,它们很可能也以不同的速率移动,只是由于速度的原因并不明显。链接动画的最具体解决方案是使用@bobnoble 的解决方案。 UIView 动画默认情况下只对原始图像进行动画处理,因此可以确保它们保持在一起。
  • @RyanPoolos 当然,你是对的。在我找到更好的解决方案之前,没有注意到效果就足够了:)

标签: ios animation uiview


【解决方案1】:

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

编辑:

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

【讨论】:

  • 我已经想到了,但是如果明天按钮数量增加,这个解决方案就不是“可扩展的”。
  • @elitalon 为什么不呢?您的按钮已经是视图的子视图,只需将它们分组到另一个视图中。我不明白为什么你在扩展这个时会遇到麻烦。事实上,它似乎更具可扩展性,因为您的动画代码只需要为一个视图设置动画。除非我误解了你的要求..
  • @Nebs 请注意,如果我有 5 个按钮,我必须将 2、3、4 和 5 分组到子视图中。但是,如果我点击按钮 2,我必须在另一个子视图中对 3、4 和 5 进行分组。这是一种递归分组...
  • @elitalon - 您使用的UIButtons 有什么“特别”之处吗?它们是带有图像等的自定义按钮,还是???
  • @bobnoble 是的,他们将UIImageView 添加为带有自定义图标的子视图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多