低于 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 做出此决定可能是因为他们希望向用户提供清晰可见的反馈,即正在取得一些进展——即使视图本身很短。
作为一种解决方法,您可以创建一个包含两个视图的自定义进度视图 - 一个用于栏本身,一个用于进度。之后,您可以将进度视图的宽度设置为栏本身的宽度,乘以进度百分比。
您可以将CALayer
的cornerRadius
属性用于圆角边缘。
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 值未正确显示的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7.1 中以编程方式创建的 UIProgressView 的高度被忽略(始终为 2)