Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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_Swift_Animation - Fatal编程技术网

Ios 如何向队列动态添加动画

Ios 如何向队列动态添加动画,ios,swift,animation,Ios,Swift,Animation,我有以下情况:我有一个圆形视图对象,例如,我每1秒获得一个新点。我为从uiview的当前位置到新点的移动设置动画,动画持续时间取决于距离,因此动画持续时间可能为500毫秒或超过3秒。所以请考虑下面的手绘图(通过iPad抱歉)图表: 在案例“A”中,如果我在同一方向上有点,我在动画序列中没有问题 但如果是“B”,那就是我的问题;如果我设置了从点3到点4的圆的动画,需要5秒,1秒后我接收到点5,新的动画从点4到点5开始,生成的动画类似于红线 我需要一种方法来添加动画,如队列,并搜索了很多没有结果

我有以下情况:我有一个圆形视图对象,例如,我每1秒获得一个新点。我为从uiview的当前位置到新点的移动设置动画,动画持续时间取决于距离,因此动画持续时间可能为500毫秒或超过3秒。所以请考虑下面的手绘图(通过iPad抱歉)图表:

在案例“A”中,如果我在同一方向上有点,我在动画序列中没有问题

但如果是“B”,那就是我的问题;如果我设置了从点3到点4的圆的动画,需要5秒,1秒后我接收到点5,新的动画从点4到点5开始,生成的动画类似于红线

我需要一种方法来添加动画,如队列,并搜索了很多没有结果

我目前的做法如下:

var animationPoints = [CGPoint]()
var isAnimating = false

func animate(nextPoint) {

    animationPoints.append(nextPoint)

    if !isAnimating {
        isAnimating = true

        let p = animationPoints.first
        animationPoints.removeFirst

        UIView.animate ({ completed in

            isAnimating = false

            if animationPoints.count > 0 {
                animate(animationPoints.first)
            }
        })

    }
}

但是它不能正常工作,它跳过了几个点,减慢了动画速度。我能够通过使用UIViewPropertyImator对象队列来实现您的要求,每个对象都通过上一个对象的完成处理程序链接到上一个对象,就像您的伪代码中建议的那样。我这样做的原因是,可以随时向UIViewPropertyAnimator对象添加完成处理程序,包括在动画师开始制作动画之后

为了进行测试,我人为地安排了一系列实时到达的点:

var points = [
    CGPoint(x: 60, y: 50),
    CGPoint(x: 100, y: 50),
    CGPoint(x: 150, y: 50),
    CGPoint(x: 150, y: 100),
    CGPoint(x: 250, y: 100)
]
@IBAction func doButton(_ sender: Any) {
    func nextPoint() {
        self.animateToPoint(points.removeFirst())
        if !points.isEmpty {
            delay(0.25) {
                nextPoint()
            }
        }
    }
    nextPoint()
}
每次点到达时(即每次调用
self.animateToPoint
),我都会创建一个新的UIViewPropertyAnimator,并将以前的UIViewPropertyAnimator的
completionHandler
设置为在新的UIViewPropertyAnimator上调用
startAnimating()
。因此,当动画正在进行时,链将实时扩展

根据您的要求,每个动画的
持续时间
是根据我们必须到达下一点的距离计算的,因此速率是恒定的。我故意选择了一个缓慢的恒定速率来让行为变得清晰

结果是,即使动画在除第一个点之外的所有点到达时已经在进行,我们也会以恒定的速率通过所有点。为了澄清发生了什么,我让每个完成处理程序也将视图闪烁为红色,这样您就知道下一个动画何时开始。因此,我们清楚地看到,每一个动画都是在前一个动画的目标点到达时开始的——我想,这就是你说的你想要做的


如何调用animate()方法,是否使用for循环当我获得新点时调用该方法,但如果该方法已在动画中,则我在Uiview中调用它。animate completion handler这是完整的动画代码吗?看起来很奇怪,因为你没有控制标志
isAnimating
也没有显示动画参数让我们复制。哦,我忘了将isAnimating标志控件添加到相关代码中,请检查编辑。Animate param是CGPoint类型,尽管它是半伪代码。您的伪代码似乎是正确的方法。如果您想帮助调试,您需要发布真实代码。问题是我事先不知道要点,所以我需要通过增强逻辑本身使动画动态平滑。