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

标签 ios objective-c uiviewanimation

我正在尝试创建 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/

相关文章:

iphone - 在 iOS 上,如果一个 super View 的 userInteractionEnabled 是 NO,那么所有的 subview 也会被禁用吗?

objective-c - EXC_BAD_ACCESS 内存管理问题

ios - 与 avplayeritem 的 doesNotRecognizeSelector 一起崩溃

ios - 自动布局导致无限 layoutSubviews 循环

ios - ld:-no_pie和-bitcode_bundle(Xcode设置ENABLE_BITCODE = YES)不能一起使用错误

ios - NSPredicate完全匹配

objective-c - Objective-c @ "hello"和 "hello"之间的区别?

ios - 通过保持父 View 静态来通过圆形路径移动对象 (UIButton)

ios - 自定义注释图像仅在程序开始时旋转(Swift- iOS)

ios - 如何停止函数在 Swift 3.0 中运行