SWIFT中的舍入进度栏

嗨,大家好! 作为您的IOS开发人员,我在这里附带有关如何制作圆形进度条的第二个故事。 在IOS中,我们有“状态栏”,但是我们无法使其四舍五入。 让我们深入研究如何自己编写代码。

首先,我们在uiview子类上使用CAShapeLayer()类对象进行绘制,然后在屏幕或窗口上显示该View。

  1. 采取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)

就这些。 希望你喜欢我的故事。 祝你有个好的一天!