运行动画直到按下按钮

时间:2014-10-09 06:57:09

标签: ios swift uibutton uiviewanimation

我正在尝试创建一个应用程序,其中应该运行动画,直到按下按钮。我尝试使用无限循环但是使用该循环我的应用程序根本没有运行。它占用了所有的内存。我还尝试在完成时再次调用相同的函数,但该过程也占用了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()})
    }

1 个答案:

答案 0 :(得分:0)

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

更好的方法通常是在您的情况下使用某种计时器或显示链接。每次重绘时都会触发此项目,因此它非常适合您的动画。这些调用通常已经在主线程上,因此您不需要任何其他内容。那么应该避免再次调用内置动画。

另一种方法是使用一种递归方式。每次更新动画时,在一段延迟时间(1.0 / 60.0)之后调用相同的更新方法,例如......

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