Cocoa touch 删除UIView动画之间的暂停

Cocoa touch 删除UIView动画之间的暂停,cocoa-touch,core-animation,uiviewanimation,Cocoa Touch,Core Animation,Uiviewanimation,我将几个动画链接在一起,并且在删除连续动画之间的暂停时遇到问题。首先,我尝试在完成块中嵌套UIView动画。从那时起,我开始使用此解决方案: 我认为它更具可读性,但我也有同样的停顿问题 问题可能是动画计时,而不是暂停。默认情况下,动画使用“缓入”和“缓出”计时。这意味着每个动画从0开始,加速到全速,然后减速到停止。然后,下一个动画将执行相同的操作 如果要链接一系列动画以创建无缝效果,可能需要使用线性动画计时。查看UIView类方法animateWithDuration:delay:option

我将几个动画链接在一起,并且在删除连续动画之间的暂停时遇到问题。首先,我尝试在完成块中嵌套UIView动画。从那时起,我开始使用此解决方案:


我认为它更具可读性,但我也有同样的停顿问题

问题可能是动画计时,而不是暂停。默认情况下,动画使用“缓入”和“缓出”计时。这意味着每个动画从0开始,加速到全速,然后减速到停止。然后,下一个动画将执行相同的操作

如果要链接一系列动画以创建无缝效果,可能需要使用线性动画计时。查看UIView类方法animateWithDuration:delay:options:animations:completion:


为选项参数传入UIViewAnimationOptionCurveLinear。

这是swift格式,太懒,无法转换为目标C。将动画链接到动画事务块中

Swift 2

UIView.animateKeyframesWithDuration(totalAnimationDuration, delay: 0, options:UIViewKeyframeAnimationOptions.CalculationModeLinear, animations: {

    for (var i = 0; i < wayPoints.count; i++) {
        let nextWayPoint = wayPoints[i]

        UIView.addKeyframeWithRelativeStartTime(CGFloat(i) * relativeDuration, relativeDuration: relativeDuration, animations: {
            token.frame = CGRect(x: nextWayPoint.x + self.inset, y: nextWayPoint.y + self.inset, width: token.frame.size.width, height: token.frame.size.height)
        })


    }


}, completion: { success in


})
UIView.animateKeyframesWithDuration(总动画持续时间,延迟:0,选项:UIViewKeyframeAnimationOptions.CalculationModeLinear,动画:{
对于(变量i=0;i
Swift 3,4,5

UIView.animateKeyframes(withDuration: totalAnimationDuration, delay: 0, options: UIView.KeyframeAnimationOptions.calculationModeLinear, animations: {

    for i in 0..<wayPoints.count {
        let nextWayPoint = wayPoints[i]

        UIView.addKeyframe(withRelativeStartTime: CGFloat(i) * relativeDuration, relativeDuration: relativeDuration, animations: {
            token.frame = CGRect(x: nextWayPoint.x + self.inset, y: nextWayPoint.y + self.inset, width: token.frame.size.width, height: token.frame.size.height)
        })


    }


}, completion: { success in


})
UIView.animateKeyframes(带持续时间:totalAnimationDuration,延迟:0,选项:UIView.KeyframeAnimationOptions.calculationModeLinear,动画:{

对于0中的i..将选项设置为UIViewAnimationOptionCurveLinear确实改善了动画,但动画之间仍有一点停顿。我认为这是因为动画不是在单个动画块中运行的,但我不确定。这并不能回答我的问题,也不是问题所涉及的语言。公平地说,你没有指定objective-c确实回答了您的问题。@JeffCompton,它使用上面显示的完全相同的API调用转换为Obj-c。他正确地指出,您必须使用类似于keyframeanimation的东西在一次犯规猛扑中链接动画。如上所示,他动态创建动画并立即添加。这将将动画链接到单个关键帧动画。这可以防止延迟,因为会有延迟等待提交的CATTransation的完成回调。您可能希望了解Nick Lockwood的iOS Core动画高级技术。它应该解释导致您理解为什么会出现问题您不混合语言,只需在Objective-C中使用上面的API调用…这真的不是一个难翻译的问题。而且,即使删除UIViewAnimationOptionCurveLinear,仍然会出现非线性动画。CATTransaction开始和调用完成之间会有延迟。我强烈建议通过阅读上面的书,您可以了解动画是如何在CALayers上工作的。