gpt4 book ai didi

ios - 在另一个动画结束时提交一个不同的动画

转载 作者:行者123 更新时间:2023-11-29 12:18:52 27 4
gpt4 key购买 nike

我正在尝试创建 UIView 动画的“波浪”效果。

我有很多层要制作动画。我目前正在使用 animateWithDuration:delay:options:animations:completion:

为它们制作动画

我将 View 显示在堆栈中,例如:

-------------------------------
| VIEW 1 |
-------------------------------
| VIEW 2 |
-------------------------------
| VIEW 3 |
-------------------------------
| VIEW 4 |
-------------------------------
| VIEW 5 |
-------------------------------
| VIEW 6 |
-------------------------------

知道这一点很重要,因为 UIView 转换不是我要追求的。

我可以轻松地为它们设置动画,并同时在前一个 View 的完成 block 中激活下一个 View 动画。所以这就是它当前的设置方式:

[UIView animateWithDuration:0.4f animations:^{ 
self.view1.alpha = 1.0;
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.4f animations:^{
self.view2.alpha = 1.0;
} completion:^(BOOL finished) {
etc...
}];
}];

我想做的不是同时激活下一个 View 动画,而是希望它在 上一个 View 动画结束时激活。所以说,在动画过程的后半段时间,开始下一个views动画,得到一个波浪效果。没有一个 UIViewAnimationOptions 符合我的标准,我也为类似的目标研究了开发者论坛,但没有结果。

我尝试过的:

我尝试过的解决方法是在动画 block 中为下一个 UIView 动画添加延迟,而不是在完成 block 中,但我觉得这不是一个健康的做法.例如:

[UIView animateWithDuration:0.4f animations:^{
//Other animations...
self.view1.alpha = 1.0f
[UIView animateWithDuration:0.4f delay:0.2f options:UIViewAnimationOptionAllowUserInteraction animations:^{
self.view2.alpha = 1.0f;
} completion:^(BOOL finished) {
//repeat..
}];
}];

如您所见,我的工作非常有效。但正如我上面所说的,它感觉一点也不健康。我错过了什么?


编辑

我不可避免地通过延迟和自动反转持续时间来使用 UIViewAnimationOptions:

NSTimeInterval duration = 3.0;
NSTimeInterval delay = 0.5f;

[UIView animateWithDuration:duration delay:0.0f options:(UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction) animations:^{
self.view1.alpha = 1.0f;
} completion:^(BOOL finished) {

}];
[UIView animateWithDuration:duration delay:delay options:(UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction) animations:^{
self.view2.alpha = 1.0f;
} completion:^(BOOL finished) {

}];
[UIView animateWithDuration:duration delay:delay*2 options:(UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction) animations:^{
self.view3.alpha = 1.0f;
} completion:^(BOOL finished) {

}];
etc...

最佳答案

您可以使用CALayer 动画代替UIView 动画来实现这一点。只需在每个 View 层上配置开始时间、持续时间和动画。这是一个快速的 Swift 示例:

for (var i, v) in enumerate(views) {
let animation = CABasicAnimation(keyPath:"opacity")
animation.toValue = 0.0
animation.duration = 0.4
animation.beginTime = CACurrentMediaTime() + 0.2 * i
v.layer.addAnimation(animation, forKey: "wave")
}

关于ios - 在另一个动画结束时提交一个不同的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31257008/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com