首页 > 解决方案 > Progressview tintColorIssue

问题描述

我已经根据数字图像创建了一个进度视图,如下面的代码所示。

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)

正如您在 gif 中看到的,在起点 tintColor alpha 稍微少一点,但是当它紧张到 100% 时,它是完全红色的。

我还尝试了以下代码:-

progressView.progressTintColor = .red

但没有得到预期的结果。

要执行动画,


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

iOS 15 中的问题:-

在此处输入图像描述

正如您在下面看到的其他颜色的结果。

在此处输入图像描述

注意:- 我已在 iOS 12.4 中检查它工作正常,如您所见。

在此处输入图像描述

请让我知道我这边有什么要求。

提前致谢

标签: iosswiftxcode

解决方案


这似乎是 alpha 值与完成百分比匹配的“新行为”——尽管经过快速搜索后,我没有找到任何关于它的文档。

作为解决方法的一个选项:设置.progressImage而不是色调颜色。

所以,使用你喜欢的代码来生成纯色图像,例如:

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
    }   

}

然后,而不是:

progressView.tintColor = .red

利用:

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

未经过全面测试,但为避免更改现有代码,您也可以尝试:

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

现在您可以保留现有的progressView.tintColor = .red


推荐阅读