2016-08-31 3 views
0

Я хотел бы создать функцию таймера обратного отсчета, когда пользователь может приостановить и возобновить работу с тем же нажатием кнопки. Я знаю, что было несколько подобных вопросов по SO, включая этот ответ one. Тем не менее, я все еще застрял (2-й день). Кажется, что мой таймер все еще тикает, несмотря на то, что он недействителен.Начало, пауза, возобновление NSTimer Swift

Вот мой код:

@IBOutlet weak var timerLabel: UILabel! 
var duration: NSTimeInterval { return Double((exercise!.duration))! * 60 } 
var interval: Double? 
var timer = NSTimer() 
var startTime = NSDate.timeIntervalSinceReferenceDate() 
var elapsedTime: Double? 
var timeLeft: Double? 
var inProgress = false 
var isPaused = false 
var completionStatus = false 


@IBAction func pressStart(sender: UIButton) { 
    if inProgress{ 
     if isPaused { 
      resumeAnimation(timeLeftShapeLayer) 
      sender.setTitle("Pause", forState: UIControlState.Normal) 
      print("pressed resume, with \(timeLeft!) time left") 
      startTime = NSDate.timeIntervalSinceReferenceDate() 
      timer = NSTimer.scheduledTimerWithTimeInterval(timeLeft!, target: self, selector: #selector(PerformExerciseViewController.updateTime), userInfo: nil, repeats: false) 
      isPaused = false 

     } else { 
      pauseAnimation(timeLeftShapeLayer) 
      isPaused = true 
      sender.setTitle("Resume", forState: UIControlState.Normal) 

      elapsedTime = NSDate.timeIntervalSinceReferenceDate() - startTime 
      timeLeft = duration - elapsedTime! 
      timer.invalidate() 

      print("pressed pause, with \(timeLeft!) time left") 
     } 
    } else { 
     drawTimeLeftShape() 
     timeLeftShapeLayer.addAnimation(strokeIt, forKey: nil) 
     sender.setTitle("Pause", forState: UIControlState.Normal) 

     startTime = NSDate.timeIntervalSinceReferenceDate() 
     timer = NSTimer.scheduledTimerWithTimeInterval(duration, target: self, selector: #selector(PerformExerciseViewController.updateTime), userInfo: nil, repeats: false) 
     inProgress = true 
     isPaused = false 
    } 

При печати время:

нажата пауза, с 56.3997309803963 оставшееся время (длинная пауза здесь, может быть, 10 сек.)

нажимается резюме, с 56.3997309803963 оставшееся время (супер короткое время воспроизведения 0,1 сек.)

нажатая пауза, с 47.3651859760284 оставшееся время (похоже, время, отсчитываемое во время паузы

Спасибо за помощь!

ответ

0

Я подсчитал оставшееся время неправильно. Вместо:

timeLeft = duration! - elapsedTime! 

Использование:

timeLeft = timeLeft! - elapsedTime! 
Смежные вопросы