2014-10-09 116 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)之後調用相同的更新方法...

無論如何,您的無限循環只是繼續執行並且佔用所有處理器的能力,但沒有執行其他方法它,所以你可以看到沒有結果。您需要一種方法讓系統在幀之間執行其他方法(更新調用),以便在每次更新後停止執行一段時間或將其放在單獨的線程上。這兩種方式都會讓主線程完成其他任務。