ios - How to show a static NON-animated progress bar using CoreGraphics in Swift? -
i want make static progress bar no animation @ all. want orange part filled
, image shows progress of (1 of 3), know how accomplish view (2 of 3) , completed progress bar in (3 of 3).
thank , appreciated.
here have workin, designable class
import foundation import uikit @ibdesignable class staticload: uiview { enum progress { case empty case filled(num: int) case full } @ibinspectable public var progresscolor: uicolor? { didset { updatecolor(progresscolor: progresscolor ?? tintcolor, nonprogresscolor: nonprogresscolor) } } @ibinspectable public var nonprogresscolor: uicolor = .gray { didset { updatecolor(progresscolor: progresscolor ?? tintcolor, nonprogresscolor: nonprogresscolor) } } @ibinspectable public var numberofsteps: int = 3 { didset { redrawsteps(step: numberofsteps) updatecolor(progresscolor: progresscolor ?? self.tintcolor, nonprogresscolor: nonprogresscolor) } } @ibinspectable public var filledprogess: int = 1 { didset { if filledprogess >= numberofsteps { filledprogess = numberofsteps progress = .full } if filledprogess <= 0 { filledprogess = 0 progress = .empty } else { progress = .filled(num: filledprogess) } updatecolor(progresscolor: progresscolor ?? tintcolor, nonprogresscolor: nonprogresscolor) } } private var tip: cgfloat = 5 private var progress: progress = .empty private var progresslayers: [cashapelayer] = [] private func updatecolor(progresscolor: uicolor, nonprogresscolor: uicolor) { switch progress { case .empty: progresslayers.foreach { $0.fillcolor = nonprogresscolor.cgcolor } case let .filled(num): progresslayers.dropfirst(num).foreach { $0.fillcolor = nonprogresscolor.cgcolor } progresslayers.droplast(progresslayers.count - num).foreach { $0.fillcolor = progresscolor.cgcolor } case .full : progresslayers.foreach { $0.fillcolor = progresscolor.cgcolor } } } private func redrawsteps(step: int) { progresslayers.foreach { $0.removefromsuperlayer() } progresslayers.removeall() if step == 0 { let layer = cashapelayer() layer.frame = self.bounds progresslayers.append(layer) } else { var topleft = cgpoint(x: 0, y: 0) let cgstep = cgfloat(step) let avaiblewidth = self.bounds.width - (2 * (cgstep - 1)) let spaceperstep = avaiblewidth / cgstep let height = bounds.height let halfheight = height / 2 in 0..<step { let layer = cashapelayer() let bezier = uibezierpath() bezier.move(to: topleft) bezier.addline(to: cgpoint(x: topleft.x + spaceperstep, y: topleft.y)) if + 1 != step { bezier.addline(to: cgpoint(x: topleft.x + spaceperstep + tip, y: topleft.y + halfheight)) } bezier.addline(to: cgpoint(x: topleft.x + spaceperstep, y: topleft.y + height)) bezier.addline(to: cgpoint(x: topleft.x, y: topleft.y + height)) if != 0 { bezier.addline(to: cgpoint(x: topleft.x + tip, y: topleft.y + halfheight)) } bezier.close() layer.path = bezier.cgpath progresslayers.append(layer) self.layer.addsublayer(layer) topleft.x = topleft.x + spaceperstep + 2 } } } override func layoutsubviews() { redrawsteps(step: numberofsteps) updatecolor(progresscolor: progresscolor ?? tintcolor, nonprogresscolor: nonprogresscolor) } } all have take uiview storyboard , make custom class staticload. can specify number of bars in progress bar changing numberofsteps property either code or storyboard, , fill of bar filledprogress
if want bigger arrow, change tip property, or specify path bezierpath.
if don't know, @ibdesignable (it recommended if class designable should put in framework rather same project due continuous compilation) allows storyboard render view , @ibinspectable allow set variable through storyboard.
this working not-optimized example.
Comments
Post a Comment