2015-09-18 85 views
1

我想通過不同的顏色使背景顏色循環。iOS Swift - 改變背景顏色

我發現的代碼做在Objective-C在這裏:

- (void) doBackgroundColorAnimation { 
static NSInteger i = 0; 
NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], [UIColor whiteColor], [UIColor blackColor], nil]; 

if(i >= [colors count]) { 
    i = 0; 
} 

[UIView animateWithDuration:2.0f animations:^{ 
    self.view.backgroundColor = [colors objectAtIndex:i];   
} completion:^(BOOL finished) { 


     ++i; 
     [self doBackgroundColorAnimation]; 
    }]; 

} 

然而,我的SWIFT代碼是不工作?我在完成方法中打印出「完成」一詞,但由於某種原因,它會像控制檯一直被調用一樣對控制檯進行垃圾處理?

我在做什麼錯?

import UIKit 

class ViewController: UIViewController { 

    override func prefersStatusBarHidden() -> Bool { 
     return true 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.tripOut() 
    } 

    func tripOut() { 

     var i = 0 

     let colors = [UIColor.redColor(),UIColor.blueColor(),UIColor.yellowColor()] 

     if(i >= colors.count) { 
      i = 0 
     } 

     UIView.animateWithDuration(2.0, animations: {() -> Void in 

      self.view.backgroundColor = colors[i] 

      }, completion: { (value: Bool) in 
       ++i 
       self.tripOut() 
       println("done") 
     }) 

     } 

    } 
+0

因爲'tripOut'調用自身。永遠。 – matt

+0

有沒有辦法讓它調用一次? – Josh

+0

您可以使用一個標誌併爲該標誌添加一個條件,並且在任何時候都會停止動畫。 –

回答

1

它不工作,因爲當叫tripOut新實例colorsi創建,以便使他們的全球,這裏是你的工作代碼:

import UIKit 

class ViewController: UIViewController { 

    let colors = [UIColor.redColor(),UIColor.blueColor(),UIColor.yellowColor()] 
    var i = 0 

    override func prefersStatusBarHidden() -> Bool { 
     return true 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.tripOut() 
    } 

    func tripOut() { 

     if(i >= colors.count) { 
      i = 0 
     } 

     UIView.animateWithDuration(2.0, animations: {() -> Void in 

      self.view.backgroundColor = self.colors[self.i] 

      }, completion: { (value: Bool) in 
       self.i++ 
       self.tripOut() 
       println("done") 
     }) 

    } 

}