Home > database >  Progressview tintColorIssue
Progressview tintColorIssue

Time:11-12

I have created a progressview according to number images as you can see in below code.

let view = UIView()
view.backgroundColor = .clear
        
let progressView = UIProgressView(frame: CGRect(x: 0, y: 0, width: frameOfParentView.width/3 - 8, height: 30))
progressView.progressViewStyle = .default
progressView.progress = 0.0
progressView.tintColor = .red
progressView.trackTintColor = .gray
progressView.layoutIfNeeded()
view.addSubview(progressView)
self.arrayOfProgrssView.append(progressView)

As you can see in gif at starting point tintColor alpha is little bit less but when it tense to reach at 100% it is fully red.

I also tried with below code:-

progressView.progressTintColor = .red

but did not get expected result.

To perform animation,


DispatchQueue.main.asyncAfter(deadline: .now()   0.001) {
    UIView.animate(withDuration: self.animationInMS) {
        progressView.setProgress(1, animated: true)
    }
}
progressView.layoutIfNeeded()

Issue in iOS 15:-

enter image description here

As you see below result with other colour.

enter image description here

Note:- I have checked in iOS 12.4 it's working properly as you can see into image.

enter image description here

Please let me know is anything require from my side.

Thanks in advance

CodePudding user response:

This does appear to be "new behavior" where the alpha value matches the percent completion -- although, after some quick searching I haven't found any documentation on it.

One option as a work-around: set the .progressImage instead of the tint color.

So, use your favorite code to generate a solid-color image, such as:

extension UIImage {
    
    public static func withColor(_ color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) -> UIImage {
        let format = UIGraphicsImageRendererFormat()
        format.scale = 1
        let image =  UIGraphicsImageRenderer(size: size, format: format).image { rendererContext in
            color.setFill()
            rendererContext.fill(CGRect(origin: .zero, size: size))
        }
        return image
    }   

}

Then, instead of:

progressView.tintColor = .red

use:

let img = UIImage.withColor(.red)
progressView.progressImage = img

Not fully tested, but to avoid the need to change existing code, you might also try:

extension UIProgressView {
    open override var tintColor: UIColor! {
        didSet {
            let img = UIImage.withColor(tintColor)
            progressImage = img
        }
    }
}

Now you can keep your existing progressView.tintColor = .red

  • Related