我不确定(因为我找不到任何东西)如果这是进度视图的方式,工作但是当我的值低于0.1时,假设为0.05,进度视图总是显示为0.1,然后是上面的任何内容0.1工作正常。
这是正常的吗?
答案 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)
<强>结果:强>
答案 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)
}
}