[iOS]UIprogressViewホットスポット



上の写真を見ると12の値が得られましたがProgressViewの値は21くらいでした.ProgressViewは21より大きい値と0より大きい値を正しく表しますが、21より小さい値を表すことはできません.
まず、問題を解決する前に、コードはこうです.
override func viewDidLoad() {
  super.viewDidLoad()

  configureProgressView()
  
  fineDustViewModel.observable
    .observe(on: MainScheduler.instance)
    .subscribe(onNext:{ [weak self] in
      self?.setProgressView($0)
    })
    .disposed(by: disposeBag)
}

private func configureProgressView(){
  fineDustProgressView.progressViewStyle = .bar
  fineDustProgressView.trackTintColor = #colorLiteral(red: 0.835541904, green: 0.8356826901, blue: 0.8355233073, alpha: 1)
  fineDustProgressView.clipsToBounds = true
  fineDustProgressView.layer.cornerRadius = 15
  fineDustProgressView.layer.sublayers![1].cornerRadius = 15
  fineDustProgressView.subviews[1].clipsToBounds = true
  fineDustProgressView.progress = 0.0
}
viewDidLoadはConfigureProgressView()を呼び出します.configureProgressView()関数はProgressViewの一部です.関数です.次に、obileableを介してスモッグ値を受信し、setProgressView()関数を呼び出します.
setProgressView()関数は次のようになります.
private func setProgressView(_ fineDustAPIData: FineDustAPIData){
  timer?.invalidate()
  time = 0.0
  fineDustProgress = fineDustViewModel.calculatorFineDustValue(fineDustAPIData.fineDust.fineDustValue)
  fineDustProgressView.progressTintColor = fineDustAPIData.fineDust.fineDustColor
  
  timer = Timer.scheduledTimer(timeInterval: 0.05, target: self, selector: #selector(setProgress(sender:)), userInfo: nil, repeats: true)
}

@objc func setProgress(sender: Timer) {
  time += 0.01
  
  if time <= fineDustProgress{
    fineDustProgressView.setProgress(time, animated: true)
  }

  if time > fineDustProgress {
    time = 0.0
    timer?.invalidate()
  }
}
ここでfineDustProgressViewのProgressTintColorを変更してtimerを作成し、作成したtimerがsetProgress関数を実行することでProgressViewのAnimationをカスタマイズします.
コードに問題はないと思いますが、上記の問題が続いています.
問題の原因はsetProgressView()関数でfineDustPrgressViewのprgoressTintColorを変更することです.この部分についてコメント処理を行い、21未満の値を正しく表示した.
private func setProgressView(_ fineDustAPIData: FineDustAPIData){
  timer?.invalidate()
  time = 0.0
  fineDustProgress = fineDustViewModel.calculatorFineDustValue(fineDustAPIData.fineDust.fineDustValue)
  // 문제 원인 !!
  fineDustProgressView.progressTintColor = fineDustAPIData.fineDust.fineDustColor
  
  timer = Timer.scheduledTimer(timeInterval: 0.05, target: self, selector: #selector(setProgress(sender:)), userInfo: nil, repeats: true)
}
しかしスモッグのデータを受け取り、ProgressViewのtintColorを良い、中、悪いの3つの状態で変える必要があります.
複数回の試行を経て、setProgressView()で構成ProgressView()を実行し、ViewDidLoadで実行するのではなく、setProgressView()で実行することで問題を解決できます.
private func configureProgressView(){
  fineDustProgressView.progressViewStyle = .bar
  fineDustProgressView.trackTintColor = #colorLiteral(red: 0.835541904, green: 0.8356826901, blue: 0.8355233073, alpha: 1)
  fineDustProgressView.clipsToBounds = true
  fineDustProgressView.layer.cornerRadius = 15
  fineDustProgressView.layer.sublayers![1].cornerRadius = 15
  fineDustProgressView.subviews[1].clipsToBounds = true
  fineDustProgressView.progress = 0.0
}

private func setProgressView(_ fineDustAPIData: FineDustAPIData){
  timer?.invalidate()
  time = 0.0
  fineDustProgress = fineDustViewModel.calculatorFineDustValue(fineDustAPIData.fineDust.fineDustValue)
  
  configureProgressView() // 여기에 추가 !!!!
  fineDustProgressView.progressTintColor = fineDustAPIData.fineDust.fineDustColor
  
  timer = Timer.scheduledTimer(timeInterval: 0.05, target: self, selector: #selector(setProgress(sender:)), userInfo: nil, repeats: true)
}
問題は解決しましたが、configureProgressView()を呼び出し続けるのは無駄だと考え、configureProgressView()関数で正常な結果を出力するコードを確認しました.
fineDustProgressViewはprgoressViewを定義します.progressViewStyle = .通常の結果を出力するには、バーコードとprogressTintColorで置き換えたコードを一緒に呼び出すしかないことに気づきました.
最終コードは以下の通りです.
override func viewDidLoad() {
  super.viewDidLoad()
  // configureProgressView()는 viewDidLoad에서 호출
  configureProgressView()
  
  fineDustViewModel.observable
    .observe(on: MainScheduler.instance)
    .subscribe(onNext:{ [weak self] in
      self?.setProgressView($0)
    })
    .disposed(by: disposeBag)
}

private func configureProgressView(){
  fineDustProgressView.trackTintColor = #colorLiteral(red: 0.835541904, green: 0.8356826901, blue: 0.8355233073, alpha: 1)
  fineDustProgressView.clipsToBounds = true
  fineDustProgressView.layer.cornerRadius = 15
  fineDustProgressView.layer.sublayers![1].cornerRadius = 15
  fineDustProgressView.subviews[1].clipsToBounds = true
  fineDustProgressView.progress = 0.0
}

private func setProgressView(_ fineDustAPIData: FineDustAPIData){
  timer?.invalidate()
  time = 0.0
  fineDustProgress = fineDustViewModel.calculatorFineDustValue(fineDustAPIData.fineDust.fineDustValue)
  
  // progressViewStyle과 TintColor를 같이
  fineDustProgressView.progressViewStyle = .bar
  fineDustProgressView.progressTintColor = fineDustAPIData.fineDust.fineDustColor
  
  timer = Timer.scheduledTimer(timeInterval: 0.05, target: self, selector: #selector(setProgress(sender:)), userInfo: nil, repeats: true)
}
ここで注意したいのは、ProgressView()のfineDustProgressViewを構成することです.progressViewStyle = .バーコードを削除するには、prgoressViewスタイルが必要です.barに設定するには
https://stackoverflow.com/questions/54148264/uiprogressview-setprogress-issueを見て、私と同じ間違いを見つけたので文章を書きましたが、何が正しいのか分かりません.😅
解決しなかった疑問はこうだった.ご存知の方はメッセージをお願いします😂
  • setProgressView()関数を非同期でデータを受信しても実行せず、そのままViewDidLoad()で実行する場合は、上記のコード変更は不要で、ProgressViewは正常に出力されます.
  • ProgressViewStyledefaultの場合、正常に出力されません.