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