diff --git a/MVMCoreUI/Atoms/Views/MultiProgress.swift b/MVMCoreUI/Atoms/Views/MultiProgress.swift index ac801ec7..05aedcc1 100644 --- a/MVMCoreUI/Atoms/Views/MultiProgress.swift +++ b/MVMCoreUI/Atoms/Views/MultiProgress.swift @@ -10,57 +10,78 @@ import UIKit @objcMembers open class MultiProgress: MFView { - var progressList = Array<[AnyHashable: Any]>() - var roundedRect : Bool = false - var thicknessConstraint : NSLayoutConstraint? - - let defaultHeight : CGFloat = 8 + var progressList: Array? + var roundedRect: Bool = false { + didSet { + if roundedRect { + layer.cornerRadius = (thicknessConstraint?.constant ?? defaultHeight)/2 + } else { + layer.cornerRadius = 0 + } + } + } + var thicknessConstraint: NSLayoutConstraint? + let defaultHeight: CGFloat = 8 override open func setupView() { super.setupView() translatesAutoresizingMaskIntoConstraints = false backgroundColor = .mfSilver() clipsToBounds = true + if thicknessConstraint == nil { + thicknessConstraint = heightAnchor.constraint(equalToConstant: defaultHeight) + thicknessConstraint?.isActive = true + } } - override open func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { + override open func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) - - thicknessConstraint?.isActive = false - thicknessConstraint = nil - let height = json?.optionalCGFloatForKey("thickness") ?? defaultHeight - let constraint = heightAnchor.constraint(equalToConstant: height) - constraint.isActive = true - thicknessConstraint = constraint - - self.roundedRect = json?.optionalBoolForKey("roundedRect") ?? false - if self.roundedRect { - self.layer.cornerRadius = (thicknessConstraint?.constant ?? defaultHeight)/2 + thicknessConstraint?.constant = json?.optionalCGFloatForKey("thickness") ?? defaultHeight + roundedRect = json?.optionalBoolForKey("roundedRect") ?? false + guard let list = json?.optionalArrayForKey("progressList") as? [[AnyHashable: Any]], let progressObjectList = ProgressBarObject.getProgressBarObjectList(list), progressObjectList.count > 0 else { + return } - if let list = json?.optionalArrayForKey("progressList") as? [[AnyHashable: Any]] { - progressList = list - var previous : UIView? - for module in progressList { - let view = MFView(frame: .zero) - view.translatesAutoresizingMaskIntoConstraints = false - addSubview(view) - view.backgroundColor = UIColor.mfGet(forHex: module.optionalStringForKey("progressColor") ?? "#007bb8") - view.widthAnchor.constraint(equalTo: widthAnchor, multiplier: (module.optionalCGFloatForKey("progress") ?? 0)/100).isActive = true - if previous != nil { - view.leadingAnchor.constraint(equalTo: previous!.trailingAnchor).isActive = true - previous = view - } else { - let constraint = view.leadingAnchor.constraint(equalTo: leadingAnchor) - constraint.priority = UILayoutPriority(rawValue: 900) - constraint.isActive = true - previous = view - } - NSLayoutConstraint.constraintPinSubview(view, pinTop: true, pinBottom: true, pinLeft: false, pinRight: false) + progressList = progressObjectList + var previous: UIView? + for progressObject in progressList! { + guard progressObject.progress > 0.0 else { + continue } - guard previous != nil else {return} - let constraint = trailingAnchor.constraint(equalTo: previous!.trailingAnchor) - constraint.priority = UILayoutPriority(800) - constraint.isActive = true + let view = MFView(frame: .zero) + view.translatesAutoresizingMaskIntoConstraints = false + addSubview(view) + view.backgroundColor = progressObject.color + view.widthAnchor.constraint(equalTo: widthAnchor, multiplier: progressObject.progress).isActive = true + view.leadingAnchor.constraint(equalTo: previous?.trailingAnchor ?? leadingAnchor).isActive = true + previous = view + NSLayoutConstraint.constraintPinSubview(view, pinTop: true, pinBottom: true, pinLeft: false, pinRight: false) } } } + + +@objcMembers open class ProgressBarObject { + ///form 0.0 to 1.0. input progress should be [0 100] + var progress: CGFloat = 0.0 + ///default color is cerulean + var color: UIColor = UIColor.mfCerulean() + + init(_ module: [AnyHashable: Any]?) { + progress = (module?.optionalCGFloatForKey("progress") ?? 0.0)/100 + if let colorString = module?.optionalStringForKey("progressColor") { + color = UIColor.mfGet(forHex: colorString) + } + } + + static func getProgressBarObjectList(_ list: [[AnyHashable: Any]]?) -> [ProgressBarObject]? { + guard list?.count ?? 0 > 0 else { + return nil + } + var progressList = [ProgressBarObject]() + for module in list! { + let progressObject = ProgressBarObject(module) + progressList.append(progressObject) + } + return progressList + } +}