我想制作几个视图的动画,这些视图本质上是正方形,先变大然后再回到原始大小。视图的数量可以变化,并按顺序进行动画处理,其中一个视图动画恰好在其前一个视图完成之前开始。我尝试了以下方法:

for (int i = 0; i < length; i++) {
    SView *view = _row[i];

    view.widthConstraint.constant *= 1.1;
    view.heightConstraint.constant *= 1.1;

    [UIView animateWithDuration:1
                          delay:1 * i
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                       [self.view layoutIfNeeded];
                     }
                     completion:^(BOOL finished) {
                       view.widthConstraint.constant /= 1.1;
                       view.heightConstraint.constant /= 1.1;

                       [UIView animateWithDuration:.1
                                             delay:0
                                           options:UIViewAnimationOptionCurveEaseInOut
                                        animations:^{
                                          [self.view layoutIfNeeded];
                                        } completion:^(BOOL finished) {
                                        }];
                     }];
  }
}

如果这是合理的话,最终将变得非常不稳定且“闪烁”,并且没有我所期望的那样。知道如何完成此顺序动画并仍然使其非常流畅吗?

最佳答案

正确的的方式是使用关键帧。它使代码更简洁。这些要使用的UIView方法是:

animateKeyframesWithDuration:delay:options:animations:completion:
addKeyframeWithRelativeStartTime:relativeDuration:动画

简单的例子
这是一个有关如何使用它的简单示例:

[UIView animateKeyframesWithDuration:0.25
                               delay:0
                             options: UIViewKeyframeAnimationOptionBeginFromCurrentState
                          animations:^{
                              [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:0.7 animations:^{
                                  avatarView.transform = CGAffineTransformMakeScale(0.9, 0.9);
                              }];
                              [UIView addKeyframeWithRelativeStartTime:0.7 relativeDuration:0.3 animations:^{
                                  avatarView.transform = CGAffineTransformIdentity;
                              }];
                          } completion:nil];
这个想法是,您要定义一个总持续时间,然后分解每个动画要花费的时间以及相对于整个动画要延迟的时间。
循环示例
如果您有多个需要设定关键帧的视图,则实际上可以在动画块中有一个循环。这允许灵活和动态的代码。这是一个example project和一些代码:
[UIView animateKeyframesWithDuration:1.0
                               delay:0
                             options: UIViewKeyframeAnimationOptionBeginFromCurrentState
                          animations:^{
                              for (int i = 0; i < numberOfViews; i++) {
                                  [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:(duration / numberOfViews) animations:^{
                                      ... animate view ...
                                  }];
                              }
                          } completion:nil];

关于ios - 对多个 View 进行动画处理,其中一个 View 在另一个 View 结束之前开始,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27608957/

10-12 12:53
查看更多