From 52afab36b9137c6c24240fbe599c9c7adcfebf9f Mon Sep 17 00:00:00 2001 From: Cody Winton Date: Fri, 21 Oct 2016 11:31:29 -0500 Subject: [PATCH 01/13] Refactored Progress view for greater customization --- .../UserInterfaceState.xcuserstate | Bin 0 -> 20519 bytes .../xcschemes/LinearProgressBar.xcscheme | 91 ++++++++++++++++++ .../xcschemes/xcschememanagement.plist | 22 +++++ LinearProgressBar/LinearProgressBar.swift | 36 ++++--- LinearProgressBar/ViewController.swift | 11 ++- 5 files changed, 144 insertions(+), 16 deletions(-) create mode 100644 LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 LinearProgressBar.xcodeproj/xcuserdata/iosdev.xcuserdatad/xcschemes/LinearProgressBar.xcscheme create mode 100644 LinearProgressBar.xcodeproj/xcuserdata/iosdev.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate b/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..67fd8922b96e19426384f690756360f51524d1f4 GIT binary patch literal 20519 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LinearProgressBar.xcodeproj/xcuserdata/iosdev.xcuserdatad/xcschemes/xcschememanagement.plist b/LinearProgressBar.xcodeproj/xcuserdata/iosdev.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..2d630f2 --- /dev/null +++ b/LinearProgressBar.xcodeproj/xcuserdata/iosdev.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + LinearProgressBar.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 3721E06A1DA78F1100DC9E8F + + primary + + + + + diff --git a/LinearProgressBar/LinearProgressBar.swift b/LinearProgressBar/LinearProgressBar.swift index 4d0ffa4..79e77ac 100644 --- a/LinearProgressBar/LinearProgressBar.swift +++ b/LinearProgressBar/LinearProgressBar.swift @@ -24,6 +24,16 @@ open class LinearProgressBar: UIView { open var progressBarColor: UIColor = UIColor(red:0.12, green:0.53, blue:0.90, alpha:1.0) open var heightForLinearBar: CGFloat = 5 open var widthForLinearBar: CGFloat = 0 + + open var widthRatioOffset: CGFloat = 0.7 + open var xOffset: CGFloat = 0 + + open var showDuration: TimeInterval = 0.5 + + open var dismissDuration: TimeInterval = 0.5 + + open var keyframeDuration: TimeInterval = 1.0 + public init () { super.init(frame: CGRect(origin: CGPoint(x: 0,y :20), size: CGSize(width: screenSize.width, height: 0))) @@ -60,16 +70,15 @@ open class LinearProgressBar: UIView { //MARK: PUBLIC FUNCTIONS ------------------------------------------------------------------------------------------ //Start the animation - open func startAnimation(){ + open func show(delay: TimeInterval = 0) { self.configureColors() - self.show() if !isAnimationRunning { self.isAnimationRunning = true - UIView.animate(withDuration: 0.5, delay:0, options: [], animations: { + UIView.animate(withDuration: showDuration, delay: delay, options: [], animations: { self.frame = CGRect(x: 0, y: self.frame.origin.y, width: self.widthForLinearBar, height: self.heightForLinearBar) }, completion: { animationFinished in self.addSubview(self.progressBarIndicator) @@ -80,10 +89,10 @@ open class LinearProgressBar: UIView { //Start the animation open func stopAnimation() { - + self.isAnimationRunning = false - - UIView.animate(withDuration: 0.5, animations: { + + UIView.animate(withDuration: dismissDuration, animations: { self.progressBarIndicator.frame = CGRect(x: 0, y: 0, width: self.widthForLinearBar, height: 0) self.frame = CGRect(x: 0, y: self.frame.origin.y, width: self.widthForLinearBar, height: 0) }) @@ -105,8 +114,7 @@ open class LinearProgressBar: UIView { } } - fileprivate func configureColors(){ - + fileprivate func configureColors() { self.backgroundColor = self.backgroundProgressBarColor self.progressBarIndicator.backgroundColor = self.progressBarColor self.layoutIfNeeded() @@ -121,19 +129,19 @@ open class LinearProgressBar: UIView { self.progressBarIndicator.frame = CGRect(origin: CGPoint(x: 0, y :0), size: CGSize(width: 0, height: heightForLinearBar)) - UIView.animateKeyframes(withDuration: 1.0, delay: 0, options: [], animations: { + UIView.animateKeyframes(withDuration: keyframeDuration, delay: 0, options: [], animations: { - UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5, animations: { - self.progressBarIndicator.frame = CGRect(x: 0, y: 0, width: self.widthForLinearBar*0.7, height: self.heightForLinearBar) + UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: self.keyframeDuration/2, animations: { + self.progressBarIndicator.frame = CGRect(x: -self.xOffset, y: 0, width: self.widthForLinearBar * self.widthRatioOffset, height: self.heightForLinearBar) }) - UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5, animations: { - self.progressBarIndicator.frame = CGRect(x: superview.frame.width, y: 0, width: 0, height: self.heightForLinearBar) + UIView.addKeyframe(withRelativeStartTime: self.keyframeDuration/2, relativeDuration: self.keyframeDuration/2, animations: { + self.progressBarIndicator.frame = CGRect(x: superview.frame.width, y: 0, width: self.xOffset, height: self.heightForLinearBar) }) }) { (completed) in - if (self.isAnimationRunning){ + if (self.isAnimationRunning) { self.configureAnimation() } } diff --git a/LinearProgressBar/ViewController.swift b/LinearProgressBar/ViewController.swift index 6f4d358..f098764 100644 --- a/LinearProgressBar/ViewController.swift +++ b/LinearProgressBar/ViewController.swift @@ -22,7 +22,7 @@ class ViewController: UIViewController { } @IBAction func startAnimation(_ sender: AnyObject) { - self.linearBar.startAnimation() + self.linearBar.show() } @IBAction func stopAnimation(_ sender: AnyObject) { @@ -31,10 +31,17 @@ class ViewController: UIViewController { //----- - fileprivate func configureLinearProgressBar(){ + fileprivate func configureLinearProgressBar() { linearBar.backgroundColor = UIColor(red:0.68, green:0.81, blue:0.72, alpha:1.0) linearBar.progressBarColor = UIColor(red:0.26, green:0.65, blue:0.45, alpha:1.0) linearBar.heightForLinearBar = 5 + linearBar.widthRatioOffset = 0.78 + linearBar.xOffset = 15 + + linearBar.showDuration = 0.3 + linearBar.dismissDuration = 0.1 + + linearBar.keyframeDuration = 1.2 } } From 024a5cf09858c3b47a64501008e2dd1373db4c42 Mon Sep 17 00:00:00 2001 From: Cody Winton Date: Fri, 21 Oct 2016 11:42:03 -0500 Subject: [PATCH 02/13] Refactored showing and dismissing --- .../UserInterfaceState.xcuserstate | Bin 20519 -> 20522 bytes LinearProgressBar/LinearProgressBar.swift | 41 ++++++++---------- LinearProgressBar/ViewController.swift | 7 +-- 3 files changed, 20 insertions(+), 28 deletions(-) diff --git a/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate b/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate index 67fd8922b96e19426384f690756360f51524d1f4..d5e67ee6f33b523f74aab69327bde1875db15f31 100644 GIT binary patch delta 8574 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 diff --git a/LinearProgressBar/LinearProgressBar.swift b/LinearProgressBar/LinearProgressBar.swift index 79e77ac..570d5ee 100644 --- a/LinearProgressBar/LinearProgressBar.swift +++ b/LinearProgressBar/LinearProgressBar.swift @@ -28,10 +28,6 @@ open class LinearProgressBar: UIView { open var widthRatioOffset: CGFloat = 0.7 open var xOffset: CGFloat = 0 - open var showDuration: TimeInterval = 0.5 - - open var dismissDuration: TimeInterval = 0.5 - open var keyframeDuration: TimeInterval = 1.0 @@ -58,19 +54,19 @@ open class LinearProgressBar: UIView { widthForLinearBar = self.screenSize.width } - if (UIDeviceOrientationIsLandscape(UIDevice.current.orientation)) { - self.frame = CGRect(origin: CGPoint(x: self.frame.origin.x,y :self.frame.origin.y), size: CGSize(width: widthForLinearBar, height: self.frame.height)) + if UIDeviceOrientationIsLandscape(UIDevice.current.orientation) { + self.frame = CGRect(origin: self.frame.origin, size: CGSize(width: widthForLinearBar, height: self.frame.height)) } - if (UIDeviceOrientationIsPortrait(UIDevice.current.orientation)) { - self.frame = CGRect(origin: CGPoint(x: self.frame.origin.x,y :self.frame.origin.y), size: CGSize(width: widthForLinearBar, height: self.frame.height)) + if UIDeviceOrientationIsPortrait(UIDevice.current.orientation) { + self.frame = CGRect(origin: self.frame.origin, size: CGSize(width: widthForLinearBar, height: self.frame.height)) } } //MARK: PUBLIC FUNCTIONS ------------------------------------------------------------------------------------------ //Start the animation - open func show(delay: TimeInterval = 0) { + open func show(duration: TimeInterval = 0.5, delay: TimeInterval = 0) { self.configureColors() self.show() @@ -78,24 +74,24 @@ open class LinearProgressBar: UIView { if !isAnimationRunning { self.isAnimationRunning = true - UIView.animate(withDuration: showDuration, delay: delay, options: [], animations: { + UIView.animate(withDuration: duration, delay: delay, options: [], animations: { self.frame = CGRect(x: 0, y: self.frame.origin.y, width: self.widthForLinearBar, height: self.heightForLinearBar) - }, completion: { animationFinished in - self.addSubview(self.progressBarIndicator) - self.configureAnimation() - }) + }) { animationFinished in + self.addSubview(self.progressBarIndicator) + self.configureAnimation() + } } } //Start the animation - open func stopAnimation() { + open func dismiss(duration: TimeInterval = 0.5) { self.isAnimationRunning = false - UIView.animate(withDuration: dismissDuration, animations: { + UIView.animate(withDuration: duration) { self.progressBarIndicator.frame = CGRect(x: 0, y: 0, width: self.widthForLinearBar, height: 0) self.frame = CGRect(x: 0, y: self.frame.origin.y, width: self.widthForLinearBar, height: 0) - }) + } } //MARK: PRIVATE FUNCTIONS ------------------------------------------------------------------------------------------ @@ -123,7 +119,7 @@ open class LinearProgressBar: UIView { fileprivate func configureAnimation() { guard let superview = self.superview else { - stopAnimation() + dismiss() return } @@ -131,14 +127,13 @@ open class LinearProgressBar: UIView { UIView.animateKeyframes(withDuration: keyframeDuration, delay: 0, options: [], animations: { - UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: self.keyframeDuration/2, animations: { + UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: self.keyframeDuration/2) { self.progressBarIndicator.frame = CGRect(x: -self.xOffset, y: 0, width: self.widthForLinearBar * self.widthRatioOffset, height: self.heightForLinearBar) - }) + } - UIView.addKeyframe(withRelativeStartTime: self.keyframeDuration/2, relativeDuration: self.keyframeDuration/2, animations: { + UIView.addKeyframe(withRelativeStartTime: self.keyframeDuration/2, relativeDuration: self.keyframeDuration/2) { self.progressBarIndicator.frame = CGRect(x: superview.frame.width, y: 0, width: self.xOffset, height: self.heightForLinearBar) - - }) + } }) { (completed) in if (self.isAnimationRunning) { diff --git a/LinearProgressBar/ViewController.swift b/LinearProgressBar/ViewController.swift index f098764..966d610 100644 --- a/LinearProgressBar/ViewController.swift +++ b/LinearProgressBar/ViewController.swift @@ -22,11 +22,11 @@ class ViewController: UIViewController { } @IBAction func startAnimation(_ sender: AnyObject) { - self.linearBar.show() + self.linearBar.show(duration: 0.3, delay: 0.0) } @IBAction func stopAnimation(_ sender: AnyObject) { - self.linearBar.stopAnimation() + self.linearBar.dismiss(duration: 0.3) } //----- @@ -38,9 +38,6 @@ class ViewController: UIViewController { linearBar.widthRatioOffset = 0.78 linearBar.xOffset = 15 - linearBar.showDuration = 0.3 - linearBar.dismissDuration = 0.1 - linearBar.keyframeDuration = 1.2 } } From c75324cae28d4058c8776843cc888d85dbb69aed Mon Sep 17 00:00:00 2001 From: Cody Winton Date: Fri, 21 Oct 2016 14:09:24 -0500 Subject: [PATCH 03/13] View Controller updates --- .../UserInterfaceState.xcuserstate | Bin 20522 -> 20713 bytes LinearProgressBar/ViewController.swift | 27 +++++++++--------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate b/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate index d5e67ee6f33b523f74aab69327bde1875db15f31..2d58f0467baf504ed5e3e05df719a059d506a500 100644 GIT binary patch delta 9131 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 delta 8957 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 diff --git a/LinearProgressBar/ViewController.swift b/LinearProgressBar/ViewController.swift index 966d610..7e8af4d 100644 --- a/LinearProgressBar/ViewController.swift +++ b/LinearProgressBar/ViewController.swift @@ -10,11 +10,22 @@ import UIKit class ViewController: UIViewController { - let linearBar: LinearProgressBar = LinearProgressBar() + var linearBar: LinearProgressBar = { + + var bar = LinearProgressBar(frame: CGRect(x: 10, y: UIScreen.main.bounds.height - 200, width: UIScreen.main.bounds.width - 20, height: 0)) + + bar.backgroundColor = UIColor(red:0.68, green:0.81, blue:0.72, alpha:1.0) + bar.progressBarColor = UIColor(red:0.26, green:0.65, blue:0.45, alpha:1.0) + bar.heightForLinearBar = 5 + bar.widthRatioOffset = 0.78 + bar.xOffset = 15 + bar.keyframeDuration = 1.2 + + return bar + }() override func viewDidLoad() { super.viewDidLoad() - self.configureLinearProgressBar() } override func didReceiveMemoryWarning() { @@ -28,17 +39,5 @@ class ViewController: UIViewController { @IBAction func stopAnimation(_ sender: AnyObject) { self.linearBar.dismiss(duration: 0.3) } - - //----- - - fileprivate func configureLinearProgressBar() { - linearBar.backgroundColor = UIColor(red:0.68, green:0.81, blue:0.72, alpha:1.0) - linearBar.progressBarColor = UIColor(red:0.26, green:0.65, blue:0.45, alpha:1.0) - linearBar.heightForLinearBar = 5 - linearBar.widthRatioOffset = 0.78 - linearBar.xOffset = 15 - - linearBar.keyframeDuration = 1.2 - } } From 2a1a02c12e51093d6c8d1c1f3202af1f438e0551 Mon Sep 17 00:00:00 2001 From: Cody Winton Date: Fri, 21 Oct 2016 14:12:45 -0500 Subject: [PATCH 04/13] Refactored view to rely on view frame for size animations --- LinearProgressBar/LinearProgressBar.swift | 83 ++++++++++------------- 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/LinearProgressBar/LinearProgressBar.swift b/LinearProgressBar/LinearProgressBar.swift index 570d5ee..4b6beb0 100644 --- a/LinearProgressBar/LinearProgressBar.swift +++ b/LinearProgressBar/LinearProgressBar.swift @@ -10,10 +10,13 @@ import UIKit +fileprivate var screenSize: CGRect { + return UIScreen.main.bounds +} + open class LinearProgressBar: UIView { //FOR DATA - fileprivate var screenSize: CGRect = UIScreen.main.bounds fileprivate var isAnimationRunning = false //FOR DESIGN @@ -23,7 +26,6 @@ open class LinearProgressBar: UIView { open var backgroundProgressBarColor: UIColor = UIColor(red:0.73, green:0.87, blue:0.98, alpha:1.0) open var progressBarColor: UIColor = UIColor(red:0.12, green:0.53, blue:0.90, alpha:1.0) open var heightForLinearBar: CGFloat = 5 - open var widthForLinearBar: CGFloat = 0 open var widthRatioOffset: CGFloat = 0.7 open var xOffset: CGFloat = 0 @@ -31,14 +33,14 @@ open class LinearProgressBar: UIView { open var keyframeDuration: TimeInterval = 1.0 - public init () { - super.init(frame: CGRect(origin: CGPoint(x: 0,y :20), size: CGSize(width: screenSize.width, height: 0))) - self.progressBarIndicator = UIView(frame: CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 0, height: heightForLinearBar))) + public convenience init() { + self.init(frame: CGRect(origin: CGPoint(x: 0,y :20), size: CGSize(width: screenSize.width, height: 0))) } override public init(frame: CGRect) { super.init(frame: frame) - self.progressBarIndicator = UIView(frame: CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 0, height: heightForLinearBar))) + self.progressBarIndicator = UIView(frame: CGRect(origin: CGPoint(x: 0, y:0), size: CGSize(width: 0, height: heightForLinearBar))) + self.clipsToBounds = true } required public init?(coder aDecoder: NSCoder) { @@ -48,19 +50,14 @@ open class LinearProgressBar: UIView { //MARK: LIFE OF VIEW override open func layoutSubviews() { super.layoutSubviews() - self.screenSize = UIScreen.main.bounds - - if widthForLinearBar == 0 || widthForLinearBar == self.screenSize.height { - widthForLinearBar = self.screenSize.width - } - - if UIDeviceOrientationIsLandscape(UIDevice.current.orientation) { - self.frame = CGRect(origin: self.frame.origin, size: CGSize(width: widthForLinearBar, height: self.frame.height)) - } + + var rect = self.frame - if UIDeviceOrientationIsPortrait(UIDevice.current.orientation) { - self.frame = CGRect(origin: self.frame.origin, size: CGSize(width: widthForLinearBar, height: self.frame.height)) + if rect.width == 0 || rect.width == screenSize.height { + rect.size.width = screenSize.width } + + self.frame = rect } //MARK: PUBLIC FUNCTIONS ------------------------------------------------------------------------------------------ @@ -70,44 +67,36 @@ open class LinearProgressBar: UIView { self.configureColors() self.show() - - if !isAnimationRunning { - self.isAnimationRunning = true - - UIView.animate(withDuration: duration, delay: delay, options: [], animations: { - self.frame = CGRect(x: 0, y: self.frame.origin.y, width: self.widthForLinearBar, height: self.heightForLinearBar) - }) { animationFinished in - self.addSubview(self.progressBarIndicator) - self.configureAnimation() - } - } + + guard !isAnimationRunning else {return} + self.isAnimationRunning = true + + UIView.animate(withDuration: duration, delay: delay, options: [], animations: { + self.frame = CGRect(origin: self.frame.origin, size: CGSize(width: self.frame.width, height: self.heightForLinearBar)) + }) { animationFinished in + self.addSubview(self.progressBarIndicator) + self.configureAnimation() + } } - + //Start the animation open func dismiss(duration: TimeInterval = 0.5) { + guard isAnimationRunning else {return} self.isAnimationRunning = false - UIView.animate(withDuration: duration) { - self.progressBarIndicator.frame = CGRect(x: 0, y: 0, width: self.widthForLinearBar, height: 0) - self.frame = CGRect(x: 0, y: self.frame.origin.y, width: self.widthForLinearBar, height: 0) - } + UIView.animate(withDuration: duration, animations: { + self.frame = CGRect(x: 0, y: self.frame.origin.y, width: self.frame.width, height: 0) + }) { (finished: Bool) in + self.progressBarIndicator.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: 0) + } } //MARK: PRIVATE FUNCTIONS ------------------------------------------------------------------------------------------ fileprivate func show() { - - // Only show once - if self.superview != nil { - return - } - - // Find current top viewcontroller - if let topController = getTopViewController() { - let superView: UIView = topController.view - superView.addSubview(self) - } + guard self.superview == nil, let view = getTopViewController()?.view else {return} + view.addSubview(self) } fileprivate func configureColors() { @@ -118,7 +107,7 @@ open class LinearProgressBar: UIView { fileprivate func configureAnimation() { - guard let superview = self.superview else { + guard let _ = self.superview else { dismiss() return } @@ -128,11 +117,11 @@ open class LinearProgressBar: UIView { UIView.animateKeyframes(withDuration: keyframeDuration, delay: 0, options: [], animations: { UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: self.keyframeDuration/2) { - self.progressBarIndicator.frame = CGRect(x: -self.xOffset, y: 0, width: self.widthForLinearBar * self.widthRatioOffset, height: self.heightForLinearBar) + self.progressBarIndicator.frame = CGRect(x: -self.xOffset, y: 0, width: self.frame.width * self.widthRatioOffset, height: self.heightForLinearBar) } UIView.addKeyframe(withRelativeStartTime: self.keyframeDuration/2, relativeDuration: self.keyframeDuration/2) { - self.progressBarIndicator.frame = CGRect(x: superview.frame.width, y: 0, width: self.xOffset, height: self.heightForLinearBar) + self.progressBarIndicator.frame = CGRect(x: self.frame.width, y: 0, width: self.xOffset, height: self.heightForLinearBar) } }) { (completed) in From 903a5210a71d6c98d3c26d7fde1130ecca0da8b0 Mon Sep 17 00:00:00 2001 From: Cody Winton Date: Fri, 21 Oct 2016 14:22:10 -0500 Subject: [PATCH 05/13] Minor update to view frame --- .../UserInterfaceState.xcuserstate | Bin 20713 -> 20721 bytes LinearProgressBar/LinearProgressBar.swift | 12 +++++++++--- LinearProgressBar/ViewController.swift | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate b/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate index 2d58f0467baf504ed5e3e05df719a059d506a500..920aff4c7a75c81220b4894f29b007b2a19506e2 100644 GIT binary patch delta 2119 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 K?b;%)(|-XVtk}K) diff --git a/LinearProgressBar/LinearProgressBar.swift b/LinearProgressBar/LinearProgressBar.swift index 4b6beb0..da95236 100644 --- a/LinearProgressBar/LinearProgressBar.swift +++ b/LinearProgressBar/LinearProgressBar.swift @@ -71,8 +71,11 @@ open class LinearProgressBar: UIView { guard !isAnimationRunning else {return} self.isAnimationRunning = true + var rect = self.frame + rect.size.height = self.heightForLinearBar + UIView.animate(withDuration: duration, delay: delay, options: [], animations: { - self.frame = CGRect(origin: self.frame.origin, size: CGSize(width: self.frame.width, height: self.heightForLinearBar)) + self.frame = rect }) { animationFinished in self.addSubview(self.progressBarIndicator) self.configureAnimation() @@ -85,8 +88,11 @@ open class LinearProgressBar: UIView { guard isAnimationRunning else {return} self.isAnimationRunning = false - UIView.animate(withDuration: duration, animations: { - self.frame = CGRect(x: 0, y: self.frame.origin.y, width: self.frame.width, height: 0) + var rect = self.frame + rect.size.height = 0 + + UIView.animate(withDuration: duration, animations: { + self.frame = rect }) { (finished: Bool) in self.progressBarIndicator.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: 0) } diff --git a/LinearProgressBar/ViewController.swift b/LinearProgressBar/ViewController.swift index 7e8af4d..3edb7b9 100644 --- a/LinearProgressBar/ViewController.swift +++ b/LinearProgressBar/ViewController.swift @@ -26,6 +26,7 @@ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + self.view.addSubview(linearBar) } override func didReceiveMemoryWarning() { From 282985035481a35a71ca11abc591f40d474a859b Mon Sep 17 00:00:00 2001 From: Cody Winton Date: Fri, 21 Oct 2016 15:20:53 -0500 Subject: [PATCH 06/13] Added Specific Progress functionality --- .../UserInterfaceState.xcuserstate | Bin 20721 -> 23141 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 19 +++++ LinearProgressBar/Base.lproj/Main.storyboard | 66 ++++++++------- LinearProgressBar/LinearProgressBar.swift | 77 ++++++++++++------ LinearProgressBar/ViewController.swift | 14 +++- 5 files changed, 117 insertions(+), 59 deletions(-) create mode 100644 LinearProgressBar.xcodeproj/xcuserdata/iosdev.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist diff --git a/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate b/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate index 920aff4c7a75c81220b4894f29b007b2a19506e2..0515ed9557c5b86146008186ebb618ec96dafc98 100644 GIT binary patch literal 23141 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 literal 20721 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 diff --git a/LinearProgressBar.xcodeproj/xcuserdata/iosdev.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/LinearProgressBar.xcodeproj/xcuserdata/iosdev.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..b7f7d03 --- /dev/null +++ b/LinearProgressBar.xcodeproj/xcuserdata/iosdev.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/LinearProgressBar/Base.lproj/Main.storyboard b/LinearProgressBar/Base.lproj/Main.storyboard index bb8673b..bf639cf 100644 --- a/LinearProgressBar/Base.lproj/Main.storyboard +++ b/LinearProgressBar/Base.lproj/Main.storyboard @@ -1,10 +1,8 @@ - - + + - - @@ -20,57 +18,63 @@ - - - - - + - - - - - - - - - - - - - - + + + + + + + + + - + - - - diff --git a/LinearProgressBar/LinearProgressBar.swift b/LinearProgressBar/LinearProgressBar.swift index da95236..53df33e 100644 --- a/LinearProgressBar/LinearProgressBar.swift +++ b/LinearProgressBar/LinearProgressBar.swift @@ -17,29 +17,32 @@ fileprivate var screenSize: CGRect { open class LinearProgressBar: UIView { //FOR DATA + fileprivate var heightForLinearBar: CGFloat fileprivate var isAnimationRunning = false //FOR DESIGN - fileprivate var progressBarIndicator: UIView! - + fileprivate lazy var progressBarIndicator: UIView = { + let frame = CGRect(origin: CGPoint(x: 0, y:0), size: CGSize(width: 0, height: self.heightForLinearBar)) + return UIView(frame: frame) + }() + //PUBLIC VARS - open var backgroundProgressBarColor: UIColor = UIColor(red:0.73, green:0.87, blue:0.98, alpha:1.0) open var progressBarColor: UIColor = UIColor(red:0.12, green:0.53, blue:0.90, alpha:1.0) - open var heightForLinearBar: CGFloat = 5 open var widthRatioOffset: CGFloat = 0.7 open var xOffset: CGFloat = 0 open var keyframeDuration: TimeInterval = 1.0 - - public convenience init() { - self.init(frame: CGRect(origin: CGPoint(x: 0,y :20), size: CGSize(width: screenSize.width, height: 0))) + public convenience init(height: CGFloat = 5) { + self.init(frame: CGRect(origin: CGPoint(x: 0,y :20), size: CGSize(width: screenSize.width, height: height))) } override public init(frame: CGRect) { - super.init(frame: frame) - self.progressBarIndicator = UIView(frame: CGRect(origin: CGPoint(x: 0, y:0), size: CGSize(width: 0, height: heightForLinearBar))) + heightForLinearBar = frame.height + var frame = frame + frame.size.height = 0 + super.init(frame: frame) self.clipsToBounds = true } @@ -58,14 +61,15 @@ open class LinearProgressBar: UIView { } self.frame = rect + + heightForLinearBar = self.frame.height } //MARK: PUBLIC FUNCTIONS ------------------------------------------------------------------------------------------ - //Start the animation + //Start the animation open func show(duration: TimeInterval = 0.5, delay: TimeInterval = 0) { - self.configureColors() self.show() guard !isAnimationRunning else {return} @@ -78,15 +82,40 @@ open class LinearProgressBar: UIView { self.frame = rect }) { animationFinished in self.addSubview(self.progressBarIndicator) - self.configureAnimation() + self.configureAnimations() } } - //Start the animation + //Animate specific progress value + open func showProgress(progress: CGFloat, duration: TimeInterval = 0.5) { + + self.show() + + self.isAnimationRunning = false + + var rect = self.frame + rect.size.height = self.heightForLinearBar + + var progressRect = self.progressBarIndicator.frame + progressRect.origin = CGPoint.zero + self.progressBarIndicator.frame = progressRect + + progressRect.size.width = self.frame.width * progress + + UIView.animate(withDuration: duration, delay: 0, options: [], animations: { + self.frame = rect + }) { animationFinished in + self.addSubview(self.progressBarIndicator) + UIView.animate(withDuration: duration) { + self.progressBarIndicator.frame = progressRect + } + } + } + + //Stop the animation open func dismiss(duration: TimeInterval = 0.5) { - guard isAnimationRunning else {return} - self.isAnimationRunning = false + self.isAnimationRunning = false var rect = self.frame rect.size.height = 0 @@ -94,24 +123,21 @@ open class LinearProgressBar: UIView { UIView.animate(withDuration: duration, animations: { self.frame = rect }) { (finished: Bool) in - self.progressBarIndicator.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: 0) + self.progressBarIndicator.removeFromSuperview() } } //MARK: PRIVATE FUNCTIONS ------------------------------------------------------------------------------------------ fileprivate func show() { + self.progressBarIndicator.backgroundColor = self.progressBarColor + self.layoutIfNeeded() + guard self.superview == nil, let view = getTopViewController()?.view else {return} view.addSubview(self) } - fileprivate func configureColors() { - self.backgroundColor = self.backgroundProgressBarColor - self.progressBarIndicator.backgroundColor = self.progressBarColor - self.layoutIfNeeded() - } - - fileprivate func configureAnimation() { + fileprivate func configureAnimations() { guard let _ = self.superview else { dismiss() @@ -131,9 +157,8 @@ open class LinearProgressBar: UIView { } }) { (completed) in - if (self.isAnimationRunning) { - self.configureAnimation() - } + guard self.isAnimationRunning else {return} + self.configureAnimations() } } diff --git a/LinearProgressBar/ViewController.swift b/LinearProgressBar/ViewController.swift index 3edb7b9..5073522 100644 --- a/LinearProgressBar/ViewController.swift +++ b/LinearProgressBar/ViewController.swift @@ -12,17 +12,18 @@ class ViewController: UIViewController { var linearBar: LinearProgressBar = { - var bar = LinearProgressBar(frame: CGRect(x: 10, y: UIScreen.main.bounds.height - 200, width: UIScreen.main.bounds.width - 20, height: 0)) + var bar = LinearProgressBar(frame: CGRect(x: 10, y: UIScreen.main.bounds.height - 200, width: UIScreen.main.bounds.width - 20, height: 5)) bar.backgroundColor = UIColor(red:0.68, green:0.81, blue:0.72, alpha:1.0) bar.progressBarColor = UIColor(red:0.26, green:0.65, blue:0.45, alpha:1.0) - bar.heightForLinearBar = 5 bar.widthRatioOffset = 0.78 bar.xOffset = 15 bar.keyframeDuration = 1.2 return bar }() + + var currentProgress: CGFloat = 0 override func viewDidLoad() { super.viewDidLoad() @@ -32,6 +33,15 @@ class ViewController: UIViewController { override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } + + @IBAction func advanceProgress(_ sender: AnyObject) { + currentProgress += 0.25 + if currentProgress > 1 { + currentProgress = 0 + } + + self.linearBar.showProgress(progress: currentProgress, duration: 0.3) + } @IBAction func startAnimation(_ sender: AnyObject) { self.linearBar.show(duration: 0.3, delay: 0.0) From c2adb07860aa30f022788b2c507828733f589284 Mon Sep 17 00:00:00 2001 From: Cody Winton Date: Fri, 21 Oct 2016 16:18:17 -0500 Subject: [PATCH 07/13] UIWindow Extension added --- LinearProgressBar/LinearProgressBar.swift | 56 +++++++++++++++++------ 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/LinearProgressBar/LinearProgressBar.swift b/LinearProgressBar/LinearProgressBar.swift index 53df33e..f55f615 100644 --- a/LinearProgressBar/LinearProgressBar.swift +++ b/LinearProgressBar/LinearProgressBar.swift @@ -133,7 +133,7 @@ open class LinearProgressBar: UIView { self.progressBarIndicator.backgroundColor = self.progressBarColor self.layoutIfNeeded() - guard self.superview == nil, let view = getTopViewController()?.view else {return} + guard self.superview == nil, let view = UIApplication.shared.keyWindow?.visibleViewController?.view else {return} view.addSubview(self) } @@ -161,16 +161,46 @@ open class LinearProgressBar: UIView { self.configureAnimations() } } - - // ----------------------------------------------------- - //MARK: UTILS --------------------------------------- - // ----------------------------------------------------- - - fileprivate func getTopViewController() -> UIViewController? { - var topController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController - while topController?.presentedViewController != nil { - topController = topController?.presentedViewController - } - return topController - } +} + + +// MARK: - + +fileprivate extension UIWindow { + + /** + Returns the currently visible view controller + + - returns: The visible view controller + */ + var visibleViewController: UIViewController? { + return getVisibleViewController(forRootController: rootViewController) + } + + /** + Returns the visible view controller + + - parameters: + - currentRootViewController: Current Root View Controller + - returns: The visible view controller + */ + func getVisibleViewController(forRootController currentRootViewController: UIViewController?) -> UIViewController? { + + guard let controller = currentRootViewController else {return nil} + + switch controller { + + case let navVC as UINavigationController: + return getVisibleViewController(forRootController: navVC.viewControllers.last) + + case let tabVC as UITabBarController: + return getVisibleViewController(forRootController: tabVC.selectedViewController) + + case let controller where controller.presentedViewController != nil: + return getVisibleViewController(forRootController: controller.presentedViewController) + + default: + return controller + } + } } From 52da0a1ec05690834a9988cfa3beb3f4bf97c009 Mon Sep 17 00:00:00 2001 From: Cody Winton Date: Fri, 21 Oct 2016 16:22:50 -0500 Subject: [PATCH 08/13] Documentation Updates --- .../UserInterfaceState.xcuserstate | Bin 23141 -> 22945 bytes LinearProgressBar/LinearProgressBar.swift | 118 +++++++++++++----- LinearProgressBarMaterial.podspec | 2 +- README.md | 27 ++-- 4 files changed, 101 insertions(+), 46 deletions(-) diff --git a/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate b/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate index 0515ed9557c5b86146008186ebb618ec96dafc98..4e25943a13fe0cd20c252eb3933313551ec91e8d 100644 GIT binary patch delta 7317 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 I-itT=50!xPr2qf` delta 7540 zcmZu#cYIUT`_8>>&bet;lQuhP*3Dkco=wuEbWlN%Awwty3WDq@R!EKv0YOFpML}pO zG87fckS!>nqU?=KL6E&EvVJLueEogQAIZ7*eeOB$^S;k}&U;f+kDXtMP3332LsX}Z z$F-SXbMR)%=sAV48n^=8QP%-hF~0)z;gI1 zYz14xcCZtygoEJ_I1~vX;1oC&&VVyv4XlL=U>*DhE{7{%JzNVn z!cFjJxCoPhbR2WDuDIgWwYaLP&@R zF(DzOgqF||dcr_B2^ZleJVcZzB$^OqM0=tG(UEwA=tNW!-H9rq2hp1tKnx*<5+hOv zGb7l8dLC7+$kAttDSApFr7$xuQ=X~FR3^ps<(g4=?$@i&vIe)W&NnOUPKR@3yK2AB zSARkm!1xu}IhEaqRrc#v)nZWpo`b3e57t)%3@N3dYes&)tA3o}rwqmtgnfyygJ2wmTSoe$wBFu0_~_)I+)`HNbxN zRqBDH4`K6?`u!9dC5u9*9;P0n7;7o3DR+~;WO?IYb$Z}?2{=VPL*dp?K2JJpsAmyY zlO$g}dY<}6YP3?5pkAV0`3G_pVRbJdH>kHL#v1BR2%B3&y^XMiFXz2SZAhCaSCeHm z)CUOr{H5g)^+}`UZnC_F`V?V{{;>cYWTq`317VA6p82V-$QGoUTk|-81{i4`APdkD zwiIDsq`40K5@!3Y`~G);LOYRfTXcYZ0~%Ve1jL0bv`LQ09PU&ou&Cg4aMR(7G{Eo08(BC@DhN zA%y*bunP#gn(Ct2$OTD$=p$EB> z7z@UM_d!NxTQCt}E`)@|jq%xzu!E_5pW5;>*iA9k;gj$w;8(CKxh0tn$zg;YsRMh!-pqHw zeuN!G*hz$?37k$PeHQT%a3cK#I0}w|D=Kuv4iT zqbdQegPSk)dJAD^Ug-5MrF$*72ks**U4!RdO7$=Bn8K~4^rXC*R3w$P_(t$FxeH;x zr{f+SmQ88={GC{s0l~kZJ0OwVi?H*J&49KJy=g7Loqp$>p4lNjhHf%J)?k6b-yOwfIZ=xuouGqLfAuuJwn)HggrsnQ-o6%QS`76>xW5T2FZA#i$9|9poyv#8&H?+`EayAUpIoTB0j_+@&E zuMo~eIID3A_CHg675;z6YvT^{;`x^B^bFaB6R-}K%X81!Y z8Q}%D;X+)5r=yyioRgfJOc%uSr0q;64Ob;UeVMb}aBunygnJOquYvmzE=cW(m|r^# zPgA&y;SqQg9)ri>Z}0>>2~Qzhgc>K6AY6)Y8N%}rE=RaxF+7t#73RQm@I3qjUZCg^ zo^Bo*DXI{zMmULZO?~sI1XDG@M-<}%_yGO|A0k|b@HEu006vCKC|40~M0j!PgTevL z2r8xfLIMzwAP5?fg>VzX9SHXzJb>`^2Y=oN;Zb7(p0l_75h+Kr* z5T1{4d#W_HTq7ft|AkZ$Y9j5O6X7m|yHj~_iN;7+{|jj&@(DY_y$JUq+@IC*$;Ai{B0QATccUmYI7P9Kh*9W7oG7Z_6z`8G3ieS3Q3eymL`kRSt(pxT zQrWdnRZ-=T$_43LrIcZ9o40Db`db1-Q=%os_<5S=D?~FQn|PII@r-Q*;n6fKn;p=~{{-yh-B#6DHFwhpMcoNny7ky@vHleOWvs(K+o<1<~d8 z=B=zldiAYpl=HHY0$UG+7d`i`E79$_BUQCTSIV%8?CjS4yH}1-R1Q%%1NnYMi)I|W z_cLJ;Jt^I5D9j|D)IGm`E8VBSRYYH+Us|>ZFGF~FI&Citkr`(%l6fNY_skoa4b%*37L`rq zP;;n4s+cOH%BjWFPSoDik<O>%|p*EynGfe3hhh^Y5@Fd;uyI~Bz4%@?yuu}q7q#OKh={>F|>;>O~$#io+298T_ zITPU|_+h%mpPp{=XTh)G)^tPvgy5w6^0q`bVi+-o7)QKM%qBi3mJnYMUlHFBD~RpH zZsGuOh&VzVBQ6kEh-<_R;x2KYctAX)(P&bdjHad8XaQQB)`HfC)|vJeEir&Lh&F^a zf>uo%NlVbi)27kp(-zUbrhQA>MLS44OZ$^{nRbLgKi1s8)o#oBykkvD5 zK-QqFAz8z+-p)cw~PhS=+J>WL?f`$ah>6 zLbuW5^cM71^fvT%^bYhl67){=&h!fUaQYbf`}7I)N%RltQ|WW*pV8;hYv@1F_tH<& zPt(uR&(Z&&U!-56-={yIKcqjVKV@Ky360syK8B4_?Sz4B!6=ij0^=A!Y4PgyujbK%?#;`tMO=eAD zO=G24^AoIvtVOIPtgl$#uvV~EvUafcuuibfvd*#oU|nWiWnE|8WIbgQY#v+8ma_BM zYPN>0V;k5Zb{V@ly9N6-_Ur8S?2hbC>;!u*dntP(doz0r`+N2__73(>?49gi*}K_i z+2`1QurIPNv9GYNv2U<%vG1_&Wn7jai|S98DRuH)|D{>0tM{gr!$dx?8J!EMN) z=5TT(IkFsijxuL_&a|9GIbY^%&DoiAFXv&dHaC)6m>bV+l3SA7BDYm;o7~rPyW~#H zoszpYcWds&+^f7Co`R?5X?S{`k!R+$=2h~#^Lp@l@!sO~lqkNGS4`}ijXbb(Ny6sQFnflgo$I0P<%N8l3#1R+5?K_9_%!54y+f;ED* zg7t#!g42Slf*XQcg1dtIf(JsLFi&U_281DDSQr(?ghdHqv9MJ5y0E>lqp*{(LRcy6 zCae-h<1sNi%y76iOz_wiEfB) ziSCFKgqS1F6D!0jF)8+n2Z~3D$BCzlXNYHsKNi=B7m2?VuM&SNUMJolJ}5pbzAU~f zzAnBgzAb(vej=era7m^FNZ1mc#32bu$|SEzT1(nW+DSS{x=E@eJte&)Z%O(}K9DSy z?3A37T$Nmt+>kt$Qlz+)Duq&-l$($Wq#~(ADw7(eHmP0el=`FrX-FEDmPlJjJ4w4r zyGwgW-;(x~_LmNnR!hf7r%7i>XGv#EKb6jvE|+eSZkB#0-74KJ-6uUDJuE#cJuba2 zZIC{eK9ymz3|Y2}Clkm-vOJkWrjn5|tIR7al9kEIWzA%-$y&=2ZDs9by=8-ClVmex zb7Y^%=F4hjb+YBM?Xn+bKg)iR?UL=0?UNml9g-c99g|&`-IU#y-Id*!J&-+;J_EsvL{&nwIum^UV`K5u*8fxOFk4S5gq9?L0mT%IWx%9V1hTrW4u&2qmyERV`# z@)CKOyjMxj?26=sD^;ZV2~<%)L{pD8vfeo>rMTvl9D+)&(B+*RCH zW-6hQrer8t%4{X6v@1PIpE96~C<~QwWul4lHRbEd_R5aRF3PUT?#dp@!OCIEx0Th( zQOcxpvhqXa6y-GK66I>;TIG7>Cgm38_sTuW{mO&NBg*5-6Us}IS8 zRAs4{Dz=KF(yK~UZB%_!{Z#{1LsY|6@2EzqlB&_FajFTbNvZ{^g{sA>rK)8K)iTI=M?NyhnE7XJ4Q`B|p4eD*`?dqS@`_!k@f2gmh@2c;q z8%T`ANh--A*(8^gkWx}knn^q9B;90y43S|nN;V@~kgt(#$aZ80vK!f(>`M+H2a`j| z_sI9j3FHUlR5CH0oI%ba7m$m|rR107a8h#Hys7D} z8L642sne|2Y}fpzd8*CP=4nk@tJbb{X}t-pUt6i|ryZyrtR1Eup{>@A*G|z+)26gD zwR5!dv^Cl~?dRIBwJWr%v}?3KX!mOmY7c9VYL9DAXisU+Xm4n5Ywu|vXdh{x>Tn%Z z2X!)?QRmcobbeh(7txjK%5}|kEp)APZFB>4AL$nAe$^e)o!0%Sd!onmnfe6K)AV$G zfxcMZOy5G^O5axBPG6;eQ~#E}ufD(jUHvG1QvaTQihjC&hJKcQseX-qoqmIUlR<89 z8#)`_GW0d{Hw-dV8%7zBVYFe6VToadVWnZUVXa|6F28r4RPQI{|pj3#55v4?SjvDWytafNY}@mu3M;|Aj%;|b$w<5}Z*<3-~o z<85Pu@uBgFiDF`!xTaha-y|`~ObV0AWHR|o1*V9p&{S+HHI*Og&9Q zOv6nhOz)Z!CS;munqr!6nrZsTRA*XZ`ogr#w8FH~lvrb0YuaksZ8~5&WIAFxVLD|x zYdUATYIoxX6Cl$PUbG=Zss25H_b!MZ=0*l zBh3@dlguBQr<&)Q=bLNIb>?r)+sr?je>VSOK5xEgzGS{)zGl8}{>%K>{M5p*C@rK# zm#`Qu7E8XxY4KS6mXIZ4X>EDk(%#b1(%DjJ>2B$1>22v_>2Dcm8EKhnSzz?fLcsdo*E>+l%dG_E+q$ z+TXBO*t^=h+k4o1+56c0*~i*f+K<@pJAgyz&^YuCqr>9JcQ_moN6gX0QR*mnG;>rs z`Z)$WhB}5j-gS&}AjfFORL4xmM~>N!&m8j|wT?Q+a>q)?YR6i~2FE7HPRB2fUmd$0 z7aVsS_Z<%$j~t1oPRz-2a-6wNfm7_1It@;<)9SQ4T~3cP?kskeI?J8Soh_W5oL!vV zoIRXxI(s|EIHx&hIcGcPIBT2>oC}?coSU6zoY$N;op+q~oqstWxu`CNi|yjNcrJm9 zbQxSGm&N69xm+HX&(*}$)b)z1xvQ0{jjLV4)xp)%)yLJ(HNZ90HQY7ARqYz@n(UhD zO1VCEed3zq`pmV#b<%a&^~8<2Gu_ag2|xl?tr_%9d*au zP2BC=1KkPtEO(82jr*AUn)`tVcxWDmhwb5day=nWndcQxb5Bc8YfoEGqMN6;r;n$f zXMkt8=N-?xo`eT^CVD1&rh2A(=6SyIeB)W+S?O8r`PQ?}v%#~|v&*yBbHH=hbIfzX zbJ}y(bKTS6dFXlK#k`qbrZ?N0_TG-($=+GsdEQ#@ zLhoYl7v5#wb>5BM%?a-o?=J5i?>_GV?-}p!-t*oI-aFp=-Ur@?KDJNlllzoDweNl3 zC%#3#CB83wU-{Pf*7-L2Hv5kF&ik(UZuoBb?)n=1m_O4G{aJpdpY0d>9sY>F)L-sz z?r-UD?eFBT@K^e~`K$ar{bT*L{%!t~{>%Pr{+s?g{=_|hLx2$w1*8FaKo!sgbb0v!UK0u_Nb149Gv1l|pd3XBen4U7*=45R|{12uu#KwV&Y zU}a!+U~OPSU{hd6;FrMez`nqNz?r}wfs27lf$M>rfjfbFfu})6kQ2-a@`B=^G$;=$ z6G3Az7z_ua!FaGquye3Wuv@Sy_-1fqFc};j92*=ToES_6=LF{kYl91ei-SvpYl7>7 z8-kmHJA=OlcL(4SL4=H0BKZ+##1ru+BC$x5NNJ>L zq*>(ENV`ba$Xk)OBh`^n5fm8{85c=KW=1}Wd=kZ?tf(L=ib|rgs648VnxdAdEozTC zqoHUdS{RK-TSQw$+eX_*--vdO_K7B=lcS$SYoc}0MbV|vWzlb<_0iSQ9nqhozeIOM z_eKvy4@Zwhe~TtgMlVKh7cvUfg}%aOg;j;43TG4^Ec~tT_rj}%f5os^W(>x%Vw_lR zOb`>rB(dhPUa|LLAH-(GX2<5l=EZ7b3uB97D`V?pn_^pHKg4#%cE$F_4#W<{p2jWl z_VKRqUh$FfiScRi8S#(epTuk8b@4^|CHG4nm9k5@ zrIOOT(lSM5K{Rd6K Q@#nw9sOP^gzRSw~4|rA+6#xJL diff --git a/LinearProgressBar/LinearProgressBar.swift b/LinearProgressBar/LinearProgressBar.swift index f55f615..65780ca 100644 --- a/LinearProgressBar/LinearProgressBar.swift +++ b/LinearProgressBar/LinearProgressBar.swift @@ -15,31 +15,59 @@ fileprivate var screenSize: CGRect { } open class LinearProgressBar: UIView { + + // MARK: - Private Variables - //FOR DATA - fileprivate var heightForLinearBar: CGFloat + fileprivate var barHeight: CGFloat fileprivate var isAnimationRunning = false - - //FOR DESIGN + fileprivate lazy var progressBarIndicator: UIView = { - let frame = CGRect(origin: CGPoint(x: 0, y:0), size: CGSize(width: 0, height: self.heightForLinearBar)) + let frame = CGRect(origin: CGPoint(x: 0, y:0), size: CGSize(width: 0, height: self.barHeight)) return UIView(frame: frame) }() - //PUBLIC VARS + + // MARK: Public Variables + + /// Background color for the progress bar open var progressBarColor: UIColor = UIColor(red:0.12, green:0.53, blue:0.90, alpha:1.0) + /// Used to determine how much variation the progress bar should animate open var widthRatioOffset: CGFloat = 0.7 + + /// The offset used to determine how far offscreen the progress bar should start and finish animation open var xOffset: CGFloat = 0 + /// The progress bar animation duration open var keyframeDuration: TimeInterval = 1.0 + override open var frame: CGRect { + didSet { + self.barHeight = self.frame.height + } + } + + + // MARK: Deprecated + + @available(*, deprecated, message: "Please use backgroundColor instead", renamed: "backgroundColor") + var backgroundProgressBarColor: UIColor = UIColor.white + + @available(*, deprecated, message: "Please adjust frame.size.height instead") + var heightForLinearBar: CGFloat = 5 + + @available(*, deprecated, message: "Please adjust frame.size.width instead") + var widthForLinearBar: CGFloat = 0 + + + // MARK: Inits + public convenience init(height: CGFloat = 5) { self.init(frame: CGRect(origin: CGPoint(x: 0,y :20), size: CGSize(width: screenSize.width, height: height))) } override public init(frame: CGRect) { - heightForLinearBar = frame.height + barHeight = frame.height var frame = frame frame.size.height = 0 super.init(frame: frame) @@ -50,24 +78,27 @@ open class LinearProgressBar: UIView { fatalError("init(coder:) has not been implemented") } - //MARK: LIFE OF VIEW - override open func layoutSubviews() { - super.layoutSubviews() + //MARK: - Public Functions + + override open func layoutSubviews() { + super.layoutSubviews() var rect = self.frame - - if rect.width == 0 || rect.width == screenSize.height { - rect.size.width = screenSize.width - } - self.frame = rect + if rect.width == 0 || rect.width == screenSize.height { + rect.size.width = screenSize.width + } - heightForLinearBar = self.frame.height - } - - //MARK: PUBLIC FUNCTIONS ------------------------------------------------------------------------------------------ - - //Start the animation + self.frame = rect + } + + /** + Shows the view, if not currently shown, then starts the animation + + - parameters: + - duration: The animation duration for showing the view. Defaults to `0.5` + - delay: The delay for showing the view. Defaults to `0.0` + */ open func show(duration: TimeInterval = 0.5, delay: TimeInterval = 0) { self.show() @@ -76,7 +107,7 @@ open class LinearProgressBar: UIView { self.isAnimationRunning = true var rect = self.frame - rect.size.height = self.heightForLinearBar + rect.size.height = self.barHeight UIView.animate(withDuration: duration, delay: delay, options: [], animations: { self.frame = rect @@ -86,7 +117,13 @@ open class LinearProgressBar: UIView { } } - //Animate specific progress value + /** + Shows the view, if not currently shown, then displays a specific progress value. This is useful for displaying progress of a task. + + - parameters: + - progress: The progress of the task. Should be a value between `0.0` & `1.0` + - duration: The animation duration for showing the view. Defaults to `0.5` + */ open func showProgress(progress: CGFloat, duration: TimeInterval = 0.5) { self.show() @@ -94,7 +131,7 @@ open class LinearProgressBar: UIView { self.isAnimationRunning = false var rect = self.frame - rect.size.height = self.heightForLinearBar + rect.size.height = self.barHeight var progressRect = self.progressBarIndicator.frame progressRect.origin = CGPoint.zero @@ -112,7 +149,12 @@ open class LinearProgressBar: UIView { } } - //Stop the animation + /** + Dismisses the view, if currently shown. + + - parameters: + - duration: The animation duration for dismissing the view. Defaults to `0.5` + */ open func dismiss(duration: TimeInterval = 0.5) { self.isAnimationRunning = false @@ -126,8 +168,9 @@ open class LinearProgressBar: UIView { self.progressBarIndicator.removeFromSuperview() } } - - //MARK: PRIVATE FUNCTIONS ------------------------------------------------------------------------------------------ + + + //MARK: Private Functions fileprivate func show() { self.progressBarIndicator.backgroundColor = self.progressBarColor @@ -143,17 +186,19 @@ open class LinearProgressBar: UIView { dismiss() return } + + guard self.isAnimationRunning else {return} - self.progressBarIndicator.frame = CGRect(origin: CGPoint(x: 0, y :0), size: CGSize(width: 0, height: heightForLinearBar)) + self.progressBarIndicator.frame = CGRect(origin: CGPoint(x: 0, y :0), size: CGSize(width: 0, height: barHeight)) UIView.animateKeyframes(withDuration: keyframeDuration, delay: 0, options: [], animations: { UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: self.keyframeDuration/2) { - self.progressBarIndicator.frame = CGRect(x: -self.xOffset, y: 0, width: self.frame.width * self.widthRatioOffset, height: self.heightForLinearBar) + self.progressBarIndicator.frame = CGRect(x: -self.xOffset, y: 0, width: self.frame.width * self.widthRatioOffset, height: self.barHeight) } UIView.addKeyframe(withRelativeStartTime: self.keyframeDuration/2, relativeDuration: self.keyframeDuration/2) { - self.progressBarIndicator.frame = CGRect(x: self.frame.width, y: 0, width: self.xOffset, height: self.heightForLinearBar) + self.progressBarIndicator.frame = CGRect(x: self.frame.width, y: 0, width: self.xOffset, height: self.barHeight) } }) { (completed) in @@ -161,6 +206,19 @@ open class LinearProgressBar: UIView { self.configureAnimations() } } + + + // MARK: Deprecated + + @available(*, deprecated, message: "Please use show() instead", renamed: "show") + func startAnimation() { + self.show() + } + + @available(*, deprecated, message: "Please use dismiss() instead", renamed: "dismiss") + func stopAnimation() { + self.dismiss() + } } diff --git a/LinearProgressBarMaterial.podspec b/LinearProgressBarMaterial.podspec index eb2bf7c..a93c8c4 100755 --- a/LinearProgressBarMaterial.podspec +++ b/LinearProgressBarMaterial.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "LinearProgressBarMaterial" -s.version = "1.2" +s.version = "2.0" s.summary = "LinearProgressBarMaterial" s.description = "A simple Linear Progress Bar for IOS (Swift 3.0), inspired by Material Design" s.homepage = "https://github.com/PhilippeBoisney/LinearProgressBar" diff --git a/README.md b/README.md index 7fbca64..b08aa4b 100755 --- a/README.md +++ b/README.md @@ -1,11 +1,8 @@ # Linear Progress Bar (Material Design) -[![Platform](http://img.shields.io/badge/platform-ios-blue.svg?style=flat -)](https://developer.apple.com/iphone/index.action) -[![Language](http://img.shields.io/badge/language-swift-brightgreen.svg?style=flat -)](https://developer.apple.com/swift) -[![License](http://img.shields.io/badge/license-MIT-lightgrey.svg?style=flat -)](http://mit-license.org) +[![Platform](http://img.shields.io/badge/platform-ios-blue.svg?style=flat)](https://developer.apple.com/iphone/index.action) +[![Language](http://img.shields.io/badge/language-swift-brightgreen.svg?style=flat)](https://developer.apple.com/swift) +[![License](http://img.shields.io/badge/license-MIT-lightgrey.svg?style=flat)](http://mit-license.org) Linear Progress Bar (inspired by [Google Material Design](https://www.google.com/design/spec/components/progress-activity.html#progress-activity-types-of-indicators#)) for iOS written in Swift 3.0 @@ -30,22 +27,22 @@ end ## USAGE ```swift //Simply, Call Progress Bar -let linearBar: LinearProgressBar = LinearProgressBar() +let linearBar = LinearProgressBar() -//Start Animation -self.linearBar.startAnimation() +//Show and Start Animation +self.linearBar.show() -//Stop Animation -self.linearBar.stopAnimation() +//Show Specific Progress +self.linearBar.showProgress(progress: 0.5) + +//Dismiss +self.linearBar.dismiss() ``` **OPTIONS** ```swift //Change background color linearBar.backgroundColor = UIColor(red:0.68, green:0.81, blue:0.72, alpha:1.0) linearBar.progressBarColor = UIColor(red:0.26, green:0.65, blue:0.45, alpha:1.0) - -//Change height of progressBar -linearBar.heightForLinearBar = 5 ``` ## FEATURES @@ -56,7 +53,7 @@ linearBar.heightForLinearBar = 5 - [x] Swift 3 support ## Version -1.2 +2.0 ## Author From a2e31960af54bc9ebe2aff7a7cae36f902c4ef5a Mon Sep 17 00:00:00 2001 From: Cody Winton Date: Fri, 21 Oct 2016 16:27:17 -0500 Subject: [PATCH 09/13] Minor refactor --- .../UserInterfaceState.xcuserstate | Bin 22945 -> 23513 bytes LinearProgressBar/LinearProgressBar.swift | 25 +++++++----------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate b/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate index 4e25943a13fe0cd20c252eb3933313551ec91e8d..8b496faf9ea8c184b1cb3da1cfe8b9e79a4e00b9 100644 GIT binary patch literal 23513 zcmd^n2Y8cJ+y6PwOn2I*GijS9Z90;4CQX{ov`J~%(6UEK+Y|y_bg%?D2NfKsI1ofc z+A;(c6$BLpR1ig6>>-GV3L+|sI8gC_o}@_|M19}y`sVew(k9Py#(nN{&)*p}Ee(#g z_Kb|f00IiofB`JvM6IH>(Frr`t!<9xrqKz_HB;@i?QLTcY^}9Z9OQ9TLVI&d2!IP$ zKO0O<06Y+ZP#^(eKn*lN3(`P3$N-rj3uFTw7zhS|!C(j&3WkBYnrp8d!)FjGA)ljWe8`VyAP&25R)GX>&>UQc5>RxIo^$4|+T1|CQ>#1j`E!4}@ z>(m?6ZfYO(0dPPA)>UTPf4yPmNNIHs+rlquuj-j(@ z9j&KxXajAeb7>QuN9WUKx{Mx3527pSQS@kf3_XFi(KU2EJ(+HxTj&||OnM%@h`xt@ zoL)t5q@SXnrk|lV(a+M)(a+N_(mUwa={Mv&maaf z3z*xO+nGC;{yF`JlYndg}2na#`=<^^Uu^BVIy zvyVBz9Au6&A2XjZ7n#e<56o{Y#fn%l8_CMqWHyC0vn6aPYhkTy8QYI7XDitL>;Trr z*08l~9cyRn*~#n_*1=9?o7r}D4too`fL+KgV((!WvrE_q*rn_v>?QVV_8ayG_E+`~j^=pI zkMrlmTrd~Hg>%uIluP20xfD*%I-ND_>J;*)8J;tr&)^Y2(C%Konm$~iSE8MHx4sIv6hkKLT&%MhX=8kYjxl`OH z+!x$Mp5a-Z<9S}h`|!TJAMeix@PT{~AHs+6;d~S?RpYrGU&-l;zFZlEP1^!F^BL5YCiT|4ahX0oTg}=uC%Ks)}M1i6p zkysQg3K4~hB%)YRoJcN;7pX-Wkyex@GKz9V1tPO(m}t1DQdA`xAsQnZFPb2lD5?=n z5jBV!Mbk$lG<7sI90EST7x)2x5ClR-4X#X^W}n?Qmi+Cpdm|HS8*FWDT_6AiA_~!6 zKn#M3)KNZYRJAxE*I+Ek&NY{5t$OlHmyw;RHCv6P+LAJ(IVam(rq9SSR*NMS7VD_y z)@f}mwpzQTxwfOx-qh~yIULAA>IM)2B0&_022vmcF(4MiAr^6nMFl->y`Jia>W2qJw_U*9BR#V#C)ZW_M&|q(^F3rd; zwPclLXsx9grCMEyHCt=W$js8_m@QcuIr=i4PG_7bRChGhHP0+-wKdwS#qs39kk&eT ztG&)M4zFh0{PbVqju5XJMa-rj_DotiaNr1N4M+rK2$X~H`Lf#E80dn+8i|vge8%^?`$PCjd(^TIV32%&m4? zwOA_<>J~n)NgL7bXmGU87K&ApNT7YB!#>m1pr`M|=I|I$D`?JGFb<3d6Tn1J4JH8_s6jFmgJMw}lB0N}KuVObfpF7K z_}icSIKWge4Kxs5st9*&{4qfz3i; z7qLXgN4g>=*Z0bfnnqH3tm~VzqBxY)u-NNu9S!Zy9$d}KdmarHs<*Wh@f>b%X|=bJ z54Ls^ff3FGy9x5l(%1$kZ>n1Dc9EMKv%xJOwG+%iNu6LWN)|?w=<2?Qk$=^Ly8#3i z2n}GA(g|)usmM|#Fy8%k5x570bb~v=UEpq{MjE8;28#(h??Y*Xg^hwWO!4ZDFsj{N zNu;uAvh$dX%#sbb>C>4c36QU>#VG49JK^BL^Cf zrlM)cGQP~wV7J)XZB?^d?BiTCIjJQIZgvK|Hlpp`GeRcBr61%?MZ3Lmu+v0Fx$XK* z-bvl>th2}j3vqR?9UA9;H)8m}YH@09b7PvVrKQ21R?*aMZ>=W|qol*pKum9TTBSz? z(neR5xOuP{ya+QhJ$oiEml^P^!8cV-r7;y-qC6oG`ZKV62+}3DYZ4tuo2tX_l0ZD z-Vo+&H!4I$W6Sh2v}1>9Ypeqfg15liU>|sAtjoJL5e|-aeYCd`Cv0wQwaxA#1@?~~ zTsg#i;XrEzk=n(@8nSQaWd*aA?Je;!VvXeoCLqdG? z19+qxTm?UZpU@CA6b(Z~V_NO)jwYL~+AzAMxwXC3=4c;VPa>+eT4I$vX5)8o9i*;a zjV#Kd4_)nzyG5Ioovo2)>2l{e+lDle5y+sCL`HJvG-<~U)pl62ToZE~in@deI0Aj4 zAMk_zFaQR^ASi~xFhrobCzu-8Ts|A#U? zG{7X#AI70c#9oswg9j2-vb7RzpG@3M8<}}Aa2M1%3)cQs!O;1Cxc)l?v&p3BpdRKx z!??Ph$sm?&OuM7e-qvnwY(e#CG6L1&x_V-1P3h_BBie|kOLsK4)!ApH6REQ|G`HAW z)B8Ev%R6e)|3uVHo|M?y>}d@xt<6)@ZwL)sOf$heqRp0(Rqh#fOGg*X7kG8ESFW0c zu&7#`eB+$=^4{AKbirbwxqrDlkw$af3|mvJUGC<3wbl?Y z1TBR1R%n3zpk7E^Y6w@xk-x3>2BHcx>h;o;7T$tU9dmc?-JEPg4PX2 zO^6IR{FYlXH1dpj8u=|*89MSYGn;7VydFyjhr>}Ibq%b9Rd56xiCWNf)QZ~Hz|n9F z5tMPL9nB%4G8b7!546`i!^kni9h0XxKaF)oAFdE6jIh=d#CU=rcQ-X~vd~Q}tb=w~ zk2=r{G!xBQBSgY*D#>+(=y$d&!I6$6afD#1olZxH!`g=1W{$KqbO@njwD;Q{r&n1^ z1g%;u_j)P#tV&|ONXS~->S!URnA8vVD&lNih!0$RYXy(2_Cz4C1I{E~2hKpZbdq?T zMCU}Yh;wXfZm^Tkf>>T*;O+s=g|`ZY=b?F>a6Y=#S(u2aha*BX(dO#qHn^}0-VX0T z^U>{Sk-LFAAqm2|;9c-;gb?n6i{ZU!0lE#1nn0TAwJn0#8(Ad`ZIEqplcT+(&hD8R zW%0vxPDAW&^I^EmtIg%`QFI4dh(`6!p|bdXv9pd#npVLlCVG6O(^q%HRf4y6H`xih zTt?shU@crP4168ByAwW%?)kfcKP?RW8Mp~8M)&s){CW6-7m-`xHgqq#j}S>D%B3U9 zV#g$}fxQBEdezwlUqegK141AaL~6N%Y9S0)7LR|;S@$q}6Yhm?5zTs=Xx2NBsCP(f zb91{(h=q82u#g0ZBPQFM935@0o`qn@KC9jJCbFf~(P(R({ij!GCDF)-&=W`Dd+>eI z!3Xd|cz|^BHarZEz@tz-n&7Jqb*=WMku5gzyM0`(&~8(^AbLb>-PZN5tkJk;5?S{o z4Wy@)Xq6bEhxCmBn|?>MQY-jEcLVXgn#p4vkV47dQ(Nq}&O2 zQHfLvNbROnR1%epoYCL)V65PMH$Q#wjd<)Ek0GiVcfb`50&6_km}L(dV5zXiP{5F;RHr3ApT zwY1sm1S=`1B1v$`<6e3^G`KA9kS1%B;3Dc=`tHtsgqi}t)f49qCyA$!(Qj~PAwlRJ=c%@8TznIa*`tt=fRB;OrvH@?1MzWzL+ZvM@tZt={* zT=YioEX=2{z*vNKcTx+`p1+@kh16XjwTl`DlhBK368S*gLq5ETEbeaZqaF|n+)pNI zFM3fZKxT~mSSklPYTSjEQIC3PS%Kc}rR8yIl}mR1YHr;vbWv+OEv!ZRds}#t+UOb0 zQ|R4Z!ZuOQkr#ySNuAX5=)K+-FHqaa3$PZA?-49_AKR%N!cbnJUPT|E54!|Ga0&oX zx-e(tGo-0u_CTWY_PUaW=GtjQ>ElKZ_q=iXzNYrF*5*c!DRwu#huSL;BZNEDTj-$M z%)J8_c2oPQcd7T#A#@a-=rwg8Qir_k*J0`iI*g78dME&f9*J|g?3Q9L<9Cue?N#|> z>I^!Dj+5AkRCRe{SG@;ZiKv^(cW^)8T3Pxf}|K`4dF?mAynmj$MMLw$=*q0?PX zB)$iFmwH&!V_<|Z%$36ntn<8e!aF2IB0Atzf`sBi0Im~a@l0I?`Dirg=D9Lu>SrMf zj}TS~$m)QwGT=tSsOvOwDI2LjXh1`nqG^yvv!H)MJ>7VI78c45y+*3<*y5H}I?*%Js~SH^2W= z0O)@UYIX^Wz-Z6h^@YrP=8%r1lL>lE$I)^+o>tIGI)P54Rdf=%h`vIX(AVf2^ewuK zzC+({pi}5n7kW&m(dl#sQIRVcQZD!y!x#+HFiaU|z$T4A# zz?r_muP5fE3!s56g8MN9B=-8@PoXM#PeN7NN`f;Wlv#zY_6aZPesnn$(*$Bi*U?WT zy!;W7)rbEOj6x44a!wDShtk8)&*)e5nrSTWCurgv*U+oU*t_U%41F>5!_XhYfHm}5 zdL6N7PhuE|VUS?L#DWir9O_EV+(Af{8>1p9>kY4ZY zFbr`ikc-7H3F`1Ny`6pq!%z$*7>3iKVfeox`C|mE-PTHg!D_L}E2ejO zQ#TvaDxLFEDgYh5pcGw8gtr0x;TpjaK}e2bD7z7D$`(9aX12lTL7V84^cg4GM4zHh z!z$E*VJs#(KYb1T34N9xL7&4=j$tCYhM`7~_?v@DeQ+nY#lJv*O&X@Zq%YE6(U&lc z$54Tx62pZ5Js6Xl)}QHXf^HLCP<7J3ViM7jkp|x!ETaD)i6a9TvLh)O!&FZ^#V`!t zH?)C^86UI&!xSMQ#LN3ePfP$K_A0uZ2|+~F)k4w7PTB#4x*e5E>@ki?XduCb}2HEP=8m30{=x8KYOx zU5p7W!B8g@?O5Vfw2&dI^F91!%oygl$*>4ySeY^m4Hz1G$*5ok_HDa24eyyTW*Ad- zLxG;;+g)G`GlAsX%vfd|Gaf?|hIts~cQX^2YGx9K1sD#+aF{U7F<#2%iL27wcBf~l z?mv`tGxba>NPUVSX&~cZrZUr*2Bwi|Vw#y2W;%w2XcvY>7#3qlm{NjaDTWpdtr!x9 z^m__aFzw{u3}z-Xi&oB52ov4j(`ITDWWsDE}88D z%!H~Q$bfV#0K;C-gkn9thr zXlL$W7O%#zzY|ts?qlvJi-|q!jFtBGZt`Ra*iX=T^2KQ@nFry*)o79H^HO(RvIfU2 z@B8I3*Oz~i7Ps&{!K@<~0JECuWV)DcW(~6z!{HcKVpxUY2nl~-n%&>a1+^Z z;x}#@4>3nPG!h3{-Am&M=A&L3PhmKzx3@FQS;2-1X+HBQhGf~n-Q4HQdBLt#p%;nc8Awld-_tA`%u2ipcrti*fhbnyRlt*~y9>m#34fKB-!xZn*Gpyf zBztDntcKOHX>2;1!Dg~qY&NUIuo1&144W||fe5jXB-(DnupPq=3}-m=Xx7N)vL-f< z&1VZh1zRNK(HPFe@B<7FWB40}e_)CwYD9?yDf`QPPX8T=^nb%nuAAiA>_B!T$+g)* z>|k~XJCq&94reRbDwf!tSs2d7a1MsIU^o}Uc^KY`;d~6y26hxX+Ld&(k+3dx?-%FZfg1O$v~-n{9KY-Am9a3~%d`IItb; z3@B!2f&LiYhslZ|(Yo9J!>Knr7d*0toyXqF&Sw#Z3o*PC!@DtD>`6FSk_8H>#3ENJ z5%DLZ>B`o6auN1USLwTi(oS^LwI71L*Y*6KzfMS;`zF{2UFGim>vGO52<$Q;WykP- zSI%zx&&%2WVtig{JG-)P+WtVFw4LoFnGZ{B$O2D#%&ujH)lhaFh7WbJPh$A6U>5$Z zyq$fT-9(yj=I!jW7%ufV0CqFGjpXg@7WM^pD~69?xD3PP-Rz5?Kl?H!OS?7l7}e2(FIOqRhDG2HM!3rp-;KH?*t6PC!*>$2yKxg}GdopS>&!G6nL zcAJ;yF?_1Wyg0*C_Nrhkeq?`Qe`ZNA@HB?cV7LjxXK!vSZe|kP&-$8!o@boMrTWkP zd#eBEDDFQ3U$Dyr_=4CI=Rmm#BF$VRCc6%9*e&yC{DPBl@lO1Li{;{6_yvhQUnckk zr{I+I2#(DAb_{n3_{Cm9^Z!-+f=lJnNyD6)({NfY4Z~M3d=Ct~EvxQf2<9$d@~5b%rLLOwskwIiiR z?YJS_aId1vxhixAhHnZ*@A6vk;YM>~1=7Y~_|`w;7hE+r$tybMYB@Wp?!+&+dQ3JY zxME+hMM~xRo5)cHPZA&aL8z#Xf=|NnDO~bDfl$BTXJh#L-+7=KCLa0+5``4Vrpj zj(;(uhISeuUvE3{PYD@jC8#ZZo$9RB&5`@bL_W zpJVt1A{uz%|71qX?c!c1SseEohM#nDL|M)X4n)|^bdx;_++OZ&K}O!f@Y7CiABN|g zI{2q}#;ro{aUYW8iF=`xy#&l-1poS?g#EF_ala1Au{U(%KaL{ zZ!r88!^;?chvD}aUcvAO0%LH$kbl2&zj42F*SS9gyo#rU`M)asA`Se6;m;Tn=XK46 zSN$sR=>KcHiWm2RnfOpA7!}&H-`9oa^AUYZMECs?T? z7^Y~!Pc8ia#W4%zb1QiiN$lT zJ-JT#5db#Qg)e%qObIl&MX`;aL8bz%<2%q)OoepuGx=GV3dK~UFt&eneXEDHb9rGS zFFy}cl1_d;rou`7)w}e?-|mbZsj&a1UGMH8F5(xH_z>K95{SRobrJ}Zjf1YEK(2^| ze~1LNuCqDr7MAfV1bJP~KZ>a+Oi8==$M}_)ioqlT@ET#KYlP9&;{W`G#=II>&EdLyFCz~-9i>Wx`PbfJ#=0a9`Nm^Cbb+fd}-RMg^L7#8F zbj|PNcacV4$CLt7N}c#=OsfVm3( z6n~okm_GxEnaCul9HBJ}Q^e-#Fr_EoM~!K>wNAFTS6T*)b+lO<9FtuqXTx2OT?dXT z+D19Zi3PIqL+nG}7w$6~WCOPAv2)*ZJK3#Cj-YuSx*937H98t*lT4~_1Hzu024PW} zK(2kCSG18GBjk)yJ9!c6XqnR7L{6(Vc9268&8?XkX&K}oa@~w}ayW&Y#?s#K-b7AG z8?&;_dacz+j(Y3LGIUyVuEnS|7J>} z{0}60=D*{==dWPOfGH!Ua=ZDf{EsjRQzlGyi4v%v*hLc7c^keSBT1}gWk;j1$=o%w zmG;TPfpWnL{;A54mYzeT!e%7z)~X!s4X!f{{O@q#TK+o!hX{zEi1^DqOqF1&3{(9v zHQ3`jMXZQyGV2y`B3>lIR6eE(Fjd$s@)h}sh(jsDR57N^PILOF&b%lk`zFX{^>#92 z>c1~oLY4w6?PNQ=FgXOX`uozZKAe%TvRLHw)Swo~6Dc778{rp)iK1>cs%Vi^B*RoG zrYxAU5+y8lwFrjEM>vmU_ROb9AyVC}ev&9zMD(X0rphr@A=GzetYEn5Z^=m)W#6PZ za89Hb<)A^B8i1*R$kH>egCY~~6Xl8Wg%dz^&{#=xL)}4D zQgX`8&X)Fc*p-~>Iaqo~qxDTo&mc66nnKP-l94%SsT8hiD9Hd~8u^muva;Poc4eiK z@A@3CBcWY-;h`~?*rh(4Axqi9QN1ox>P?@MFlKP&0Q+nb-t=6pbD*HGN;qwTAP|9I zvdvRTF4V~)7YJCv05BYk12yE*oavwqbb$F_A-Inmd|pY8Jg)}b89^?$nM96SwUSdzbI3(D z55o22%9>Z<>n<)+ut(sFdj9tOfx9s^$hn#=Dijq>@T_JF$Edr>BXTH?@LBlg){qiW z1xeM3-LQzPB9W+{h-d_{9z!rSlo$|9k?45%I*~6kOEge4i0mvNfmxBTkASMg6j>u0 zNd6bBisJ9p-?i-j4}}O>#O@16LA;HjmwgfnRkqI-u6g)}lEM};XUT)2kwg(kiAD=z zFKi+Z0)cH0zjUMxQ&lczjTMb^@x|UH8Y>(b5mzzxkp*agk`6D=r%Q-xYE82D_pbSJ&hJ%R{o8 z=!>Xb)G@-DayV5c3MhaY=*e9hMa=Ik?YzrJ$)=L^+)T2TYb1-b1#A(yw`U%EH~TpI z1l!4W3yU%A268*kGwieEUY3 zI3JOZuaCb^ppV!`>67o%-^b?D;IqJIt+t0VccYyC8-`Tzo_-^ps?7P+XMcs!tW!$&-}jdyWn@x?~>m){=WXP{uciU{`LM2|7re>{28{*U{2`9J0V zrvE|zBmT$yPx_zo|JeUp03F~Tpa@6_$O$M77#>g+Ffw3tz}SHC0TTlz1vCdt4`>VM z2$&f#JK&apc>(hS?hfb**cWgv;M+i-Kv`g7U|OI)&=8m#m={J!oOjok1&tRtBvN+7q-d=t9udpr3+%3HntWBn}qGisfR3I6-U_ zo5h30W5spidhrzTRPh1vN%3Xz)nLD1NpMlHCAc|wLGY`=`+^SypAJ3~d^Y%8@TK7I zgMSJEA#?~E!iUI1v>`bm#t>6Ten??RzmSTM0U?7zhJ*|Y85>d;(j2lV&_SU?Lx+b}g-!|W2%Qx= zCv;xu{7@XaG;~#Hcj(&C^`RR=w}rkEx+8Q~=$_EMp>K!26M8)KtI!`pf0y`5f+WF` zP)VdDS|XFgN|Gg+5|gAtGE_1_GEq`3u}PXF(U6N-d zFG#jYUXtvP?2^1L*)4fba#V6oazS!Ya!K-?9w;j6+|hj)dq34bR1x$w>5 zFNE(1KOcT6B0M54!Wz*(q9tNp1d3P?aYw|Wh`S;lj93=&XvAX?k4J2bcsAnsh%FH> zMQo3FHDYJPu86lIjzpY{I2G}6#JPyiBhE*B8S#C@ACX+7DAG65KQc5jEHWZ8DpDF* z99b1PGxGMxdn50Ud?50n$fc31B3DOtMXrfl7x`r5uE_I|zeI_m!lELhqN8G>;-ccC zvZIQl%uyv#mZ)J-RZ%0O#zc*anh-TLsxhiLsx_)TYDU!EQOlxMM6HZ^BC0d0J8DhT zt5Ij7E=Bzk^=s7cQGZ0kXgZpW4vCgThet<7M@P$|W25EKhUog}yQ4QmzZCsW^s(rZ z(Wj!%M4yd57kxSUO7zv}pQEou|0WenW26dcf>b3{OSRH;X{NMLS}L_l`$-2%2TO-a zhf7CFYo+zlDbi`uMrpHju5_OCRw(brQz0$X(??{hH zPfAZo&q&Wo&q*&!uSl;-f0ka8{wDL01&NvO3vhnM2kfYm&9d zX3LOlf$VnKLfM_NrLq;Wm9kZ`ZrNJddf5iqtFkv`2W7`(CuASVK9PMY`%LzQ><8KJ zF}^WDF~KpRF_AIRF|wH0n9P{Mn9>+)Ouv|cF@s}<#te^XiFq*QshAgHUWwTevn%HH znB6fS#(W-gKIY4quVTKA`8MXem@6??V}6SHB{nct92*iViH(Sjj*W?x$0}nJW0PZ3 zV@qR4#@59?9J@aDXzZ7c-(}z8F9DAJr=hv?$x+6aaZJ=JVG8Vm&s%0a(S*iPhKc5mY2v!$;ZgY z$tTFG_4@|E&#`C9pU`3Ct@@|Wb><*&+j%8$s8$v=~SA-^EMDE~?Ri~Lvl@A1L$ zvGF7Vj!%fcBYstUXMA`3+W7VH&&6+v-x~j7{GRx?;@^pXFaE>$gYnlCyuw%EuLx3v zC?tw_MY1AQp;4qM^a`WGq$p4nDasWC6oVB*6%!N1x z;z7ky#WKYT#p8-66k8Qh5V#1_^nuNN9#)OuHwuFv^`w|{YSd*|WVMD^x37ZmLOxT{VBVkv< z8wq<7P9>aA_#xrTT5#)k)PU)yJxHs?SvyR2NlOl0Xuj#3lJ8`6mS?MI_0R;*u0e2}zkrIZ4JO zQ&LfqIjJVsYLe=b>XX`%<|NHaLP@tJ-JNuA(vqZyl9ncIP1=`q zDe0GFadK#KSaM{tG&wdoJ~<&dDLFM+o1Br{FS#OlVDjMPVaZj=qmsuaPe`s#wk6jk z*C*rT)yXd;znlC~^0z5;N<>O_N_onp6i3R`l*W`9DYvEEow6k5(UcV_D^u2{tV`LD zvN>f-%C?kUDX*pMPC1uyIpz0MkV>a=sXnRxsX?i-)VNedYGP_qYHF$`H7(VeT9sO# zdUxu}smD`4PrZO?_SCr}5VWXo55{O}s{_Nz|ljG@3L`hNeJMtSQx$ zX(}`WG*y~$nu!{lrcP6@Y17Qo%+bu%V9jlsJ2ZX?;O1qSHEj>70mY$V9 zBHfWbH~rr9CFu{QFHK*T{#^Rz^sVVHrf*OGApKzak@REfC(}=51ZG5J$TO4~s*IEj z4S}!nG72+_GfFbXXE-t%GMX}4GTJk6#_bskGw#e-nXw_`>5NSo&t>e%IFNBT<7me5 z%>2v|nWHnuW{%ICm^nFfYGz|*bLQO4`I!qc@5sC}^X|;enY%LI$lR0pR^~gI?`EFJ z{3P>S<`%T{C;XAjIClUyo-EF!hx`%X2b<1>XbnA5+bWiDa>E6|SpgW*Dq&u${>tpnB`gnbUUaQa0 zXA{tFuzsArPG7Hg=o|D+`kDGU`g!{K`UU#i^(*!3^)Kjm=wH+C*6-Et(;w6y)*sa$ z*Pqm%(qGGo$T8(q=1j_|&8g3E9d@<{0J~<{R!bEH$h!tTe1LbQ{(ho-}MUY%#oM z*lpNr*k^dx@V?=g;gsQw;ZwtBhVKkN8h$ohGyGwMM#jh)gN!m`yisXPG^QFg#x!Gw zvA}3C_A~Z34l-65M;XT$#~UXav2m$!tMLuv2gZZOBgW&#kBlE1&l=J$ z<8Q|6xga+pSCwnb9iMwo?#A2~bGPU2$bBt$ckY|H$8tZ*J)e6q_v_rtx!;>OQ>ZD@ zBsImFlqQua#iTZAOcv8HQ32soK^ZKR5s3{B8NW^Y`ZO%YQfjgZu;eC-cwdf0lnf|6=~7 z{9p2~7k~n)fG_YV@GA%?h%SgLh%ZnUBp0L>XbaK{j0M(${sjXI1{YKoj3^jYFs7is zU|K;_!SsR|1+xm~6wEDHRq$%T(SmaY-xpjh__^TMg6oB_kSXK~!wVw|rG>GD@r4P6 zNrkC}n!?h;NrjDtw->%xxUcZD!tV-yEd06f*CJ3v7jZ?RqRgVgB6E?Ys9#b4qJc$Y zipCX9D4JCCR?*?2(?w^B&K8|3`n>3yqVI~X6kRR)spywts+cY2i+zg2i>1Y}#qq_e z;*?@daawU+aY1oWaY^yI;w{Bni(f3>ZkC#p&6#GM*fpzxhG)W9C)nPII?;o%u=g^X6B~d&~#Sht0>#C(WnLXUt!hz>>g{ zxDrK4Vo7p|x+JZH+~ZkdC@C))P%@}wNXhV$5hbHb#+6JcsV;Gpw3pmlvZmzalJ`r# zDEXr_taN1QgwndwrqWwV7nI&ndS~f9r4N=aEnQx^qI6~H2c;J+w8h^NVTrcHSmYL^ zMP*60=q>q{B1;Lm<7J>_h-J8Cgk_WkSvFZtTFzN6TCQ9DtRdDgYot|bRag_P$yT*h zYt6A5t%cSB*5TF>*3s5+)*7qbI>kE8+Gw3&oo&6>y29FNU1MEu-DrK@y2ZN9`m*&E z>l@bn)_zHW)l#1yUvnu9QEU9>?Vr9h>6`d8`6;D@esn}NWa>c6^J1h2A uyjSr-#lil${mc57_wV0-Q2$N+U+e#7|NSl`j-p(DMKgMkxt>4$-}`?KB5NZ6 literal 22945 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 I-AZ= Date: Sat, 22 Oct 2016 13:09:40 -0500 Subject: [PATCH 10/13] Created gitignore file --- .gitignore | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2c22487 --- /dev/null +++ b/.gitignore @@ -0,0 +1,65 @@ +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData/ + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ + +## Other +*.moved-aside +*.xcuserstate + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +.build/ + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output From 4dbd8a71f18ce37159700d97aae9d9c9511f63c8 Mon Sep 17 00:00:00 2001 From: Cody Winton Date: Sat, 22 Oct 2016 13:12:05 -0500 Subject: [PATCH 11/13] Removed unnecessary files based on git ignore --- .../UserInterfaceState.xcuserstate | Bin 18096 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 23513 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/Philippe.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/Philippe.xcuserdatad/UserInterfaceState.xcuserstate b/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/Philippe.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index b4e89deee96688899a509a6e03051e4b35c954fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18096 zcmd6O33yXQ_xH@)d%G`5y4Z!bY11WbvnNfODoaaQDy3AqK-o&#h7w4dlB7UEWG<+v zh@dEog3uNLS;SoyK~Qi*1;l;d5f?yx-CyK?Zf?^yfWAJ@yL=x$Hp!itGc#w-oaJ}U zZD?~kJYJpdHG~mC3}O+7g19fa)8jK|+ua_At95*)t6_${(d((pw7DCnJK%A3rq|Ub zL-@vxyQKIT6pTVp42nf@CWHbfU zqej$(no$dCMK0t)H=rBQ5_A)~8Qp@GqFd22v=ZHk?n0~3-RK^)4sAr8s0(dHJJ3$F zA00qXp@ZlUdKx{04x<;*QFI)=h2BQ*pm))G=mYcxI)%POU!!l(IrIZ68*n3T!fkjK zc4H6r;&wb6&%q1ub$B6OiSNXB;Z=AwUW3=-yYW4E9bS*`#T)QOybW*1JMd2Y7=8*L z#E0TU;}7tM_%!|se~r)L9|%KO!jT{nOhQNmi6#;vB{C9E z;)| zL*6Ctk@v~RzKvN5@sp0oLSARVb(I8Oc%3* z*~vV>>|!2ajxf(M&oR$4FEB4MN12zHmzlSj_n8lv&zPT>pPBP4W(mu%!E7WO%OMyV*VLUUnaQfIZB9BDw_e@WltvC6l;i+f1%Uv_J+%w77&0f_w-QHpc0^-lH?X9JD zkJr&^^MV?ym*~oE9`8_BOPkXU1SLm$d?Ts)-T!g<>SVO3v13F|v+1*Hw49G~MXf%~{qXJ|`7AmDCS|{w#GQQE( zWY++@M>)KjvR1F%Jq=i1((Z6J+1;8z;+iVhZbyU5<_0G8jP#8+R=Qn+Vy*zoqM;yHrDzx$jz$QQ)c_2e z2%m1d6Bs<(P7#fzG4+zk(;QBFkyfj%@c@gpmD3$gM_Zd+3uiGC%!any(Q3E3VeQRs zyT?;vb6@6(a2OhA8|+Uz+U980czRjzD!LktLgi@m1W}S(Z7ufk;#a$;rlJatq6?ZU z##dC0@tH0EhAL4F%HD*oL1R%Bs;2Su3YtI@H=$ZojmD!onnV+63QZS|C$Y-z1ispv zM%!B&?C!EAIB>@_2kfR^A{E;}pkN2H9dKOr5=B`_-x*bT-R+IucDKFOVV^V9)#`P- zoKB%vd|Am*TkC9_C$QmF-+i5m8ak1UCer~EMo%kK+g$2dms}w<7CYhQ!1cEG5uP{{4$JPY6toBQ z66D<8RPAajx6igad(N{I&QT&x58_wr@Hl`6ios`sZC!glnk^p4ZK$CeEk`TR?KGdN zsG1I_bK3=7Vyd@{7p|Mz=I~CK1}fLn=(gKi{Y+Yo)}ZW-8>w6|__&YZs9vI+uea(n z2E9dZDYRI0)&hgks*;;@I*r~`XfYXedb7n`U@|Nar(Q3}!oAc0vS6Oqs-94(ZZ9>2 z_$TN__X)?oi57IC&D0WjF}M3Jp}Af%`rp5Vnz@3K^4&rI+z+6~Q1)iD3q6P)LJy-y z(4(}FT4@ozl3qmzZbpxzC(v%R2kk}s=pZ_nmebL+f{qtNQyrj=MDc8C8=rb{}Y*EYlHFFOUk$C^5fMov3jDA)hLC*=t{45>PiJqs$0t=<3 zwbfO^wuM_==C!wYM0t4$9qU3bqgQAN9Z5&|37kN$Az2sP_mgxeE$u?Dqc`Xy9B-ApZr7gNxOuk-j+IcSYKucHOL0b5Jk#HJqC25bc#ORu4obliXX#wd#S zZ&|)?+oVVQOTK^!%I?AlV_HS4yD)=UT0?88d|Z$8*ZL(+dWnJjb7}E$ABW?JdPz!v zKwT`F-8d3Q30(c_ZeSEZ8ZI8(vj;4}QjzWc2eCL2Y$}e!@%RdyKqt^ibPAoi2`AxX zJOHQA20DYbQg?uk!WljtHL+eY;osL$m%0ub&m6}zZ$D=R=lJHETrU~-ADB=bToP{ z<=NkP;$MI-yuc=G6%M`to3RBK(ni`u?R45ET!gPgi}66(Os9jvcL-W5q0;SW0nfrO zRMq}#2&Vp`rXEW?bh^zAPJ-P%*4El=pF9$rtYW9L%;RadgNDtzXpmnS2aXc%-`X2u z-m9B5-(WBqRdRiS$+DnszD^}CDAZXN_$7D*F2C$XM&kFy{inW>5CP z@d6ENp>e_Z`Bn=M*7ee=#SSuw~Rn9+Gw9 z4m!UR&!^Xd^?{(L0(^FGlO3(iVAL+rcK)NG_+}*Aig~;UFUHs78}N;I3BHM5M;B5` zdAf)$rq|OOw&GhLo?MKV;oIY~xVHTX zj0PvlDMVJ6%m{h}Tt_c7#5mffyISoYM@u`zQZBb%r_t3*1~tw0Hu;=n^+oMP1;g|P zi_vOP>q~VIkq_5d)K>lQQgx|8uPZDtSdGPcOYPi3bG_MA>!=iH*NGoimBG*7P7ID@ zH}1mScoV&qE~B?~6s=Y z$&fK^g3}I7@s~7JJG@T2&xYd%(6RgQF8m;V2tSM;p)2TWdJo+|H}yI+_;I{fSnm^f zH{L^Ur+3hm-FP2<67Q#X(!1y?VZGUx%n-0V&>Su|MECWQ{J-v4Vr!gPWp4vDyFpEe9u`8^$ZLGi zfdAx9;x{iD`4)Z~zeCs2_4Hn0q(ofC*rLB&!bkYCO9*|Azrd&HM%qccfY9J`0sDCs ze}lsDxA=?z05sXWwlPv-YXG0r2O(p^uw2lUSN%QccxP}(v?M8cKxS6H-el>4uR_DZ zBO;?9c<*7V7}-NOTI>ad(a;W<55QItl&Py~Z)~*No9s;|rLwS?_{7VAU0tzpl%-tP z6$yYph0^faimKrdkVDU*E~m@=T1skKm^?j00ne)(^XxF|wBb%$vj=_)DoQaVTim=f zQX;@tAi)|i$xeG!2jE66HDv;^5|^{-)$AN)?&a`^o(a2@d3|t%N*$)r>R=7y1T_LX z^R1;yfZR%SNW#!CAZIZ87ujXVgWm<_fQY=SKzLYa1^v^HGfg7Tx{C5H`y9}$imFle z4nVnjVEhvU2UWXWE-%F>1W5s{QvhghKo-DwMgdGR5j6lbKMTP5c8KY3M7N=}0L0%5 zP`nU>ZbA1$7`Pii_~+3H0N+1Gp8@RtCB^`>OThz72Y6i#j>1*A442~yTnSM6WIPqy z0Yq=d^FUeO0m^0%T;M|@mkAa>0eA}dho7O{qMv&Xe>b@|SSSVQ>&EBs_oxEcEd26c zkAL9bAxZ^B@e}?TCioTq2I}HIx|yz|Tj&`U=o9lbpj^L&{5*=E6}km zIDsURB$7-9kQ9dT35vNF5hMzqH~R4Z%Bd$x-+Yh$Pn>$9_D%Nq zf8VJm2H#A(|JxvH|C6)$rrcXE#ieuAa|Osp?F*sQA_kxa98E;0|4m5ua*@+uCwTbn zwr2Z4U+}7_>V=`pdm1z&?5%b%!}g{sA+GC%%Cmb`C&WGj{~e_Ha?8r@VL;Q&fi1R1 zmuD{cV|qi+Q_;5@C^}ban_v&reZBPkSc`u1v9_{DFOflHIN+ybFd0IMNeLNBO35&~ zpB|u3(S!65eVRVA1uZ5cNg0YF!%!L-4Q}jVdIYZIGhp$a74(zfU5TlPYFh(fmt_DZ z`_RiNy$!?NV7dUpfd^yU08iVSdQ&35F?oj7O3R&^(GU1FVq_rh?prE4-gP=^BFq8&+SR18D(!HlgSiP zPo@$ZX&{ZHiP*_B`W$_pzCd53N9jxSW%>#|MvreJ(}CkN$V}oSEu@vW;MXjA0{H$a zkFVqL4Lp8?$B*;)AdTQLL*)};JFts#TZ7#R7#jSln(mrYVVmuMaNXq=!Wa%H*b4a;M{{cc z-ARJ9_l@%55F4b^%Gh#E%U?1js^ii@+}u!CVh*(P2ZvK()YHJrQ}w!OkgtncRRU*tc1wzeflMjWj+Q2 zk9jQT@pK+9fI|?xSpT~FaY=|ML@oB;|JGbYsI1l z@pn~wLkkR?(2s^M3EJ;B=pRQrFeU~F^&}vD3lYym-t(w0nFyIfNNYhX(Sc`|_LesX|*K~D+k;bYRl$o~0TPmtG+fCj8@p+4$^NEW@SY&R%guX0s6fV2ZW4M1^__BJ0@C|>a%Pr!c+|70+d zU5ZUHgkjKPhNHjJe}dsUPe%yeDPTm+bN&P)dYuVpB2YLJ$wV>HjD(RgG6HEyiGL-2 z=w(XZDl2W?>AoH#IYxxQ587mq_Z9I;kJ-fMz8F=|*LKibg*u>@X z3?d(fFvXDmyZC(im=bskx|kAy+~4jG(&GUa&Rg6HsI&k~DRccVm6)Xymu zMPWE-0A>V_rE~ybg+8Z5C-@{*gW#SRbqf}}#*AXhnb9EH6=)b!$y@{RxDaQHT2L@c z6+S%hie{g25$6*;FZ*1t*pkpDg65Yr@pu3v*KrJw)81gJm};1#hN)%7!8{er1QN_l zWEA58pma95?X9(dV1Xr?*eH;0^@`D}ys0NI@Mj#I2pE~)ehG68;BhLCWBcFM$;=e- zw(>Zc$8rA4CGw|HxGGJIotefo^EjTzSMWH2$B7qRmEN1-m$pEO^*;@iR{zu4qGZBV z6z|sMP&Oe87$}(m9Ag#&&n7Sm_^aR{R|Pvw6@(Y6r2t5m5_U6ZYPI%oK8=7 zF?TX|@i>FW3M!xMbEo{J6&Zsr>^|%tb~m$L7br*9lvw_E1Jg%bhy57RYk;j90 zJch@`6fAb-|9{3huhG?_@dcunl#&_y6_07gmzDSr>lNlC*zik=p_tcDHS-4ZCXY=t zk;i5pTj&V!O1vXniFbKi097e$^(s2 z?qd!c1uBn?W+kkYmGO88kB9Pj7>~<(RUUJQjTg*uF^@}p&Or1YJmVha0^#!RtUSqvb zKzCUuK&&KX^I0_P{AJ$|$Jga`aZj0UFxtPYJb*Vz@LE0GnorRW+l1YlvBR zLHu`8bQf5Y;4bjE!sjpix52I{P@C5#@3r^+02fl6+%m=^eRz3fnS#AUP{JCe*|ujX;J@9?Je+#Pl_NE8d3t?3OK*lXCjzp0VP z*X%@g5<8ilf{g4``YVrXc|3u~O+21VB|NqZ)fJ*ZG_unL&-~)7JnLX*pvA0{$K!ZB zo`OEB6P@!FrRgpCzI?VBiqFQ+HybTN61u&8Y zaXpWx_DVcEgpWY;125>AHACW(`^XxKFq#Aof>c3U% zF(q&p{e@|nC`^r_Fs&BOd<~DAFXtr&h|)T?6LS6RdiGv+1G|yO4j#|o@k|~&H?du8 zH$Kna$Kw_rd+7Z<_F48h9=G#&Zm-d2Uu0kIk7Tf~u*Y~jo5yqLh+Y;dhFlu} zVX&{UZw3r{i+!8N9Xy@~Wdyyvgi#On2R_&j*pCDq`5}+5?Ig2+dx8R%f=BOhIqeYI z1A;D`hW`vcXTJ!jqhe39U-xe98y+w8Z|$tGwR7xuJf=Ke+_$xVus;W^@)s7=0uPlE zz5+XXQ^4Z>;2>V_gNfK*I5=GBd_5?EA*~zx_vM1Qa7YMqAzUa2QQwU`Uc%#>y1580 zl8fT;%{<<~U{%ADR-fAyI^(CTf_h{ZiU{NZA`WJus~ zaa=ri1((1ja^UCR!sDepzLm$zczhd=mv80r(p$;SMzv{AiC=XhXEop zxEsUfwgDn&Z}JsO3UQYJllLIzP{%J6_zO3vM{0!*B5*F&`1>P3@c;or8rCY@1E|6m zK-b>I2TW38pXPG+965{-NeTgb)zHxbpwsTTn3{jnd7KI=WjJt3Z|~&5DZRrFxrtY; z*dx&Lch+-85Eu@;)0Lf^iN|;P1nv@u*5AF5yAnJF&dO+b44!`oeB}oEzCziAKR>}0 zbERT0aMqz$kkHHO`+Ap;p?#sQp#bWap_;kZ9&%T6<$bFM2Wc%G;h(&c8{4L!k-;Het^fjcnn(jA&^;k z^svBZA;&Y!?RL2@mJ|{B5p<+bg(JK?0a-CGl&bhrKA=pc!brc!_ms=|Ohk`>iy|wi za^W8Mlx<0ehzbZpp%B4oYXhP%v5*T0cqVk~dDb%!Uat{y&|=m{yfK%qSk|BJ2)C=f z4T$suO?;AME-dWH<8W)ZwO|5w`eI`49&R0!J@mYzP-XXa!;|%>0^ag~A3o*JZ9vC1 z(or!z{^bSnVYiw@ z{3H)GQoh1F5l#|E-g+=#@;>dJA-w?>wj&m8(#cd z%-#Sm{@o0({w-sd!>fN=*(303-)S%_8hAnPYHl1ig`3KOuHk0FOL{JNP0s^@awmXM%nX`ZehHpz}c& zfXf+fMSU`=pI@bq9l_?F;h!OMeh4_+61U+~W0hl8IAemeMY@N>a01Ro7P z6?`uE*O2It_z*>iE@W^>amdh+VId*`dnNyiiltHBooO+21kyIoEq5@>5lY9&W@ZP zxgc_3Bp-QmWF$H>eHytqfSMgjvg9a89g?-I=VJ`XY}6aC!-HUACzb$S4v7H z!zCjnS4+wzHIi|XI>|)IWJ$ebo}^Q|5C{G13@i%)pqjF*9No$E=NcC+6dr zFJr!sxeyx^8xk898xb258y9;;Y+`J3Y(=aic2Vro*j2G>V(*S!7kh8)#@MddU9peH z?vC9X`(*4hu}5N`i+v&XXzV}YGU6)Y#>GvEbH^==yD{#jxLe|GjawOaSKR8jwQ={v zZHn6*w? z_|*8Ecul+|esIF3gv|-N680w?PB@zIR>J2ArxH#le4X%Z!r6rH68=a;i6oIt3`z`1 z3`>ki)F;*^(!_0vI}#sD+@JVt;`50o65mREKk=Kyvq?-+L{fB;G$|%&KvI5^I!T+P zPckMIBw3QINmnL~Ou9O$JgFjSd(!Tty-80d9Y{_{&PvWn&P~owUX;8%`S#?M$#*6H zIDiab2LufWNvTYkoKl}+OKD7LOIeu0rz}pnA!SL*%_&P$mZhvqxi@8FN>|FJl+7ty zQ?{k-NO>;hjg;R~b5lp9Hm7b)J(T)l>dUFeQct9QkorUFkEuVW{+jxG>iN_QX*i8Z z)Yo_1H-*0cj@-=_U0kCbQ2hsa0E z8{|#$Y4Yjv8FHt*Ro*6d%f0g1@}=@+^5yb7ATV&N`EB%VEU2t=h9zDeKR>sTqoltc;wD+>9$TN;9s>sLrU(sLPm`F*)Ogj5{*! z%2=IocgDJmdo#K-9?W*ZtS2BK6$P{@Bqr$8xR1_&jC~6hs z6%!Pb6jKya6%C3eg-6k@n4{=WT&q~9SfsdKaie0TVuNC@;uXbLnIW06nR%I(%psX2 znWdS-Ge>4#lUbEnlQ}N4E^}gLQ|7G9`I##+yE7loJd*iw=4Y9wGQZ0FCi84odRAVR zG0U7~&AKXUa8_|vMOIx_eO5!3J!^W_qO9w)mSye8dMN97*85o>Wqq3UMb=kYKWF`x zbv_$q$7ZKzXJ+SQ=VcGd9+f>hyE1!h_QdR2*|W26&Au!9VD^#hb2&_oDyJZ)Fz3pg zfjQMV_MCY+cjoNMc{u0MoF{Vj=A6uVFXz*ovr3sVRVi00l-bH$xJab87UP2TvtiFs4!s8 zr)pApRPCxcst(nB)dJN*6|Y*MTB%y4TB};8+Mw!EZBlJk?NaSlJ*7INdPa3b^_=Q8 z)$6J^RBx$1R!6Ag)CuY&^#HYAZBkp*Me3{6gViI|*Ql%2lhyTVr`n}kU;ZegAhP{R-4Mz+w8eTRWH@s^2(D0ez3&WR&Zw==RKNx;A z{9z0>#u^ii$;K38hB3>iH0Bvi#(~DGjiZf~#wug2alFxK>@dzV&NnVF-eO#4TyDI> zc$aataij4*<5uH#<4)sV<5R{%#%GMr8;=@aF&;ObFur3vW&Fl?#(2*7qwyEx@5b|{ zAXAJf$&_M}n-r!zliH*+8BGPI@g}F~R?}M3X4Czq9j0BThfR-}cAJivo;Mvey<$3U zI%#^{^rq>I>3l(Sfw7>WfG@bM;P!$$3sx80U9hg;fr5Pn2MP`q94>gS;Dv(s3%)8i zTkw6sj|IOKoHrvgF*9a~InJD5PBzQU3UjtuX&!7YH;*xoHP@KOnn$St=~oSgI}KEE6oVEFQ~j%UsKR%XJpsa=m4V z4ryM><>eqQ)x;dh1K7yf7^)?jOxHPR}x##-a8309qTthL_SU~RHCTW46E z)^_W))`iwZ)*Gx#tan=1TJN#0w{}_Yvu?F+v+lP(YdvXw%leM>J?qET&#b4cr>#F1 zp`yqlSy60Jd{J^yYEgQTqR3n{v}k0}sG^FZs-l{raYc1S^NZFNZ7+JT=y6|Af(Q{m Nxo^Zz|KFnB{|7Fhrd9v| diff --git a/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate b/LinearProgressBar.xcodeproj/project.xcworkspace/xcuserdata/iosdev.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 8b496faf9ea8c184b1cb3da1cfe8b9e79a4e00b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23513 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 From 4ea802e579c46e909b857c881c976d935f792d8e Mon Sep 17 00:00:00 2001 From: Cody Winton Date: Sat, 22 Oct 2016 13:26:50 -0500 Subject: [PATCH 12/13] Minor function refactoring --- LinearProgressBar/LinearProgressBar.swift | 8 ++++---- LinearProgressBar/ViewController.swift | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/LinearProgressBar/LinearProgressBar.swift b/LinearProgressBar/LinearProgressBar.swift index 9675094..7f0cedc 100644 --- a/LinearProgressBar/LinearProgressBar.swift +++ b/LinearProgressBar/LinearProgressBar.swift @@ -96,7 +96,7 @@ open class LinearProgressBar: UIView { */ open func show(duration: TimeInterval = 0.5, delay: TimeInterval = 0) { - self.show() + self.display() guard !isAnimationRunning else {return} self.isAnimationRunning = true @@ -119,9 +119,9 @@ open class LinearProgressBar: UIView { - progress: The progress of the task. Should be a value between `0.0` & `1.0` - duration: The animation duration for showing the view. Defaults to `0.5` */ - open func showProgress(progress: CGFloat, duration: TimeInterval = 0.5) { + open func showProgress(_ progress: CGFloat, duration: TimeInterval = 0.5) { - self.show() + self.display() self.isAnimationRunning = false @@ -167,7 +167,7 @@ open class LinearProgressBar: UIView { //MARK: Private Functions - fileprivate func show() { + fileprivate func display() { self.progressBarIndicator.backgroundColor = self.progressBarColor self.layoutIfNeeded() diff --git a/LinearProgressBar/ViewController.swift b/LinearProgressBar/ViewController.swift index 5073522..99226dd 100644 --- a/LinearProgressBar/ViewController.swift +++ b/LinearProgressBar/ViewController.swift @@ -40,7 +40,7 @@ class ViewController: UIViewController { currentProgress = 0 } - self.linearBar.showProgress(progress: currentProgress, duration: 0.3) + self.linearBar.showProgress(currentProgress, duration: 0.3) } @IBAction func startAnimation(_ sender: AnyObject) { From 396465a4231ba0e0971aae535cf6288ff3693a6f Mon Sep 17 00:00:00 2001 From: Cody Winton Date: Sat, 22 Oct 2016 14:03:41 -0500 Subject: [PATCH 13/13] Updated LinearProgressBar class for proper Cocoapod access --- LinearProgressBar.xcodeproj/project.pbxproj | 17 +- LinearProgressBar/LinearProgressBar.swift | 259 ------------- Pod/Classes/LinearProgressBar.swift | 384 +++++++++++++------- 3 files changed, 250 insertions(+), 410 deletions(-) delete mode 100644 LinearProgressBar/LinearProgressBar.swift diff --git a/LinearProgressBar.xcodeproj/project.pbxproj b/LinearProgressBar.xcodeproj/project.pbxproj index 9eb3f3b..ea9393f 100644 --- a/LinearProgressBar.xcodeproj/project.pbxproj +++ b/LinearProgressBar.xcodeproj/project.pbxproj @@ -12,7 +12,7 @@ 3721E0741DA78F1100DC9E8F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3721E0721DA78F1100DC9E8F /* Main.storyboard */; }; 3721E0761DA78F1100DC9E8F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3721E0751DA78F1100DC9E8F /* Assets.xcassets */; }; 3721E0791DA78F1100DC9E8F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3721E0771DA78F1100DC9E8F /* LaunchScreen.storyboard */; }; - 3721E0821DA78FA500DC9E8F /* LinearProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3721E0811DA78FA500DC9E8F /* LinearProgressBar.swift */; }; + 6AD200AF1DBBEE77007DA1A4 /* LinearProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AD200AD1DBBED76007DA1A4 /* LinearProgressBar.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -23,7 +23,7 @@ 3721E0751DA78F1100DC9E8F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 3721E0781DA78F1100DC9E8F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 3721E07A1DA78F1100DC9E8F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 3721E0811DA78FA500DC9E8F /* LinearProgressBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinearProgressBar.swift; sourceTree = ""; }; + 6AD200AD1DBBED76007DA1A4 /* LinearProgressBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LinearProgressBar.swift; path = Pod/Classes/LinearProgressBar.swift; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -56,7 +56,7 @@ 3721E06D1DA78F1100DC9E8F /* LinearProgressBar */ = { isa = PBXGroup; children = ( - 3721E0801DA78F9C00DC9E8F /* Lib */, + 6AD200AD1DBBED76007DA1A4 /* LinearProgressBar.swift */, 3721E06E1DA78F1100DC9E8F /* AppDelegate.swift */, 3721E0701DA78F1100DC9E8F /* ViewController.swift */, 3721E0721DA78F1100DC9E8F /* Main.storyboard */, @@ -67,14 +67,6 @@ path = LinearProgressBar; sourceTree = ""; }; - 3721E0801DA78F9C00DC9E8F /* Lib */ = { - isa = PBXGroup; - children = ( - 3721E0811DA78FA500DC9E8F /* LinearProgressBar.swift */, - ); - name = Lib; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -150,7 +142,7 @@ files = ( 3721E0711DA78F1100DC9E8F /* ViewController.swift in Sources */, 3721E06F1DA78F1100DC9E8F /* AppDelegate.swift in Sources */, - 3721E0821DA78FA500DC9E8F /* LinearProgressBar.swift in Sources */, + 6AD200AF1DBBEE77007DA1A4 /* LinearProgressBar.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -314,6 +306,7 @@ 3721E07F1DA78F1100DC9E8F /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/LinearProgressBar/LinearProgressBar.swift b/LinearProgressBar/LinearProgressBar.swift deleted file mode 100644 index 7f0cedc..0000000 --- a/LinearProgressBar/LinearProgressBar.swift +++ /dev/null @@ -1,259 +0,0 @@ -// -// LinearProgressBar.swift -// CookMinute -// -// Created by Philippe Boisney on 18/11/2015. -// Copyright © 2015 CookMinute. All rights reserved. -// -// Google Guidelines: https://www.google.com/design/spec/components/progress-activity.html#progress-activity-types-of-indicators -// - -import UIKit - -fileprivate var screenSize: CGRect { - return UIScreen.main.bounds -} - -open class LinearProgressBar: UIView { - - // MARK: - Private Variables - - fileprivate var isAnimationRunning = false - - fileprivate lazy var progressBarIndicator: UIView = { - let frame = CGRect(origin: CGPoint(x: 0, y:0), size: CGSize(width: 0, height: self.progressBarHeight)) - return UIView(frame: frame) - }() - - - // MARK: Public Variables - - open var progressBarHeight: CGFloat - - /// Background color for the progress bar - open var progressBarColor: UIColor = UIColor(red:0.12, green:0.53, blue:0.90, alpha:1.0) - - /// Used to determine how much variation the progress bar should animate - open var widthRatioOffset: CGFloat = 0.7 - - /// The offset used to determine how far offscreen the progress bar should start and finish animation - open var xOffset: CGFloat = 0 - - /// The progress bar animation duration - open var keyframeDuration: TimeInterval = 1.0 - - - // MARK: Deprecated - - @available(*, deprecated, message: "Please use backgroundColor instead", renamed: "backgroundColor") - var backgroundProgressBarColor: UIColor = UIColor.white - - @available(*, deprecated, message: "Please use progressBarHeight instead", renamed: "progressBarHeight") - var heightForLinearBar: CGFloat = 5 - - @available(*, deprecated, message: "Please adjust frame.size.width instead") - var widthForLinearBar: CGFloat = 0 - - - // MARK: Inits - - public convenience init(height: CGFloat = 5) { - self.init(frame: CGRect(origin: CGPoint(x: 0,y :20), size: CGSize(width: screenSize.width, height: height))) - } - - override public init(frame: CGRect) { - progressBarHeight = frame.height - var frame = frame - frame.size.height = 0 - super.init(frame: frame) - self.clipsToBounds = true - } - - required public init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - //MARK: - Public Functions - - override open func layoutSubviews() { - super.layoutSubviews() - - var rect = self.frame - - if rect.width == 0 || rect.width == screenSize.height { - rect.size.width = screenSize.width - } - - self.frame = rect - } - - /** - Shows the view, if not currently shown, then starts the animation - - - parameters: - - duration: The animation duration for showing the view. Defaults to `0.5` - - delay: The delay for showing the view. Defaults to `0.0` - */ - open func show(duration: TimeInterval = 0.5, delay: TimeInterval = 0) { - - self.display() - - guard !isAnimationRunning else {return} - self.isAnimationRunning = true - - var rect = self.frame - rect.size.height = self.progressBarHeight - - UIView.animate(withDuration: duration, delay: delay, options: [], animations: { - self.frame = rect - }) { animationFinished in - self.addSubview(self.progressBarIndicator) - self.configureAnimations() - } - } - - /** - Shows the view, if not currently shown, then displays a specific progress value. This is useful for displaying progress of a task. - - - parameters: - - progress: The progress of the task. Should be a value between `0.0` & `1.0` - - duration: The animation duration for showing the view. Defaults to `0.5` - */ - open func showProgress(_ progress: CGFloat, duration: TimeInterval = 0.5) { - - self.display() - - self.isAnimationRunning = false - - var rect = self.frame - rect.size.height = self.progressBarHeight - - var progressRect = self.progressBarIndicator.frame - progressRect.origin = CGPoint.zero - self.progressBarIndicator.frame = progressRect - - progressRect.size.width = self.frame.width * progress - - UIView.animate(withDuration: duration, delay: 0, options: [], animations: { - self.frame = rect - }) { animationFinished in - self.addSubview(self.progressBarIndicator) - UIView.animate(withDuration: duration) { - self.progressBarIndicator.frame = progressRect - } - } - } - - /** - Dismisses the view, if currently shown. - - - parameters: - - duration: The animation duration for dismissing the view. Defaults to `0.5` - */ - open func dismiss(duration: TimeInterval = 0.5) { - - self.isAnimationRunning = false - - var rect = self.frame - rect.size.height = 0 - - UIView.animate(withDuration: duration, animations: { - self.frame = rect - }) { (finished: Bool) in - self.progressBarIndicator.removeFromSuperview() - } - } - - - //MARK: Private Functions - - fileprivate func display() { - self.progressBarIndicator.backgroundColor = self.progressBarColor - self.layoutIfNeeded() - - guard self.superview == nil, let view = UIApplication.shared.keyWindow?.visibleViewController?.view else {return} - view.addSubview(self) - } - - fileprivate func configureAnimations() { - - guard let _ = self.superview else { - dismiss() - return - } - - guard self.isAnimationRunning else {return} - - self.progressBarIndicator.frame = CGRect(origin: CGPoint(x: 0, y :0), size: CGSize(width: 0, height: progressBarHeight)) - - UIView.animateKeyframes(withDuration: keyframeDuration, delay: 0, options: [], animations: { - - UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: self.keyframeDuration/2) { - self.progressBarIndicator.frame = CGRect(x: -self.xOffset, y: 0, width: self.frame.width * self.widthRatioOffset, height: self.progressBarHeight) - } - - UIView.addKeyframe(withRelativeStartTime: self.keyframeDuration/2, relativeDuration: self.keyframeDuration/2) { - self.progressBarIndicator.frame = CGRect(x: self.frame.width, y: 0, width: self.xOffset, height: self.progressBarHeight) - } - - }) { (completed) in - guard self.isAnimationRunning else {return} - self.configureAnimations() - } - } - - - // MARK: Deprecated - - @available(*, deprecated, message: "Please use show() instead", renamed: "show") - func startAnimation() { - self.show() - } - - @available(*, deprecated, message: "Please use dismiss() instead", renamed: "dismiss") - func stopAnimation() { - self.dismiss() - } -} - - -// MARK: - - -fileprivate extension UIWindow { - - /** - Returns the currently visible view controller - - - returns: The visible view controller - */ - var visibleViewController: UIViewController? { - return getVisibleViewController(forRootController: rootViewController) - } - - /** - Returns the visible view controller - - - parameters: - - currentRootViewController: Current Root View Controller - - returns: The visible view controller - */ - func getVisibleViewController(forRootController currentRootViewController: UIViewController?) -> UIViewController? { - - guard let controller = currentRootViewController else {return nil} - - switch controller { - - case let navVC as UINavigationController: - return getVisibleViewController(forRootController: navVC.viewControllers.last) - - case let tabVC as UITabBarController: - return getVisibleViewController(forRootController: tabVC.selectedViewController) - - case let controller where controller.presentedViewController != nil: - return getVisibleViewController(forRootController: controller.presentedViewController) - - default: - return controller - } - } -} diff --git a/Pod/Classes/LinearProgressBar.swift b/Pod/Classes/LinearProgressBar.swift index 4d0ffa4..55a96db 100644 --- a/Pod/Classes/LinearProgressBar.swift +++ b/Pod/Classes/LinearProgressBar.swift @@ -10,144 +10,250 @@ import UIKit +fileprivate var screenSize: CGRect { + return UIScreen.main.bounds +} + open class LinearProgressBar: UIView { - - //FOR DATA - fileprivate var screenSize: CGRect = UIScreen.main.bounds - fileprivate var isAnimationRunning = false - - //FOR DESIGN - fileprivate var progressBarIndicator: UIView! - - //PUBLIC VARS - open var backgroundProgressBarColor: UIColor = UIColor(red:0.73, green:0.87, blue:0.98, alpha:1.0) - open var progressBarColor: UIColor = UIColor(red:0.12, green:0.53, blue:0.90, alpha:1.0) - open var heightForLinearBar: CGFloat = 5 - open var widthForLinearBar: CGFloat = 0 - - public init () { - super.init(frame: CGRect(origin: CGPoint(x: 0,y :20), size: CGSize(width: screenSize.width, height: 0))) - self.progressBarIndicator = UIView(frame: CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 0, height: heightForLinearBar))) - } - - override public init(frame: CGRect) { - super.init(frame: frame) - self.progressBarIndicator = UIView(frame: CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 0, height: heightForLinearBar))) - } - - required public init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - //MARK: LIFE OF VIEW - override open func layoutSubviews() { - super.layoutSubviews() - self.screenSize = UIScreen.main.bounds - - if widthForLinearBar == 0 || widthForLinearBar == self.screenSize.height { - widthForLinearBar = self.screenSize.width - } - - if (UIDeviceOrientationIsLandscape(UIDevice.current.orientation)) { - self.frame = CGRect(origin: CGPoint(x: self.frame.origin.x,y :self.frame.origin.y), size: CGSize(width: widthForLinearBar, height: self.frame.height)) - } - - if (UIDeviceOrientationIsPortrait(UIDevice.current.orientation)) { - self.frame = CGRect(origin: CGPoint(x: self.frame.origin.x,y :self.frame.origin.y), size: CGSize(width: widthForLinearBar, height: self.frame.height)) - } - } - - //MARK: PUBLIC FUNCTIONS ------------------------------------------------------------------------------------------ - - //Start the animation - open func startAnimation(){ - - self.configureColors() - - self.show() - - if !isAnimationRunning { - self.isAnimationRunning = true - - UIView.animate(withDuration: 0.5, delay:0, options: [], animations: { - self.frame = CGRect(x: 0, y: self.frame.origin.y, width: self.widthForLinearBar, height: self.heightForLinearBar) - }, completion: { animationFinished in - self.addSubview(self.progressBarIndicator) - self.configureAnimation() - }) - } - } - - //Start the animation - open func stopAnimation() { - - self.isAnimationRunning = false - - UIView.animate(withDuration: 0.5, animations: { - self.progressBarIndicator.frame = CGRect(x: 0, y: 0, width: self.widthForLinearBar, height: 0) - self.frame = CGRect(x: 0, y: self.frame.origin.y, width: self.widthForLinearBar, height: 0) - }) - } - - //MARK: PRIVATE FUNCTIONS ------------------------------------------------------------------------------------------ - - fileprivate func show() { - - // Only show once - if self.superview != nil { - return - } - - // Find current top viewcontroller - if let topController = getTopViewController() { - let superView: UIView = topController.view - superView.addSubview(self) - } - } - - fileprivate func configureColors(){ - - self.backgroundColor = self.backgroundProgressBarColor - self.progressBarIndicator.backgroundColor = self.progressBarColor - self.layoutIfNeeded() - } - - fileprivate func configureAnimation() { - - guard let superview = self.superview else { - stopAnimation() - return - } - - self.progressBarIndicator.frame = CGRect(origin: CGPoint(x: 0, y :0), size: CGSize(width: 0, height: heightForLinearBar)) - - UIView.animateKeyframes(withDuration: 1.0, delay: 0, options: [], animations: { - - UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5, animations: { - self.progressBarIndicator.frame = CGRect(x: 0, y: 0, width: self.widthForLinearBar*0.7, height: self.heightForLinearBar) - }) - - UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5, animations: { - self.progressBarIndicator.frame = CGRect(x: superview.frame.width, y: 0, width: 0, height: self.heightForLinearBar) - - }) - - }) { (completed) in - if (self.isAnimationRunning){ - self.configureAnimation() - } - } - } - - // ----------------------------------------------------- - //MARK: UTILS --------------------------------------- - // ----------------------------------------------------- - - fileprivate func getTopViewController() -> UIViewController? { - var topController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController - while topController?.presentedViewController != nil { - topController = topController?.presentedViewController - } - return topController - } + + // MARK: - Private Variables + + fileprivate var isAnimationRunning = false + + fileprivate lazy var progressBarIndicator: UIView = { + let frame = CGRect(origin: CGPoint(x: 0, y:0), size: CGSize(width: 0, height: self.progressBarHeight)) + return UIView(frame: frame) + }() + + + // MARK: Public Variables + + open var progressBarHeight: CGFloat + + /// Background color for the progress bar + open var progressBarColor: UIColor = UIColor(red:0.12, green:0.53, blue:0.90, alpha:1.0) + + /// Used to determine how much variation the progress bar should animate + open var widthRatioOffset: CGFloat = 0.7 + + /// The offset used to determine how far offscreen the progress bar should start and finish animation + open var xOffset: CGFloat = 0 + + /// The progress bar animation duration + open var keyframeDuration: TimeInterval = 1.0 + + + // MARK: Deprecated + + @available(*, deprecated, message: "Please use backgroundColor instead", renamed: "backgroundColor") + var backgroundProgressBarColor: UIColor = UIColor.white + + @available(*, deprecated, message: "Please use progressBarHeight instead", renamed: "progressBarHeight") + var heightForLinearBar: CGFloat = 5 + + @available(*, deprecated, message: "Please adjust frame.size.width instead") + var widthForLinearBar: CGFloat = 0 + + + // MARK: Inits + + public convenience init(height: CGFloat = 5) { + self.init(frame: CGRect(origin: CGPoint(x: 0,y :20), size: CGSize(width: screenSize.width, height: height))) + } + + override public init(frame: CGRect) { + progressBarHeight = frame.height + var frame = frame + frame.size.height = 0 + super.init(frame: frame) + self.clipsToBounds = true + } + + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + //MARK: - Public Functions + + override open func layoutSubviews() { + super.layoutSubviews() + + var rect = self.frame + + if rect.width == 0 || rect.width == screenSize.height { + rect.size.width = screenSize.width + } + + self.frame = rect + } + + /** + Shows the view, if not currently shown, then starts the animation + + - parameters: + - duration: The animation duration for showing the view. Defaults to `0.5` + - delay: The delay for showing the view. Defaults to `0.0` + */ + open func show(duration: TimeInterval = 0.5, delay: TimeInterval = 0) { + + self.display() + + guard !isAnimationRunning else {return} + self.isAnimationRunning = true + + var rect = self.frame + rect.size.height = self.progressBarHeight + + UIView.animate(withDuration: duration, delay: delay, options: [], animations: { + self.frame = rect + }) { animationFinished in + self.addSubview(self.progressBarIndicator) + self.configureAnimations() + } + } + + /** + Shows the view, if not currently shown, then displays a specific progress value. This is useful for displaying progress of a task. + + - parameters: + - progress: The progress of the task. Should be a value between `0.0` & `1.0` + - duration: The animation duration for showing the view. Defaults to `0.5` + */ + open func showProgress(_ progress: CGFloat, duration: TimeInterval = 0.5) { + + self.display() + + self.isAnimationRunning = false + + var rect = self.frame + rect.size.height = self.progressBarHeight + + var progressRect = self.progressBarIndicator.frame + progressRect.origin = CGPoint.zero + self.progressBarIndicator.frame = progressRect + + progressRect.size.width = self.frame.width * progress + + UIView.animate(withDuration: duration, delay: 0, options: [], animations: { + self.frame = rect + }) { animationFinished in + self.addSubview(self.progressBarIndicator) + UIView.animate(withDuration: duration) { + self.progressBarIndicator.frame = progressRect + } + } + } + + /** + Dismisses the view, if currently shown. + + - parameters: + - duration: The animation duration for dismissing the view. Defaults to `0.5` + */ + open func dismiss(duration: TimeInterval = 0.5) { + + self.isAnimationRunning = false + + var rect = self.frame + rect.size.height = 0 + + UIView.animate(withDuration: duration, animations: { + self.frame = rect + }) { (finished: Bool) in + self.progressBarIndicator.removeFromSuperview() + } + } + + + //MARK: Private Functions + + fileprivate func display() { + self.progressBarIndicator.backgroundColor = self.progressBarColor + self.layoutIfNeeded() + + guard self.superview == nil, let view = UIApplication.shared.keyWindow?.visibleViewController?.view else {return} + view.addSubview(self) + } + + fileprivate func configureAnimations() { + + guard let _ = self.superview else { + dismiss() + return + } + + guard self.isAnimationRunning else {return} + + self.progressBarIndicator.frame = CGRect(origin: CGPoint(x: 0, y :0), size: CGSize(width: 0, height: progressBarHeight)) + + UIView.animateKeyframes(withDuration: keyframeDuration, delay: 0, options: [], animations: { + + UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: self.keyframeDuration/2) { + self.progressBarIndicator.frame = CGRect(x: -self.xOffset, y: 0, width: self.frame.width * self.widthRatioOffset, height: self.progressBarHeight) + } + + UIView.addKeyframe(withRelativeStartTime: self.keyframeDuration/2, relativeDuration: self.keyframeDuration/2) { + self.progressBarIndicator.frame = CGRect(x: self.frame.width, y: 0, width: self.xOffset, height: self.progressBarHeight) + } + + }) { (completed) in + guard self.isAnimationRunning else {return} + self.configureAnimations() + } + } + + + // MARK: Deprecated + + @available(*, deprecated, message: "Please use show() instead", renamed: "show") + func startAnimation() { + self.show() + } + + @available(*, deprecated, message: "Please use dismiss() instead", renamed: "dismiss") + func stopAnimation() { + self.dismiss() + } +} + + +// MARK: - + +fileprivate extension UIWindow { + + /** + Returns the currently visible view controller + + - returns: The visible view controller + */ + var visibleViewController: UIViewController? { + return getVisibleViewController(forRootController: rootViewController) + } + + /** + Returns the visible view controller + + - parameters: + - currentRootViewController: Current Root View Controller + - returns: The visible view controller + */ + func getVisibleViewController(forRootController currentRootViewController: UIViewController?) -> UIViewController? { + + guard let controller = currentRootViewController else {return nil} + + switch controller { + + case let navVC as UINavigationController: + return getVisibleViewController(forRootController: navVC.viewControllers.last) + + case let tabVC as UITabBarController: + return getVisibleViewController(forRootController: tabVC.selectedViewController) + + case let controller where controller.presentedViewController != nil: + return getVisibleViewController(forRootController: controller.presentedViewController) + + default: + return controller + } + } }