UIProgressView值低于0.1无法正确显示

时间:2016-06-18 07:05:33

标签: ios swift uikit uiprogressview

我不确定(因为我找不到任何东西)如果这是进度视图的方式,工作但是当我的值低于0.1时,假设为0.05,进度视图总是显示为0.1,然后是上面的任何内容0.1工作正常。

这是正常的吗?

2 个答案:

答案 0 :(得分:0)

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

要获得变通方法,您可以使用两个视图创建自定义进度视图 - 一个用于条形本身,另一个用于进度。之后,您可以将进度视图的宽度设置为条形本身的宽度,再乘以进度百分比。

您可以使用cornerRadius CALayer属性来获得圆边。

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)

<强>结果:

screenshot of the custom progress bar

答案 1 :(得分:0)

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

举个例子,假设你有一个 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)
    }
}