2017-07-18 165 views
1

我現在有一個靜態的背景色:動畫背景顏色夫特3

self.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0) 

我將如何代碼超過幾秒鐘的設定數目創建一系列動畫的顏色(例如每種顏色5秒)和然後返回到顏色循環的開始?

我已經試過以下...

self.backgroundColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0) 
UIView.animate(withDuration: 5.0, animations: {() -> Void in 
    self.backgroundColor = UIColor(red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0); 
    self.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0) 
}) 

...但這只是停留在過去的藍色。

回答

2

你必須做一個嵌套動畫

self.backgroundColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0) 
    UIView.animate(withDuration: 5.0, animations: {() -> Void in 
     self.backgroundColor = UIColor(red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0); 
    }, 
    completion: { finished in 
     UIView.animate(withDuration: 5.0, animations: {() -> Void in 
      self.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0) 
     }, completion: { finished in 
      //other color do the same 
     }) 

    }) 
+2

沒錯。 CoreAnimation在它們的當前值和動畫塊執行之後確定的最終值之間內插動畫屬性。 還要注意,如果沒有使用block參數'finished',那麼使用'completion {{in ...}''可能會更好。 – J2b

+0

上面的嵌套動畫中的代碼直接轉到最後一種顏色(藍色),並保留在那裏,而沒有以前顏色之間的動畫。 – Bootfit

0

你可以試試這個:

let maxNumberOfRepeats = 10 
    var currentNumberOfRepeats = 0 
    Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { timer in 
     currentNumberOfRepeats = currentNumberOfRepeats + 1 
     if currentNumberOfRepeats == maxNumberOfRepeats { 
      timer.invalidate() 
      UIView.animate(withDuration: 1, animations: { 
       self.backgroundColor = UIColor(red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0) //return to first color 
      }) 
     } else { 
      UIView.animate(withDuration: 1, animations: { 
       self.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0) //or any other random color 
      }) 
     } 
    }