Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 同步执行多个动画的最佳方式_Ios_Animation_Swift3_Uiviewanimation - Fatal编程技术网

Ios 同步执行多个动画的最佳方式

Ios 同步执行多个动画的最佳方式,ios,animation,swift3,uiviewanimation,Ios,Animation,Swift3,Uiviewanimation,这将是一个“最好的方式做”的问题 我知道有多种方法可以制作序列动画,但哪种方法更好呢 假设我有3个动画,一个接一个地执行,所以下一个动画只有在前一个动画完成后才开始 我可以用UIView.animate(withCompletionBlock:)来做,所以在完成部分我调用第二个,在第二个的completionBlock上我调用第三个 这一点特别让我想:这是一种“美丽”的方式吗?在另一个系统中使用completionBlocks是否存在任何已知问题 只是一个想法。在前面的动画完成块中调用动画,可能

这将是一个“最好的方式做”的问题

我知道有多种方法可以制作序列动画,但哪种方法更好呢

假设我有3个动画,一个接一个地执行,所以下一个动画只有在前一个动画完成后才开始

我可以用
UIView.animate(withCompletionBlock:)
来做,所以在完成部分我调用第二个,在第二个的completionBlock上我调用第三个

这一点特别让我想:这是一种“美丽”的方式吗?在另一个系统中使用completionBlocks是否存在任何已知问题

只是一个想法。在前面的动画完成块中调用动画,可能会带来类似于末日金字塔的代码,如果有10个同步动画,你不觉得吗

另一种方法是使用dispatch_after,我根据上一个动画的
NSTimeInterval
调用下一个动画。在这种情况下,它可能会导致应用程序崩溃,暂停主线程以执行下一个线程,然后再次暂停它以执行第三个线程

我知道的最后一种方法是,我可以使用NSTimeInterval调用下一个动画,但这一种有点像dispatch_after选项

你认为哪种方式最好? 同步执行3个或3个以上的视觉动画(等待前一个动画完成以启动下一个动画)

我可能会在我的应用程序中经常使用它,我想用最好的方式开始它

示例

completionBlocks中的动画

DispatchQueue.main.async {
        UIView.animate(withDuration: 2.0, animations: { 
            view1.alpha = 1
        }, completion: { (_) in
            UIView.animate(withDuration: 5.0, animations: {
                view2.alpha = 1
            }, completion: { (_) in
                UIView.animate(withDuration: 2.0, animations: {
                    view3.alpha = 0
                }, completion: { (_) in
                    UIView.animate(withDuration: 2.0, animations: {
                        view4.alpha = 0
                    }, completion: { (_) in
                            print("all completed")
                    })
                })
            })
        })
    }
在以下情况下发送给您:

    let anim1_duration = 2.0
    let anim2_duration = 3.0
    let anim3_duraiton = 5.0

    UIView.animate(withDuration: anim1_duration, animations: { 
        view1.alpha = 1
    }

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.init(uptimeNanoseconds: UInt64(anim1_duration * Double(NSEC_PER_SEC)))) {
        UIView.animate(withDuration: anim2_duration, animations: { 
            view2.alpha = 1
        }
    }

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.init(uptimeNanoseconds: UInt64((anim1_duration + anim2_duration) * Double(NSEC_PER_SEC)))) {
        UIView.animate(withDuration: anim3_duration, animations: { 
            view3.alpha = 1
        }
    }

在“更好的阅读代码”方面考虑这2种动画表演方式:

  • 构建动画堆栈:

  • 使用CAKeyframeAnimation创建关键帧动画:

  • 这些选项是避免完成块,这是我喜欢的

    查看UIView的:

    对于您的具体情况,它将如下所示:

    UIView.animateKeyframes(withDuration: 20,
                            delay: 0,
                            options: [],
                            animations: {
    
                                UIView.addKeyframe(withRelativeStartTime: 0,
                                                   relativeDuration: 0.2,
                                                   animations: {
                                    view1.alpha = 1
                                })
    
                                UIView.addKeyframe(withRelativeStartTime: 0.2,
                                                   relativeDuration: 0.3,
                                                   animations: {
                                    view2.alpha = 1
                                })
    
                                UIView.addKeyframe(withRelativeStartTime: 0.5,
                                                   relativeDuration: 0.1,
                                                   animations: {
                                    view3.alpha = 0
                                })
    
                                UIView.addKeyframe(withRelativeStartTime: 0.6,
                                                   relativeDuration: 0.4,
                                                   animations: {
                                    view4.alpha = 0
                                })
    },
                            completion: nil)
    

    第二条路看起来更干净。我想知道这是最好的方法还是有更好的方法前一个动画结束时CAKeyFrameAnimation会开始吗?@IvanCantarino不会,但你可以按它的方式设置:)基本上所有动画都会同时运行,但你需要设置,以便第二个动画在第一个动画运行时是静态的。这肯定是什么我在找。谢谢
    UIView.animateKeyframes(withDuration: 20,
                            delay: 0,
                            options: [],
                            animations: {
    
                                UIView.addKeyframe(withRelativeStartTime: 0,
                                                   relativeDuration: 0.2,
                                                   animations: {
                                    view1.alpha = 1
                                })
    
                                UIView.addKeyframe(withRelativeStartTime: 0.2,
                                                   relativeDuration: 0.3,
                                                   animations: {
                                    view2.alpha = 1
                                })
    
                                UIView.addKeyframe(withRelativeStartTime: 0.5,
                                                   relativeDuration: 0.1,
                                                   animations: {
                                    view3.alpha = 0
                                })
    
                                UIView.addKeyframe(withRelativeStartTime: 0.6,
                                                   relativeDuration: 0.4,
                                                   animations: {
                                    view4.alpha = 0
                                })
    },
                            completion: nil)