2014-10-09 91 views
0

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


    } 

回答

0

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

更好的方法通常是在你的情况下使用某种计时器或显示链接。每次显示画面都应该重新绘制,这个项目就会触发,所以它对你的动画是完美的。这些调用通常已经在主线程中,因此您不需要其他任何东西。那么应该避免再次调用内置动画。

还有一种方法是使用递归类型。每次更新动画时,都会在延迟一段时间(1.0/60.0)之后调用相同的更新方法...

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