From dcd87fb924928564f6289985c2b50b52119e7a00 Mon Sep 17 00:00:00 2001 From: panxi Date: Mon, 9 Sep 2019 16:42:38 -0400 Subject: [PATCH 1/5] add MultiProgress --- MVMCoreUI.xcodeproj/project.pbxproj | 4 ++ MVMCoreUI/Atoms/Views/MultiProgress.swift | 66 +++++++++++++++++++ .../MVMCoreUIMoleculeMappingObject.m | 1 + 3 files changed, 71 insertions(+) create mode 100644 MVMCoreUI/Atoms/Views/MultiProgress.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 9768fcf8..9f804c22 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ 01DF567021FA5AB300CC099B /* TextFieldListFormViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */; }; 01E569D3223FFFA500327251 /* ThreeLayerViewController.swift in Headers */ = {isa = PBXBuildFile; fileRef = D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */; settings = {ATTRIBUTES = (Public, ); }; }; 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */; }; + 948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948DB67D2326DCD90011F916 /* MultiProgress.swift */; }; B8200E152280C4CF007245F4 /* ProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8200E142280C4CF007245F4 /* ProgressBar.swift */; }; B8200E192281DC1A007245F4 /* CornerLabels.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8200E182281DC1A007245F4 /* CornerLabels.swift */; }; D206997721FB8A0B00CAE0DE /* MVMCoreUINavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -200,6 +201,7 @@ 01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MFTextFieldListView.swift; sourceTree = ""; }; 01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldListFormViewController.swift; sourceTree = ""; }; 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = ""; }; + 948DB67D2326DCD90011F916 /* MultiProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiProgress.swift; sourceTree = ""; }; B8200E142280C4CF007245F4 /* ProgressBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressBar.swift; sourceTree = ""; }; B8200E182281DC1A007245F4 /* CornerLabels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CornerLabels.swift; sourceTree = ""; }; D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUINavigationController.h; sourceTree = ""; }; @@ -681,6 +683,7 @@ D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */, D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */, B8200E142280C4CF007245F4 /* ProgressBar.swift */, + 948DB67D2326DCD90011F916 /* MultiProgress.swift */, DBC4391622442196001AB423 /* CaretView.swift */, DBC4391722442197001AB423 /* DashLine.swift */, DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */, @@ -1068,6 +1071,7 @@ D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */, D2B1E3E522F37D6A0065F95C /* ImageHeadlineBody.swift in Sources */, D29DF2AA21E7B2F9003B2FB9 /* MVMCoreUIConstants.m in Sources */, + 948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */, D2A5146122121FBF00345BFB /* MoleculeStackTemplate.swift in Sources */, D29DF11821E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m in Sources */, D29DF26C21E6AA0B003B2FB9 /* FLAnimatedImage.m in Sources */, diff --git a/MVMCoreUI/Atoms/Views/MultiProgress.swift b/MVMCoreUI/Atoms/Views/MultiProgress.swift new file mode 100644 index 00000000..eac13ce2 --- /dev/null +++ b/MVMCoreUI/Atoms/Views/MultiProgress.swift @@ -0,0 +1,66 @@ +// +// MultiProgress.swift +// MVMCoreUI +// +// Created by Ryan on 9/9/19. +// Copyright © 2019 Verizon Wireless. All rights reserved. +// + +import UIKit + +@objcMembers open class MultiProgress: MFView { + + var progressList = Array<[AnyHashable: Any]>() + var roundedRect : Bool = false + var thicknessConstraint : NSLayoutConstraint? + + let defaultHeight : CGFloat = 8 + + override open func setupView() { + super.setupView() + translatesAutoresizingMaskIntoConstraints = false + backgroundColor = .mfSilver() + clipsToBounds = true + } + + 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 + + if let rounded = json?.optionalBoolForKey("roundedRect") { + self.roundedRect = rounded + self.layer.cornerRadius = (thicknessConstraint?.constant ?? defaultHeight)/2 + } + 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) + } + guard previous != nil else {return} + let constraint = trailingAnchor.constraint(equalTo: previous!.trailingAnchor) + constraint.priority = UILayoutPriority(800) + constraint.isActive = true + } + } +} diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m index 9175781b..ca9c1e66 100644 --- a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m +++ b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m @@ -41,6 +41,7 @@ @"checkbox" : MVMCoreUICheckBox.class, @"cornerLabels" : CornerLabels.class, @"progressBar": ProgressBar.class, + @"multiProgress": MultiProgress.class, @"checkbox": MVMCoreUICheckBox.class, @"listItem": MoleculeTableViewCell.class, @"accordionListItem": AccordionMoleculeTableViewCell.class, From 595a3b1e38362f3b47f849a7db49ea664ef8e5c3 Mon Sep 17 00:00:00 2001 From: panxi Date: Mon, 9 Sep 2019 16:49:12 -0400 Subject: [PATCH 2/5] fix typo --- MVMCoreUI/Atoms/Views/MultiProgress.swift | 4 ++-- MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/MultiProgress.swift b/MVMCoreUI/Atoms/Views/MultiProgress.swift index eac13ce2..ac801ec7 100644 --- a/MVMCoreUI/Atoms/Views/MultiProgress.swift +++ b/MVMCoreUI/Atoms/Views/MultiProgress.swift @@ -33,8 +33,8 @@ import UIKit constraint.isActive = true thicknessConstraint = constraint - if let rounded = json?.optionalBoolForKey("roundedRect") { - self.roundedRect = rounded + self.roundedRect = json?.optionalBoolForKey("roundedRect") ?? false + if self.roundedRect { self.layer.cornerRadius = (thicknessConstraint?.constant ?? defaultHeight)/2 } if let list = json?.optionalArrayForKey("progressList") as? [[AnyHashable: Any]] { diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m index ca9c1e66..31943a79 100644 --- a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m +++ b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m @@ -41,7 +41,7 @@ @"checkbox" : MVMCoreUICheckBox.class, @"cornerLabels" : CornerLabels.class, @"progressBar": ProgressBar.class, - @"multiProgress": MultiProgress.class, + @"multiProgressBar": MultiProgress.class, @"checkbox": MVMCoreUICheckBox.class, @"listItem": MoleculeTableViewCell.class, @"accordionListItem": AccordionMoleculeTableViewCell.class, From d52e2047218f6c4fb518b0203348037730ff1a43 Mon Sep 17 00:00:00 2001 From: panxi Date: Tue, 10 Sep 2019 15:57:00 -0400 Subject: [PATCH 3/5] update multiprogressbar --- MVMCoreUI/Atoms/Views/MultiProgress.swift | 101 +++++++++++++--------- 1 file changed, 61 insertions(+), 40 deletions(-) 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 + } +} From 358842e43363dfb89000fad480e92a5c644846f6 Mon Sep 17 00:00:00 2001 From: panxi Date: Wed, 11 Sep 2019 10:04:19 -0400 Subject: [PATCH 4/5] update based on Scott's comment --- MVMCoreUI/Atoms/Views/MultiProgress.swift | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/MultiProgress.swift b/MVMCoreUI/Atoms/Views/MultiProgress.swift index 05aedcc1..de40a6b1 100644 --- a/MVMCoreUI/Atoms/Views/MultiProgress.swift +++ b/MVMCoreUI/Atoms/Views/MultiProgress.swift @@ -38,10 +38,18 @@ import UIKit super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) 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 { + setupProgressList(json?.optionalArrayForKey("progressList") as? [[AnyHashable: Any]]) + } + + func setupProgressList(_ list: [[AnyHashable: Any]]?) { + for subview in subviews { + subview.removeFromSuperview() + } + let progressObjectList = ProgressBarObject.getProgressBarObjectList(list) + progressList = progressObjectList + guard (progressList?.count ?? 0) > 0 else { return } - progressList = progressObjectList var previous: UIView? for progressObject in progressList! { guard progressObject.progress > 0.0 else { @@ -61,7 +69,7 @@ import UIKit @objcMembers open class ProgressBarObject { - ///form 0.0 to 1.0. input progress should be [0 100] + ///from 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() From f69fe85d8334fc17aa40d2f82f6a289121f7a6ff Mon Sep 17 00:00:00 2001 From: panxi Date: Wed, 11 Sep 2019 10:19:03 -0400 Subject: [PATCH 5/5] update based on Scott's comment --- MVMCoreUI/Atoms/Views/MultiProgress.swift | 108 +++++++++++----------- 1 file changed, 53 insertions(+), 55 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/MultiProgress.swift b/MVMCoreUI/Atoms/Views/MultiProgress.swift index de40a6b1..619e31e7 100644 --- a/MVMCoreUI/Atoms/Views/MultiProgress.swift +++ b/MVMCoreUI/Atoms/Views/MultiProgress.swift @@ -8,9 +8,59 @@ import UIKit -@objcMembers open class MultiProgress: MFView { +@objcMembers open class ProgressBarObject { + ///from 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 + } +} - var progressList: Array? +@objcMembers open class MultiProgress: MFView { + ///passing value to progressList creates corresponding progress bars + var progressList: Array? { + didSet { + for subview in subviews { + subview.removeFromSuperview() + } + guard (progressList?.count ?? 0) > 0 else { + return + } + var previous: UIView? + for progressObject in progressList! { + guard progressObject.progress > 0.0 else { + continue + } + 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) + } + } + } + var roundedRect: Bool = false { didSet { if roundedRect { @@ -38,58 +88,6 @@ import UIKit super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) thicknessConstraint?.constant = json?.optionalCGFloatForKey("thickness") ?? defaultHeight roundedRect = json?.optionalBoolForKey("roundedRect") ?? false - setupProgressList(json?.optionalArrayForKey("progressList") as? [[AnyHashable: Any]]) - } - - func setupProgressList(_ list: [[AnyHashable: Any]]?) { - for subview in subviews { - subview.removeFromSuperview() - } - let progressObjectList = ProgressBarObject.getProgressBarObjectList(list) - progressList = progressObjectList - guard (progressList?.count ?? 0) > 0 else { - return - } - var previous: UIView? - for progressObject in progressList! { - guard progressObject.progress > 0.0 else { - continue - } - 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 { - ///from 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 + progressList = ProgressBarObject.getProgressBarObjectList(json?.optionalArrayForKey("progressList") as? [[AnyHashable: Any]]) } }