2014-10-07 115 views
0

我正在使用NSTimer更新圖像在屏幕上的位置以給出運動錯覺。這是我創建學習斯威夫特的飛鳥克隆。無論如何,我還通過顯示遞增的Int作爲分數來更新插座。但是,每次更新Int和相應的插座時,屏幕上的圖像都會重置爲起始點(鳥和管)。很奇怪。有沒有其他人遇到過這個?我究竟做錯了什麼?Swift NSTimer和IBOutlet問題

@IBOutlet weak var tube1: UIImageView! 
@IBOutlet weak var bird1: UIImageView! 
@IBOutlet weak var score: UILabel! 

func startTimer() { 
    timer = NSTimer.scheduledTimerWithTimeInterval(0.02, target: self, selector: Selector("update"), userInfo: nil, repeats: true) 
} 

func update() { 
    bird1.center=CGPointMake(50,bird1.center.y+CGFloat(num)); 
    tube1.center=CGPointMake(tube1.center.x-CGFloat(num2),tube1.center.y); 
    if(tube1.center.x<(-40)){ 
     tube1.center.x=screenWidth;//variable set outside this method 
     tube1.center.y=0;//will be random 
     updateMyScore(); 
    } 
} 

func updateMyScore(){ 
    myScore=++; 

    score.text="Score: \(myScore)" 
} 

奇怪的是,如果我註釋掉score.text =「得分:(myScore的)」行一切工作正常,但我想在屏幕上的得分表演。有什麼建議麼?

+0

'myScore = ++;'不能編譯。 – 2014-10-07 01:34:02

+0

你能發佈更多這個類嗎? – 2014-10-07 01:40:33

+0

請勿將NSTimer用於動畫! – 2014-10-07 07:01:23

回答

0

AutoLayout正在運行並重置圖像的位置。它正在運行,因爲您正在更新您的UILabel。有兩種方法可以解決這個問題:

  1. 禁用自動版式或
  2. Store中的管及物業管的位置,然後將它們設置在viewDidLayoutSubviews()覆蓋。

這裏是你如何可能實現的選項#2:

@IBOutlet weak var tube1: UIImageView! 
@IBOutlet weak var bird1: UIImageView! 
@IBOutlet weak var score: UILabel! 
var tube1center: CGPoint? 
var bird1center: CGPoint? 

func startTimer() { 
    timer = NSTimer.scheduledTimerWithTimeInterval(0.02, target: self, selector: Selector("update"), userInfo: nil, repeats: true) 
} 

func update() { 
    bird1.center=CGPointMake(50,bird1.center.y+CGFloat(num)); 
    tube1.center=CGPointMake(tube1.center.x-CGFloat(num2),tube1.center.y); 
    if(tube1.center.x<(-40)){ 
     tube1.center.x=screenWidth;//variable set outside this method 
     tube1.center.y=0;//will be random 
     updateMyScore(); 
    } 
    bird1center = bird1.center 
    tube1center = tube1.center 
} 

func updateMyScore(){ 
    myScore=++; 

    score.text="Score: \(myScore)" 
} 

override func viewDidLayoutSubviews() { 
    if let newcenter = tube1center { 
     tube1.center = newcenter 
    } 
    if let newcenter = bird1center { 
     bird1.center = newcenter 
    } 
} 
0

是的,這是衆所周知的自動佈局行爲。如果您執行的任何操作都會導致自動佈局引擎重新應用視圖的約束條件(例如更新分數),則與佈局相關的屬性的任何調整都將丟失,重置爲約束條件所指定的值。如Vacawama指出的那樣,您可以關閉自動佈局。或者,您也可以不在定時器例程中手動更改frame,而是爲約束自己創建IBOutlet,您可以修改約束的constant屬性,然後再調用layoutIfNeeded。這樣,如果你碰巧做了其他觸發約束的事情,一切都會好的。