SWIFT中的舍入进度栏
嗨,大家好! 作为您的IOS开发人员,我在这里附带有关如何制作圆形进度条的第二个故事。 在IOS中,我们有“状态栏”,但是我们无法使其四舍五入。 让我们深入研究如何自己编写代码。
首先,我们在uiview子类上使用CAShapeLayer()类对象进行绘制,然后在屏幕或窗口上显示该View。
- 采取IBDesginable类,它是UIView的子类。
@IBDesignable
class RoundProgressBar:UIView {
}
2.我们需要此组件的属性。
我们先绘制浅色的backLayaer,然后在其上面用另一种颜色制作另一层,以用当前值标记进度。 因此,它具有最小值,最大值和当前值来表示外观。 因此,属性用于2层,即背景和前景,最小值,最大值和当前值,以及一些IBInspectables,用于在Interface Builder上呈现视觉效果。
私人var bgLayer = CAShapeLayer()
私人var fgLayer = CAShapeLayer()
var minValue:Double = 0
var maxValue:Double = 1.0
var currentValue:Double = 0 {
didSet {
fgLayer.strokeEnd = currentValue> 0.01? CGFloat(currentValue):0.01
}
}
IBInspectables颜色和条形宽度
@IBInspectable var progressBarWidth:CGFloat = 20.0 {
didSet {
configureView()
}
}
@IBInspectable var progressBarTintColor:UIColor = UIColor.lightGray {
didSet {
configureView()
}
}
@IBInspectable var progressBarProgressColor:UIColor = UIColor.clear {
didSet {
configureView()
}
}
此类的初始化
覆盖init(frame:CGRect){
super.init(frame:框架)
configureView()
}
需要初始化吗?(编码器aDecoder:NSCoder){
super.init(编码器:aDecoder)
configureView()
}
在更改颜色和当前值时,我们调用方法“ configureView()”来更新进度条。 在此方法中,背景和前景CAShapeLayer对象指定了它们的Width,FillColor,可以在整个绘图区域上填充颜色,但是这里我们不需要完整的填充圆,因此请设为nil。 绘制对象从0开始(默认)。 因此,对于背景对象,给定1,以完全绘制该背景层。 但在前景层中,我们将该端点设置为0.01,以使其可见一点点填充色,以获得良好的外观。 然后,我们将这些图层添加到视图的图层,以使其可见。 最后,我们使用layer.strokeColor设置这些图层之前定义的颜色。
func configureView(){
bgLayer.lineWidth = progressBarWidth
bgLayer.fillColor = nil
bgLayer.strokeEnd = CGFloat(maxValue)
layer.addSublayer(bgLayer)
fgLayer.lineWidth = progressBarWidth
fgLayer.fillColor = nil
fgLayer.strokeEnd = 0.01
layer.addSublayer(fgLayer)
bgLayer.strokeColor = progressBarTintColor.cgColor
fgLayer.strokeColor = progressBarProgressColor.cgColor
}
在“ UIBezierPath”对象的帮助下绘制图层。
我们需要绘制形状,因为我们需要圆角的圆,其半径差为给定的宽度,并且具有相同的中心。 因此,我们使用UIBezierPath()对象在CGLayer上创建下降路径。 在这里,我给出了所拍摄视图宽度的35%。 您可以通过传递参数或按需自定义更多内容。
func setupCAShapeLayers(shapeLayer:CAShapeLayer,startAngle:CGFloat,endAngle:CGFloat){
shapeLayer.frame = self.bounds
让center = CGPoint.init(x:self.frame.width / 2,y:self.frame.height / 2)
让半径=(self.bounds.width * 0.35)
让路径= UIBezierPath.init(arcCenter:中心,半径:半径,startAngle:startAngle,endAngle:endAngle,顺时针:true)
shapeLayer.path = path.cgPath
}
最后,通过Overrideing,layoutSubviews调用上述方法,以在方向改变时正确地渲染位置。 多次调用它以在屏幕上呈现UI组件。 因此,我们在初始化时调用ConfigureView()方法,但是在LayoutSubviews()方法上使用此draw方法。
覆盖func layoutSubviews(){
super.layoutSubviews()
configureView()
setupCAShapeLayers(shapeLayer:bgLayer,startAngle:0,endAngle:CGFloat(Double.pi * 2))
setupCAShapeLayers(shapeLayer:fgLayer,startAngle:CGFloat(Double.pi / 2),endAngle:CGFloat(Double.pi * 2)+ CGFloat(Double.pi / 2))
}
现在,使用我们编写的类,在Interface builder上或以编程方式获取任何uiview()对象。 “ RoundProgressBar ”。 通过Interface Builder,将此类分配给该视图。 以编程方式,创建如下视图。
让roundedProgress = RoundProgress.init(frame:CGRect.init(x:75,y:25,width:200,height:200))
roundedProgress.backgroundColor = .blue
roundedProgress.progressBarWidth = 5
roundedProgress.progressBarTintColor =。灰色
roundedProgress.progressBarProgressColor = .yellow
view.addSubview(roundedProgress)
就这些。 希望你喜欢我的故事。 祝你有个好的一天!