Ios 运行动画直到按下按钮

Ios 运行动画直到按下按钮,ios,swift,uibutton,uiviewanimation,Ios,Swift,Uibutton,Uiviewanimation,我正在尝试制作一个应用程序,在这个应用程序中,动画应该一直运行到按下按钮为止。我尝试使用无限循环,但有了这个循环,我的应用程序就根本无法运行了。它正在消耗所有的内存。我还尝试在完成时再次调用相同的函数,但该进程也消耗了100%的CPU 你能指导我在这里该做什么吗 场景类似于视图的背景,动画应该持续运行,直到按下按钮。当按下按钮时,另一个视图将打开,另一个动画将继续运行,直到按下其他按钮。 以下是我的代码: func unlimitedLoop() {

我正在尝试制作一个应用程序,在这个应用程序中,动画应该一直运行到按下按钮为止。我尝试使用无限循环,但有了这个循环,我的应用程序就根本无法运行了。它正在消耗所有的内存。我还尝试在完成时再次调用相同的函数,但该进程也消耗了100%的CPU

你能指导我在这里该做什么吗

场景类似于视图的背景,动画应该持续运行,直到按下按钮。当按下按钮时,另一个视图将打开,另一个动画将继续运行,直到按下其他按钮。 以下是我的代码:

func unlimitedLoop()
    {            
        rotating = true            
        self.ProcurementSupport.transform = CGAffineTransformMakeTranslation(0, 100)
        self.ProcurementSupport.hidden = false            
        UIView.animateWithDuration(3, delay: 2, usingSpringWithDamping: 2, initialSpringVelocity: 2, options: nil, animations: {
            //   self.EquipmentSupport.hidden = true

            var x:NSTimeInterval = 2                    
                springWithDelay(2, x, {
                    self.ProcurementSupport.transform = CGAffineTransformMakeTranslation(0,0)
                    self.EquipmentSupport.transform = CGAffineTransformMakeTranslation(1000,0)
                    x=x+2
                })                    
                springWithDelay(2, x, {
                    self.EquipmentSupport.transform = CGAffineTransformMakeTranslation(0,100)
                    x=x+2
                })                    
                springWithDelay(2, x, {
                    self.ProcurementSupport.transform = CGAffineTransformMakeTranslation(1000,0)
                    self.EquipmentSupport.transform = CGAffineTransformMakeTranslation(0,0)
                    x=x+2
                })
                springWithDelay(2, x, {
                    self.ProcurementSupport.transform = CGAffineTransformMakeTranslation(0, 100)
                    x=x+2
                })
            }, completion: {finished in self.unlimitedLoopAgain()})
    }

通过创建无限循环执行自定义动画时,需要在单独的线程上运行此函数。除了循环本身之外,最好每帧停止线程一小段时间,例如调用sleep for 1.0/60.0以获得约60FPS。这种方法中出现的另一个问题是,当一个新线程更改视图系统上的一个参数时,它很可能会回调主线程以刷新视图。在任何情况下,您都不应该创建这样的函数,并在其中调用内置动画,因为您需要自己制作动画

更好的方法通常是在您的案例中使用某种计时器或显示链接。此项将在每次重新绘制显示时触发,因此非常适合您的动画。这些调用通常已经在主线程上,因此您不需要其他任何东西。同样,应该避免调用内置动画

另一种方法是使用某种递归。例如,每次更新动画时,都会在延迟时间1.0/60.0后调用相同的更新方法

无论如何,您的无限循环只会继续执行,并占用所有处理器的能量,但没有执行其他方法,因此您根本看不到任何结果。您需要一种方法让系统在更新调用的帧之间执行其他方法,以便在每次更新后停止执行一段时间,或者将其放在单独的线程上。这两种方法都可以让主线程完成其他任务