2015-06-19 38 views
3

使用的NSTimer我想使具有起動在10.0000000例如定時器的應用程序,我希望它倒計時完美 這裏是我到目前爲止的代碼:倒計時幾個小數插槽,在斯威夫特

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var labelTime: UILabel! 

    var counter = 10.0000000 

    var labelValue: Double { 
     get { 
      return NSNumberFormatter().numberFromString(labelTime.text!)!.doubleValue 
     } 
     set { 
      labelTime.text = "\(newValue)" 
     } 
    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     labelValue = counter 
     var timer = NSTimer.scheduledTimerWithTimeInterval(0.0000001, target: self, selector: ("update"), userInfo: nil, repeats: true) 
    } 

    func update(){ 
     labelValue -= 0.0000001 
    } 


} 

會發生什麼是我的倒計時真的很慢,它只是不工作,需要1小時達到0秒,而不是僅僅10秒。有任何想法嗎?我應該對我的代碼做些什麼改變? 謝謝

+0

你可以編輯和分割你的代碼在幾行。哈特閱讀(並理解)何時在一條線上。或者這種快速的常見做法? – kebs

回答

5

定時器不是超精確的,NSTimer的分辨率大約是1/50秒。

另外,iPhone屏幕的刷新率爲60幀/秒,所以完全沒有意義的是以比這更快的速度運行你的計時器。

而不是試圖用一個定時器每次觸發時遞減的東西,創造一個計時器,大火像50次的速率,並用它的時鐘數學更新基於剩餘時間顯示:

var futureTime: NSTimeInterval 

override func viewDidLoad() { 
    super.viewDidLoad() 
    labelValue = counter 

    //FutureTime is a value 10 seconds in the future. 
    futureTime = NSDate.timeIntervalSinceReferenceDate() + 10.0 

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

func update(timer: NSTimer) 
{ 
    let timeRemaining = futureTime - NSDate.timeIntervalSinceReferenceDate() 
    if timeRemaining > 0.0 
    { 
    label.text = String(format: "%.07f", timeRemaining) 
    } 
    else 
    { 
    timer.invalidate() 
    //Force the label to 0.0000000 at the end 
    label.text = String(format: "%.07f", 0.0) 
    } 
} 
+0

我編輯了我的示例代碼。查看更新後的版本。 –

+0

這個很好用!謝謝!在迅速,我怎麼能讓我的浮動只有7個十進制的情況下?似乎它不適用於@「%。07f」 –

+0

它給你帶來了什麼? 「這不起作用」令人難以置信的是,瘋狂**聯合國** - 有幫助。 –

2

您是否試圖在一秒內顯示0.0000001到.99999999之間的每個組合?爲了顯示每個數字,屏幕必須更新上億次。沒有任何可行的方法可以在任何現有技術或可能的未來技術上做到這一點。屏幕本身不能以每秒60次以上的速度更新,所以這是最快的,這對你來說很有用。

您可以嘗試使用NSTimer進行該比率(1/60 = 0.0167)。 NSTimer本身並不保證非常精確。爲了在每一幀更新屏幕,您必須使用CADisplayLinkhttps://developer.apple.com/library/ios/documentation/QuartzCore/Reference/CADisplayLink_ClassRef/)。

這使您有機會在每次幀更新時運行選擇器,這與系統根據定義更改幀速度一樣快。