[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を見て、私と同じ間違いを見つけたので文章を書きましたが、何が正しいのか分かりません.😅
解決しなかった疑問はこうだった.ご存知の方はメッセージをお願いします😂
Reference
この問題について([iOS]UIprogressViewホットスポット), 我々は、より多くの情報をここで見つけました https://velog.io/@sainkr/iOS-UIProgressView-setProgress-issueテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol