2016-11-14 42 views
0

我有一個像Snapchat和Instagram故事一樣的進度視圖。進度視圖到達最後或點擊按鈕後,我的內容會發生變化。重置UIProgressView並立即開始使用Swift 3

我正在重置內容更改時的進度視圖。一切都按預期工作,而沒有干預。但是,當點擊下一個按鈕時,進度視圖不會再次開始,直到其他循環執行。您可以快速看到video here

我碰到this question出來,而我研究,我也有同樣的情況,但我無法適用的原則與SWIFT 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 E中的計時器和停止更新,當你在100%

+0

謝謝。我試過你的解決方案,但它不能幫助我。我剛剛編輯了問題以添加視頻。也許它可能更有幫助。 –

+0

嘗試在「updateUI」內調用「self.updateProgressBar()」 –

+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個小時了,但是我找不到新的解決方案,在我沒有點擊下一個按鈕時效果很好,但是當我點擊它時,進度沒有開始,它在3秒後重新開始 您是否在這種情況下測試了您的代碼?非常感謝您的幫助! –

相關問題