低于 0.1 的 UIProgressView 值未正确显示

Posted

技术标签:

【中文标题】低于 0.1 的 UIProgressView 值未正确显示【英文标题】:UIProgressView value under 0.1 not showing correctly 【发布时间】:2016-06-18 07:05:32 【问题描述】:

我不确定(因为我找不到任何东西)这是否是进度视图的工作方式,但是当我的值低于 0.1 时,比如说 0.05,进度视图总是显示为 0.1,然后高于0.1 工作正常。

这正常吗?

【问题讨论】:

嗯,我刚刚创建了一个新的 UIProgressView 并将其进度设置为 0.05 并且它工作。然后我将它设置为 0.1,进度大小是 0.05 的两倍,所以它似乎在这里工作。你能发布一些你的代码吗? 谢谢。你的评论实际上让我想到了一些事情。我将代码进度的高度设置为 15,但是当我把它拿走时,它确实可以正常工作。我想知道为什么会这样? 如果有帮助,我还为我的进度视图的高度添加了一个约束并将其设置为 15,它仍然按预期工作 【参考方案1】:

这是使用宽度较小的UIProgressView 的副作用。 Apple 做出此决定可能是因为他们希望向用户提供清晰可见的反馈,即正在取得一些进展——即使视图本身很短。

作为一种解决方法,您可以创建一个包含两个视图的自定义进度视图 - 一个用于栏本身,一个用于进度。之后,您可以将进度视图的宽度设置为栏本身的宽度,乘以进度百分比。

您可以将CALayercornerRadius 属性用于圆角边缘。

let barWidth: CGFloat = 240
let barHeight: CGFloat = 2
let progress: CGFloat = 0.23

let progressBarView = UIView(frame: CGRect(x: 0, y: 0, width: barWidth, height: barHeight))
progressBarView.backgroundColor = .lightGray
progressBarView.layer.cornerRadius = barHeight / 2
progressBarView.clipsToBounds = true
view.addSubview(progressBarView)

let progressView = UIView(frame: CGRect(x: 0, y: 0, width: barWidth * progress, height: barHeight))
progressView.backgroundColor = .blue
progressBarView.addSubview(progressView)

结果:

【讨论】:

【参考方案2】:

我对此进行了一些实验,结果发现进度指示器的最小宽度是其高度的两倍。

例如,假设您有一个 500px 长和 50px 高的 UIProgressView,任何低于 0.2 的进度值实际上都会显示一个 100px 长的进度指示器。确实,50px * 2 = 100px 是最小宽度,出于某种原因.. 所以 0.2 * 500px = 100px 是可以正确显示的最小值。

我还建议创建一个自定义进度视图,因为它是一个非常微不足道的组件,而且来自 Apple 的调整大小“功能”对我来说似乎完全违反直觉。

我使用自动布局创建了一个简单的自定义视图,以便于重用:

class ProgressView: UIView 

    var progress: Float = 0 
        didSet 
            updateProgressView()
        
    

    private let progressView = UIView()
    private var progressViewWidthConstraint: NSLayoutConstraint?

    init() 
        super.init(frame: .zero)

        clipsToBounds = true
        backgroundColor = .lightGray

        addSubview(progressView)

        progressView.translatesAutoresizingMaskIntoConstraints = false
        progressView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
        progressView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
        progressView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
        progressViewWidthConstraint = progressView.widthAnchor.constraint(equalToConstant: 140)
        progressViewWidthConstraint?.isActive = true
    

    required init?(coder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    override func layoutSubviews() 
        super.layoutSubviews()

        updateProgressView()
    

    func updateProgressView() 
        let isCompleted = progress >= 1.0

        progressView.backgroundColor = isCompleted ? .green : .blue
        progressViewWidthConstraint?.constant = bounds.width * CGFloat(progress)
    

【讨论】:

以上是关于低于 0.1 的 UIProgressView 值未正确显示的主要内容,如果未能解决你的问题,请参考以下文章

UIProgressView 只更新值而不是 UI

UIProgressView和UISlider

如何防止缩放低于定义(OpenGL)

iOS 7.1 中以编程方式创建的 UIProgressView 的高度被忽略(始终为 2)

如何使用 AFNetworking 在 UILabel 中设置 UIProgressView 的下载状态?

UIProgressView 未处理的颜色