2016-11-14 14 views
0

У меня есть представление о прогрессе, подобное тому, что есть в Snapchat и Instagram Stories. Мое содержимое изменяется после того, как представление прогресса доходит до конца или при нажатии на кнопку.Сбросить UIProgressView и сразу начать анимацию с помощью Swift 3

Я пересматриваю представление прогресса при изменении содержимого. Все работает так, как ожидалось, пока нет вмешательства. Но при нажатии на следующую кнопку просмотр прогресса не запускается до тех пор, пока не будет выполнен другой цикл.

Вы можете быстро увидеть video here.

я наткнулся this question в то время как я исследовал, я тот же сценарий, но я не мог применить принцип как новичку с быстрым 3.

Вот мой код, любая помощь будет высоко оценен:

func startTimer(){ 
    self.timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(myVievController.nextItem), userInfo: nil, repeats: false) 
} 

func updateProgressBar() { 
    self.progressView.setProgress(1.0, animated: false) 
    UIView.animate(withDuration: 2.8, animations: {() -> Void in 
     self.progressView.layoutIfNeeded() 
    }, completion: { finished in 
     if finished { 
      self.progressView.setProgress(0, animated: false) 
     } 
    }) 
} 

func nextItem(){ 
    // ... 
    self.updateUI(item: self.myCurrentItem) 
    // ... 
} 

func updateUI(item:MyItem){ 
    self.updateProgressBar() 
    self.timer.invalidate() 
    self.startTimer() 

    // Clear old item and fill new values etc... 
} 

@IBAction func nextButtonPressed(_ sender: UIButton) { 
    self.nextItem() 
} 

ответ

0

вы, наверное, нужно что-то вроде этого, чтобы обновить ваш прогресс бар: self.progressView.setProgress(0, animated: false)

func updateProgressBar() { 
    DispatchQueue.main.async { 
     self.progressView.setProgress(0.1, animated: false) 
    } 
    if self.progressView.Progress == 1.0 { 
     self.timer.invalidate() 
    } else { 
     self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(myVievController.updateProgressBar), userInfo: nil, repeats: false) 
    } 
} 

Тогда вы можете invalidat е таймер и остановить обновление, когда вы на 100%

+0

Спасибо. Я попробовал ваше решение, но это мне не помогает. Я только что редактировал вопрос, чтобы добавить видео. Возможно, это может быть полезно. –

+0

попробуйте просто вызвать «self.updateProgressBar()» внутри «updateUI» –

+0

Разве это уже нет? –

0

Может также сделать это с подкласса:

class HelloWorld: UIProgressView { 

    func startProgressing(duration: TimeInterval, resetProgress: Bool, completion: @escaping (Void) -> Void) { 
     stopProgressing() 

     // Reset to 0 
     progress = 0.0 
     layoutIfNeeded() 

     // Set the 'destination' progress 
     progress = 1.0 

     // Animate the progress 
     UIView.animate(withDuration: duration, animations: { 
      self.layoutIfNeeded() 

     }) { finished in 
      // Remove this guard-block, if you want the completion to be called all the time - even when the progression was interrupted 
      guard finished else { return } 

      if resetProgress { self.progress = 0.0 } 

      completion() 
     } 
    } 

    func stopProgressing() { 
     // Because the 'track' layer has animations on it, we'll try to remove them 
     layer.sublayers?.forEach { $0.removeAllAnimations() } 
    } 
} 

Это может быть использовано по телефону -startProgressing() когда-либо вам нужно, чтобы начать progressView снова от начала. завершение вызывается, когда он имеет закончил анимации, так что вы можете изменить взгляды и т.д.

Пример использования:

progressView.startProgressing(duration: 5.0, resetProgress: true) { 
    // Set the next things you need... change to a next item etc. 
} 
+0

Спасибо. Я изменил свой код, как вы предложили. Это улучшило мою структуру, но теперь скорость выполнения нагрузок раз и никогда не сбрасывается. :( –

+0

@ MertDiricanlı Я обновил код, чтобы вы могли это сделать. Он также доступен в https://github.com/doofyus/animatingProgressView –

+0

. Я получил тот же результат с моим первым кодом. Это должно быть простой задачей для любого программист.Я не знаю, может быть, я делаю что-то не так.Это было почти 3 часа, но я не мог найти новое решение.Он отлично работает, пока я не нажимал следующую кнопку.Но когда я ее касаюсь, Вы пробовали свой код с помощью этого сценария? Огромное спасибо за вашу помощь! –