Dan Kamilov
Dan Kamilov

Reputation: 51

UIProgressView become transparent during setProgress with animated = true

In iOS15 UIProgressView changed behavior. When I use self.progress.setProgress(1.0, animated: true), it starts from transparent style. How to return to "alpha = 1" style.

  1. progress = 0

  2. progress = 20%

  3. progress = 70%

  4. progress = 90%

P.S.: progress.alpha = 1 does not work

Upvotes: 5

Views: 1057

Answers (2)

Tharindu Madushanka
Tharindu Madushanka

Reputation: 3361

Setting a tintImage with a UIImage extension with color works. This seemed to be the easiest way for me to remove that transparency.

progressView.progressImage = UIImage(color: progressTintColor)

UIImage extension

extension UIImage {
convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
    let rect = CGRect(origin: .zero, size: size)
    UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
    color.setFill()
    UIRectFill(rect)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    guard let cgImage = image?.cgImage else { return nil }
    self.init(cgImage: cgImage)
} }

Upvotes: 4

Dan Kamilov
Dan Kamilov

Reputation: 51

The only way to change this opaque/transparent behavior is to use your own Timer.

private let progressUnit = Progress(totalUnitCount: 20)

func startAnimate(){
        self.progressView.setProgress(0.0, animated: false)
        self.progressUnit.completedUnitCount = 0
        
        Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { timer in
            guard self.progressUnit.isFinished == false else{
                timer.invalidate()
                return
            }
            
            self.progressUnit.completedUnitCount += 1
            let progressFloat = Float(self.progressUnit.fractionCompleted)
            self.progressView.setProgress(progressFloat, animated: true)
        }
    }

Upvotes: 0

Related Questions