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

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

这正常吗?

【问题讨论】:

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

标签: ios swift uikit uiprogressview


【解决方案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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      相关资源
      最近更新 更多