From 691e1305c52f69362adf18b9f3e7c86a2f31d4df Mon Sep 17 00:00:00 2001 From: Felix Mau Date: Mon, 3 Sep 2018 18:43:05 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=B8=20::=20Updated=20example=20applica?= =?UTF-8?q?tion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project.pbxproj | 52 +- .../AdvancedExampleViewController.swift | 59 ++ .../Base.lproj/LaunchScreen.xib | 26 +- .../Base.lproj/Main.storyboard | 418 +++++++-- .../BasicExampleViewController.swift | 38 + .../BlueBorderedButton.swift | 36 + .../GradientLoadingBar/BlueFilledButton.swift | 34 + .../Images.xcassets/Contents.json | 6 + .../iOS 11 Glyphen/Contents.json | 6 + .../home.imageset/Contents.json | 12 + .../iOS 11 Glyphen/home.imageset/home.pdf | Bin 0 -> 61994 bytes .../idea.imageset/Contents.json | 12 + .../iOS 11 Glyphen/idea.imageset/idea.pdf | Bin 0 -> 62044 bytes .../iphone_x.imageset/Contents.json | 12 + .../iphone_x.imageset/iphone_x.pdf | Bin 0 -> 69890 bytes .../rocket.imageset/Contents.json | 12 + .../iOS 11 Glyphen/rocket.imageset/rocket.pdf | Bin 0 -> 62126 bytes .../NavigationBarExampleViewController.swift | 49 + .../SafeAreaExampleViewController.swift | 39 + .../UIColor+CustomColors.swift | 13 + .../GradientLoadingBar/ViewController.swift | 113 --- Example/Podfile.lock | 7 +- Example/Pods/Manifest.lock | 2 +- Example/Pods/Pods.xcodeproj/project.pbxproj | 838 +++++++++--------- .../xcschemes/GradientLoadingBar.xcscheme | 4 +- .../GradientLoadingBar.xcconfig | 2 +- .../Observable/Observable.xcconfig | 2 +- ...adingBar_Example-acknowledgements.markdown | 50 -- ...tLoadingBar_Example-acknowledgements.plist | 62 -- .../Observable+ObserveDistinctTestCase.swift | 54 ++ .../GradientLoadingBarViewModelTestCase.swift | 23 +- Extensions/Observable+ObserveDistinct.swift | 21 + .../UIColor+DefaultGradientColors.swift | 21 + .../UIColor}/UIColor+Initializers.swift | 0 .../GradientLoadingBarController.swift | 161 ++-- .../GradientLoadingBarViewModel.swift | 51 +- .../Classes/Views/GradientView.swift | 135 +-- .../Structs => Structs}/Durations.swift | 7 +- 38 files changed, 1469 insertions(+), 908 deletions(-) create mode 100644 Example/GradientLoadingBar/AdvancedExampleViewController.swift create mode 100644 Example/GradientLoadingBar/BasicExampleViewController.swift create mode 100644 Example/GradientLoadingBar/BlueBorderedButton.swift create mode 100644 Example/GradientLoadingBar/BlueFilledButton.swift create mode 100644 Example/GradientLoadingBar/Images.xcassets/Contents.json create mode 100644 Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/Contents.json create mode 100644 Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/home.imageset/Contents.json create mode 100644 Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/home.imageset/home.pdf create mode 100644 Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/idea.imageset/Contents.json create mode 100644 Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/idea.imageset/idea.pdf create mode 100644 Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/iphone_x.imageset/Contents.json create mode 100644 Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/iphone_x.imageset/iphone_x.pdf create mode 100644 Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/rocket.imageset/Contents.json create mode 100644 Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/rocket.imageset/rocket.pdf create mode 100644 Example/GradientLoadingBar/NavigationBarExampleViewController.swift create mode 100644 Example/GradientLoadingBar/SafeAreaExampleViewController.swift create mode 100644 Example/GradientLoadingBar/UIColor+CustomColors.swift delete mode 100644 Example/GradientLoadingBar/ViewController.swift create mode 100644 Example/Tests/Helpers/Extensions/Observable+ObserveDistinctTestCase.swift create mode 100644 Extensions/Observable+ObserveDistinct.swift create mode 100644 Extensions/UIColor/UIColor+DefaultGradientColors.swift rename {GradientLoadingBar/Classes/Helpers/Extensions => Extensions/UIColor}/UIColor+Initializers.swift (100%) rename {GradientLoadingBar/Classes/Helpers/Structs => Structs}/Durations.swift (88%) diff --git a/Example/GradientLoadingBar.xcodeproj/project.pbxproj b/Example/GradientLoadingBar.xcodeproj/project.pbxproj index 7a5c048..ad21024 100644 --- a/Example/GradientLoadingBar.xcodeproj/project.pbxproj +++ b/Example/GradientLoadingBar.xcodeproj/project.pbxproj @@ -8,15 +8,22 @@ /* Begin PBXBuildFile section */ 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; - 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; + 607FACD81AFB9204008FA782 /* BasicExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* BasicExampleViewController.swift */; }; 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 77357BD34CFF2778341F80E8 /* Pods_GradientLoadingBar_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03CD5D69D7C3FBBDBF5FABBB /* Pods_GradientLoadingBar_Example.framework */; }; 8020C040972E902A8CCAA9E7 /* Pods_GradientLoadingBar_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 434E3C8A6E245A38C2831E73 /* Pods_GradientLoadingBar_Tests.framework */; }; 970738871FA7286400930D92 /* UIColor+InitializersTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970738841FA7286400930D92 /* UIColor+InitializersTestCase.swift */; }; + 972CFBCC2138849A006F14C9 /* SafeAreaExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 972CFBCB2138849A006F14C9 /* SafeAreaExampleViewController.swift */; }; + 97464E60213725B50097183A /* BlueFilledButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97464E5F213725B50097183A /* BlueFilledButton.swift */; }; + 97464E62213725C80097183A /* BlueBorderedButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97464E61213725C80097183A /* BlueBorderedButton.swift */; }; + 97464E65213726A10097183A /* UIColor+CustomColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97464E64213726A10097183A /* UIColor+CustomColors.swift */; }; + 97464E6721372BCD0097183A /* AdvancedExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97464E6621372BCD0097183A /* AdvancedExampleViewController.swift */; }; + 97464E6921372C010097183A /* NavigationBarExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97464E6821372C010097183A /* NavigationBarExampleViewController.swift */; }; 974E3F1C1FF2AA4400C96A59 /* DurationsTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 974E3F161FF2A85600C96A59 /* DurationsTestCase.swift */; }; 974E3F221FF2DEAA00C96A59 /* GradientLoadingBarViewModelTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 974E3F211FF2DEAA00C96A59 /* GradientLoadingBarViewModelTestCase.swift */; }; + 97FA595B213184DF00CCD446 /* Observable+ObserveDistinctTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97FA595A213184DF00CCD446 /* Observable+ObserveDistinctTestCase.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -39,15 +46,22 @@ 607FACD01AFB9204008FA782 /* GradientLoadingBar_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GradientLoadingBar_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 607FACD71AFB9204008FA782 /* BasicExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicExampleViewController.swift; sourceTree = ""; }; 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 607FACE51AFB9204008FA782 /* GradientLoadingBar_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GradientLoadingBar_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 970738841FA7286400930D92 /* UIColor+InitializersTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+InitializersTestCase.swift"; sourceTree = ""; }; + 972CFBCB2138849A006F14C9 /* SafeAreaExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafeAreaExampleViewController.swift; sourceTree = ""; }; + 97464E5F213725B50097183A /* BlueFilledButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlueFilledButton.swift; sourceTree = ""; }; + 97464E61213725C80097183A /* BlueBorderedButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlueBorderedButton.swift; sourceTree = ""; }; + 97464E64213726A10097183A /* UIColor+CustomColors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+CustomColors.swift"; sourceTree = ""; }; + 97464E6621372BCD0097183A /* AdvancedExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedExampleViewController.swift; sourceTree = ""; }; + 97464E6821372C010097183A /* NavigationBarExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarExampleViewController.swift; sourceTree = ""; }; 974E3F161FF2A85600C96A59 /* DurationsTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DurationsTestCase.swift; sourceTree = ""; }; 974E3F211FF2DEAA00C96A59 /* GradientLoadingBarViewModelTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientLoadingBarViewModelTestCase.swift; sourceTree = ""; }; + 97FA595A213184DF00CCD446 /* Observable+ObserveDistinctTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Observable+ObserveDistinctTestCase.swift"; sourceTree = ""; }; C06CA4DFA1DCB931095ABD3D /* GradientLoadingBar.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = GradientLoadingBar.podspec; path = ../GradientLoadingBar.podspec; sourceTree = ""; }; F76834BE9E43CA11377EC030 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; FECB95A4857728345199461F /* Pods-GradientLoadingBar_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GradientLoadingBar_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.debug.xcconfig"; sourceTree = ""; }; @@ -97,8 +111,13 @@ 607FACD21AFB9204008FA782 /* Example for GradientLoadingBar */ = { isa = PBXGroup; children = ( + 97464E63213726920097183A /* Extensions */, + 97464E5E213725A20097183A /* Views */, + 607FACD71AFB9204008FA782 /* BasicExampleViewController.swift */, + 972CFBCB2138849A006F14C9 /* SafeAreaExampleViewController.swift */, + 97464E6621372BCD0097183A /* AdvancedExampleViewController.swift */, + 97464E6821372C010097183A /* NavigationBarExampleViewController.swift */, 607FACD51AFB9204008FA782 /* AppDelegate.swift */, - 607FACD71AFB9204008FA782 /* ViewController.swift */, 607FACD91AFB9204008FA782 /* Main.storyboard */, 607FACDC1AFB9204008FA782 /* Images.xcassets */, 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, @@ -157,10 +176,28 @@ isa = PBXGroup; children = ( 970738841FA7286400930D92 /* UIColor+InitializersTestCase.swift */, + 97FA595A213184DF00CCD446 /* Observable+ObserveDistinctTestCase.swift */, ); path = Extensions; sourceTree = ""; }; + 97464E5E213725A20097183A /* Views */ = { + isa = PBXGroup; + children = ( + 97464E5F213725B50097183A /* BlueFilledButton.swift */, + 97464E61213725C80097183A /* BlueBorderedButton.swift */, + ); + name = Views; + sourceTree = ""; + }; + 97464E63213726920097183A /* Extensions */ = { + isa = PBXGroup; + children = ( + 97464E64213726A10097183A /* UIColor+CustomColors.swift */, + ); + name = Extensions; + sourceTree = ""; + }; 974E3F151FF2A85600C96A59 /* Structs */ = { isa = PBXGroup; children = ( @@ -470,8 +507,14 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, + 607FACD81AFB9204008FA782 /* BasicExampleViewController.swift in Sources */, + 972CFBCC2138849A006F14C9 /* SafeAreaExampleViewController.swift in Sources */, + 97464E6721372BCD0097183A /* AdvancedExampleViewController.swift in Sources */, + 97464E65213726A10097183A /* UIColor+CustomColors.swift in Sources */, 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, + 97464E6921372C010097183A /* NavigationBarExampleViewController.swift in Sources */, + 97464E62213725C80097183A /* BlueBorderedButton.swift in Sources */, + 97464E60213725B50097183A /* BlueFilledButton.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -482,6 +525,7 @@ 970738871FA7286400930D92 /* UIColor+InitializersTestCase.swift in Sources */, 974E3F221FF2DEAA00C96A59 /* GradientLoadingBarViewModelTestCase.swift in Sources */, 974E3F1C1FF2AA4400C96A59 /* DurationsTestCase.swift in Sources */, + 97FA595B213184DF00CCD446 /* Observable+ObserveDistinctTestCase.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Example/GradientLoadingBar/AdvancedExampleViewController.swift b/Example/GradientLoadingBar/AdvancedExampleViewController.swift new file mode 100644 index 0000000..2994116 --- /dev/null +++ b/Example/GradientLoadingBar/AdvancedExampleViewController.swift @@ -0,0 +1,59 @@ +// +// AdvancedExampleViewController.swift +// GradientLoadingBar_Example +// +// Created by Felix Mau on 29.08.18. +// Copyright © 2018 CocoaPods. All rights reserved. +// + +import UIKit +import GradientLoadingBar + +class AdvancedExampleViewController: UIViewController { + // MARK: - Outlets + + @IBOutlet var customSuperviewButton: BlueBorderedButton! + @IBOutlet var customGradientColorsButton: BlueBorderedButton! + + // MARK: - Private properties + + private var buttonGradientLoadingBar: GradientLoadingBar? + private var customGradientColorsGradientLoadingBar: GradientLoadingBar? + + // MARK: - Public methods + + override func viewDidLoad() { + super.viewDidLoad() + + buttonGradientLoadingBar = GradientLoadingBar(height: 3.0, + onView: customSuperviewButton) + + // Source: https://color.adobe.com/Pink-Flamingo-color-theme-10343714/ + customGradientColorsGradientLoadingBar = BottomGradientLoadingBar(height: 3.0, + gradientColorList: [ + UIColor(hex: "#f2526e"), + UIColor(hex: "#f17a97"), + UIColor(hex: "#f3bcc8"), + UIColor(hex: "#6dddf2"), + UIColor(hex: "#c1f0f4") + ], + onView: customGradientColorsButton) + } + + @IBAction func customSuperviewButtonTouchUpInside(_: Any) { + buttonGradientLoadingBar?.toggle() + } + + @IBAction func customGradientColorsButtonTouchUpInside(_: Any) { + customGradientColorsGradientLoadingBar?.toggle() + } +} + +// MARK: - UIBarPositioningDelegate + +// Notice: Delegate is setted-up via storyboard. +extension AdvancedExampleViewController: UINavigationBarDelegate { + func position(for _: UIBarPositioning) -> UIBarPosition { + return .topAttached + } +} diff --git a/Example/GradientLoadingBar/Base.lproj/LaunchScreen.xib b/Example/GradientLoadingBar/Base.lproj/LaunchScreen.xib index 8b30891..471bf97 100644 --- a/Example/GradientLoadingBar/Base.lproj/LaunchScreen.xib +++ b/Example/GradientLoadingBar/Base.lproj/LaunchScreen.xib @@ -1,11 +1,11 @@ - + - + @@ -14,7 +14,29 @@ + + + + + + + + + + + + diff --git a/Example/GradientLoadingBar/Base.lproj/Main.storyboard b/Example/GradientLoadingBar/Base.lproj/Main.storyboard index 53c1b49..efa758d 100644 --- a/Example/GradientLoadingBar/Base.lproj/Main.storyboard +++ b/Example/GradientLoadingBar/Base.lproj/Main.storyboard @@ -1,18 +1,19 @@ - + - + + - + - + @@ -21,122 +22,343 @@ - - + + + + + + + + + + + + + + + + + - - - - - - - + - - + + + + + + + - + + + + + + + - - - + + + + + + + - - - - - - - - - + + - + - - + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/GradientLoadingBar/BasicExampleViewController.swift b/Example/GradientLoadingBar/BasicExampleViewController.swift new file mode 100644 index 0000000..d89ec42 --- /dev/null +++ b/Example/GradientLoadingBar/BasicExampleViewController.swift @@ -0,0 +1,38 @@ +// +// BasicExampleViewController.swift +// GradientLoadingBar_Example +// +// Created by fxm90 on 09/30/2017. +// Copyright (c) 2017 fxm90. All rights reserved. +// + +import UIKit +import GradientLoadingBar + +class BasicExampleViewController: UIViewController { + // MARK: - Public methods + + @IBAction func showButtonTouchUpInside(_: Any) { + let gradientLoadingBar = GradientLoadingBar.shared + gradientLoadingBar.show() + } + + @IBAction func toggleButtonTouchUpInside(_: Any) { + let gradientLoadingBar = GradientLoadingBar.shared + gradientLoadingBar.toggle() + } + + @IBAction func hideButtonTouchUpInside(_: Any) { + let gradientLoadingBar = GradientLoadingBar.shared + gradientLoadingBar.hide() + } +} + +// MARK: - UIBarPositioningDelegate + +// Notice: Delegate is setted-up via storyboard. +extension BasicExampleViewController: UINavigationBarDelegate { + func position(for _: UIBarPositioning) -> UIBarPosition { + return .topAttached + } +} diff --git a/Example/GradientLoadingBar/BlueBorderedButton.swift b/Example/GradientLoadingBar/BlueBorderedButton.swift new file mode 100644 index 0000000..a3a1b84 --- /dev/null +++ b/Example/GradientLoadingBar/BlueBorderedButton.swift @@ -0,0 +1,36 @@ +// +// BlueBorderedButton.swift +// GradientLoadingBar_Example +// +// Created by Felix Mau on 29.08.18. +// Copyright © 2018 CocoaPods. All rights reserved. +// + +import UIKit + +class BlueBorderedButton: UIButton { + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + + commonInit() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + + commonInit() + } + + // MARK: - Private methods + + private func commonInit() { + backgroundColor = .clear + tintColor = .aquaBlue + + layer.cornerRadius = 4.0 + layer.borderColor = UIColor.aquaBlue.cgColor + layer.borderWidth = 1.0 + } +} diff --git a/Example/GradientLoadingBar/BlueFilledButton.swift b/Example/GradientLoadingBar/BlueFilledButton.swift new file mode 100644 index 0000000..edcab9a --- /dev/null +++ b/Example/GradientLoadingBar/BlueFilledButton.swift @@ -0,0 +1,34 @@ +// +// BlueButton.swift +// GradientLoadingBar_Example +// +// Created by Felix Mau on 29.08.18. +// Copyright © 2018 CocoaPods. All rights reserved. +// + +import UIKit + +class BlueFilledButton: UIButton { + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + + commonInit() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + + commonInit() + } + + // MARK: - Private methods + + private func commonInit() { + tintColor = .white + backgroundColor = .aquaBlue + + layer.cornerRadius = 4.0 + } +} diff --git a/Example/GradientLoadingBar/Images.xcassets/Contents.json b/Example/GradientLoadingBar/Images.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Example/GradientLoadingBar/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/Contents.json b/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/home.imageset/Contents.json b/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/home.imageset/Contents.json new file mode 100644 index 0000000..d675922 --- /dev/null +++ b/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/home.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "home.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/home.imageset/home.pdf b/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/home.imageset/home.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ea0e25ad2c6f120878802cdbd199a09e0177be4c GIT binary patch literal 61994 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 Y;pQ>WI!dm$PLk{||M4H)iTKO^2FtZ!oB#j- literal 0 HcmV?d00001 diff --git a/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/iphone_x.imageset/Contents.json b/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/iphone_x.imageset/Contents.json new file mode 100644 index 0000000..1b7b2d7 --- /dev/null +++ b/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/iphone_x.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "iphone_x.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/iphone_x.imageset/iphone_x.pdf b/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/iphone_x.imageset/iphone_x.pdf new file mode 100644 index 0000000000000000000000000000000000000000..eca2a6a20642b35028c148a1a53c85160f41ae5b GIT binary patch literal 69890 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 LfwRgWSqiLS6}cP^n0%`X zs5f@xbY@wzv*=Soxn+Y~&aeQ&YUTqOvkFC*k zW?nU6C)1?Qpcv>)4hXU7VgX+@jr(MvZE| z%GdfmYsmU7xwJ3BjPyoeK zco_%5VQ9DbW*fI4WneVR&?=@#h$*#DkO_|Y8Rtn=b)JSEr4$1y9;tbM;VeKDA5Wuz z$jzB{YiLa;w$RO^2-3*dY0>T^b2o1x1lc3Qr4E5Vkl3(7=3$${XTWMz6&eDB=u8YQ zg6o5NkDCm+atoG(IvUHRqGg%+I@tcapU4>v33Yr74K<()8eIyEvx1TlvfuQ37}=L? z2pwCN)$t&b5{FR7@@hT_MWr5a*Ev9cI2aCIE&DD$CFr5j9TJv3DV3TCx?onRNS|%# zZMv54S|!uLi>gZZaR9DJzs<;&A#kk(nfCJ1Jm^;=KMWOKONACI2t3!bS~5A~ivU;* zCuUHJv*ip&FjwX>3O6PICNBsTK;_iQBSF77v&8zaJWbM>5hcP*=K?5HX)&MRDsT*4 z631dk$pAQ;&vPO=v&Spv(CrecH`7FWY+6)TRS~!w&1M4=ID}q_=6mv72l<2#V%)$l z{D)u58U7dJo*x3~kqQ@EqXl1?guDVUR!21phT!E33SV%ZOGT=7Gic2$Pzf6pL5}10 zp&T2*R%xAjD(VBHEjxw?%q#$TBE6shW6ljEi>WHTh}L?kXti4%au$fDQ0Omb=<~j~ zPU8X>&bKoSqvFi@jm87^=XTGorB-ugB+ zfQxD@1-fJkNF!hbbzDSKJSxP!VBX449lKffTD_7Y^jMfL&v1G+k<|pedpPic$7b*` znPFAfK`CYqQWFiAR))>Yvc(iI8aT=d3n-ekK=H0Rs*Vt@VzOa^@uiMGgAmlsN&`@9 zY({*?l?n*pq}6JUp_&Y@U{PESL#szGXQ-5gmcq-L0BA+Kft6@l8UP<>$?Sn27Ra7Th8=rTu7CT@=%k_e^yUMyff;8Z-WX7Qm_sI|JaYNZ>2K-gwdQ8MQ&*n@aELqOA%4R;8s zZKntLeL9)dOsqm^148j(uSQO0AsJ>~rO}sqNMKvjj;zh2>N;`k`(=Lu_$3xtga>}| zOM&fX3JrpKPm^Mg5|OO$+0n3~Ax$*q0bA!af*M-`)*m9Q&~0ZkW`GHuaR@NQ45lSc zAJAl`MEH1$a4R$#I7T;O$B{Ls1k^0^HOE$l*wl=;Ar2f%e~LKzaLx=neXnPyiO9`( zmV^lgUm){ZhBgTg=jJ5_vL$rou_dOEs|`F*pvYxhy_z);w*n}wDa-*nL>u_YRE$PW z6!TSk%xegdPT>wo<)ew#Z6ax#ZqU#?Z4-z9i>oCsl%~6|3UIMh34NS)@ zY*ae&jX>~Sq8$!eJj(as!9=AvnXb20Du;pj68tiUCE8hz%;`%VuA{?LY0si)m`uAA z7Z!4C!3`MT;ZVKXaV(h;S+3r|28d$!VlZtw*M?i&7?8O&-T(ot(3e%i*FO zw^Ilm7Amq@Iz7~)JZofb!I8D?F5oUFL7f@%g;O+eaN*K-|#KnrO`iSvBaml{euqY50O`eay!041zq zWv0Ebs0KUrk)b&D3qc1JWu-fl9SLM)%OwLU-r=&ADq(=ov?s{4TL4j4Z&fq0%eDDY z%WC^+=#zADTAsDUGRDr?Fa+4L6vP%rE`Xl{^nBoUfFhRyffp{33uQVa;tJ843Arlj z8HqsmC8_J$x>D^|1hxx+wwHjM-7)Z{VaFO#^3Wu39Vs`46CI&88?gBm&DGKU4~l))`Mi!*AL#t+rRS0LW`Zxx&PDDHW|Uol>VlcSP7B z={`LmM4U9^#*oXh$`IrIpqMQfZ`uV^3jqBD0#_lp3Nl*2FWEBgtPs5g67ghCDQG!| zj&d{}(5{jTO(BQyNi~qP)FRsb$&jT75Yw|0Ua@Mxgr|}VqGYQHfvOeZ1DYz6Y;wih z^urm?YeBmQEO8(q&9O19j{cXSL&3>bW9ZEX&Nj)kpcS# zjg-8RRY}ytC(BJy<$8!$=!z1nd^rf}m72sTyv z9FCc+U5uGNVb7pSk&fnkEr$gwieM(n2LKc$w> zr;PtNZn@ z0u;LnQU>@#bMaD$Aza55a6l)spv|b1FR*+f4u>M&8I~(zwGD+iP-6(P0^s4nJAp12 zFfY4MyQ=}KRQrLl${f(S7ud`oU#iWf)gj=6=z5I^Yh1|>MZOD4d@?!&tiY6nK+&3q z42=dI6MdM4OhWUbj8?Fbl8q`iXv*a;G>9MK-_-8R5B;l0P*aT&2R+L*}g0QvT-HQXSq2D>9mZr!AyKW3yi#W zHXtD#6j2{Zsft1CNk3M{~(f>pw4 z19*rcZf`JHhlqHk6SsLrS!9sSXw|u;^;mF@Shb`CvPJjjWB_7EtM9rC0vk&6Na=dI zuc!eHtGSiOjtoGNGWEKW_F6uup-PnMEc&($zCIqMwFa?5QPVn3>4pXzLW+v*COu(5 zv3?SSBgah>eKuu=nD4J*ibN%<*R=ei!!UDUq;q`NY(?Ta?Ch*>O0Vq%V!K^)mAc=E zd9^1oGnM6;*ta^-A{+Cg3K6SGm~>mK47OEP>d`vI^K~=mwk=HLivUdb!zjZwG9eOGX;L;|4l-F0WP=&t)=WTz$z)#6 zQSGoW&ijxDe4T2zHZ*9>pnkk66b{BnQg&uapej}r8KrSWR~o8 zeojsyu9X#6Id(Ldj{_y}13+rI^+MT56Ansa#5HIM)TSX&R{+kKt$_kfoE6b}rg@+g z&9|(Wv(>cR%mqACY0Ua#v%6}>6NzTj0i8b%W&xC6uZS?`x^;oqVqT9JjuVDM)l#&9 zqJ!pJG~ud9+ixu_bymyKEtaCoC}2ZDNYpFF>ZIT$!|DYw;F}b_iRy_}ic~29-^nXa zy2EaRk*tbn4@K4z`Z>&Ril7)$fg5#D<(C}@N3(v37XzlC6eDJ(!+yXtro1@Ffq(LV zi4b7p2B`kG47UJhQ`p1si3B>3y>cP}0Xdn%M%7Yvj`aK0CSD}QWwV_l>gvq5F?_Yl zfC!iqCA=G%PnD=Z1zb95&?3jKr-y=;mz zF;#QJDq8EWQjuZM%2}?0)`P^&ml<2=%#`Z1z>saQD>T#v$&21*Wh>5LMZrMNQHzRI zsqdL_U{X4$Vv%;+YnoEt?5>Vpe-UCy2pffV2NdllARCXNp^SGx0kY}h3DL%5gevrv z-hk+G9!aEWGsJ>clrJUy#)5?j!J&*gKyi?~3ITxc1`u@-wN-MSwV6Rx7bDq1D}AV0 za6%4vu~u7vwW)=b>1f&mMZR^08N?x%7LxZT+>ru@})is8hj3gDH%F$xw4`-NzvNpb=szQoZJE~Hql*FEcFCrnX3k7sRfxt15WCYi_iCj)=lLlYu zAZ?HqIdwot0w2mwCCo7qv@HiLf%ugkvto&ZG{-8Qig}JZu|;G$tcHPMx(nCBTJfNw z&j9P&`gfK7B~o7fT6&v*)e-QLaW5Sb8YBs+oRMbu02I(#{XQrYNIa@bw#_UBHhge| zqpCbB3IVN*M?Q$A#Cl`W6d$8%CeO$|=%jPz9XaR7G>&_bngjoS2j6ll2{)|KgNCit z0Zy9;wN*OT2?s=L5rDE%n)e~i0GwniAQu!1>{mr)W9kWUFA zVAWDnO&hQmk49x+W1yr2Vto>12}nRItAh0ib^s&TOHo5MCEaRr0tt6X5o?ZJu?ui} zQnv%i5>XtPMQOKFL_mk2AK@huf(90uN#Gk)LoO{?Q`A`1Qz`>cL|_Y(fUivjWPU~X~kc%8mG2C!Ln0_abwFq=vmgZAMR;0XC zg*+f7KOz_1HsEN}xw_CU6y1WY+fLwiAh)~uvk>vyXd4f7Du zHGAE@Y~f68v91M?=s`=f89<=|YGMc`sA&c-vLOcct*pp^rGNz<20a)hydHs6KQBi4 zZcKP1$cqzM1t%T>fw!bg!M~9cfeadaxoIg-nkr~%7J*)miASXZYDGB`u_;C?`8M8w z03|i^IvOcbkKjyX_fT?LguIp<42DYT=tgj{>o5mXo@HfjsQwAS<28=62b z840S2DGkcdy;oqO`|ZaiY{!U~-^QTbzQPlx)Jy+Nh3(Q9agF z6y%|xiEZT^a+cP}>D40Q&Rwsf24n|fGIHFDOutKTI7u$_A*F{D56UVzWJdHwBlGHh zzefh3k)`eB_;8VD_y%S4spSlZ<$k%}0$jcsv`Gdkt&a~>JK3gm{OQv5V$6)+elDymsFGm;v8odGFacH55HZRBkWG(wNo=^_BU9i4A!v^a@#D&Vnl=oBRTD^fR& zjBFUI6{^uoA&F{*sIWkSUZKkjL8lel6$3RBga%@%je^ZG3B(xYI)6!37W2X)i5sq$ zHfLOd2FYrMwS0hirVna=fXz2F1!mz)4P*!I=lL!fGvM118OUy@Lw$sM>TuT3S`gi6 z7@ZNYn6}!T#Jx$QYWV%(bHK;*_Ws87l>3|MR;FKKzAR5ppey*bQ}Ek7nt#2ugFh!_KCujJE)l&{IHn4VNih-C2;UR0OO0 z7!+U>u8fLSpGOx|3mrRi3BU=ts1{g%?10W=9R%Tp4BC?n&=Beb7^wD3Hl?@4S)K-1 zXsUo_t=Wo$HFJOqz(GOLkpQvnHPSTX$!#5SEov0R`Spk1L`Q5Q-JK`57Q zQW2wLVxe6_O7kEf+&Va^D+e3s-PyqESwcm0d>*twg5pmPUQeCitV8B8Z~|ImtQ_H^ zSfit0AXTG9BcJ)rmd}i$Mjs>qlq|Sy(7?WmdRVGLJs5Ns0W9p;p5gSw9?f~E9e`eT zc$kfJK;MCObl(y~x)10WK40@=PO1l@c4iZYj>NiWZ~+-T~xyF7+#f7*0TU??_~IPo_YzwBtCe z*PGSt9+~8|UKF(ZaI+()=&YFz=;~^u=kTtk@ir_NZJXX?uR9VN974IBhSw z$9xP<8nx~o9VJ0Qb3;Cuv!z<(<-OWanoO&D#wyk7s;df^+XRw9^`>H00O?u^v;dFL z8Yil<$PHB;6OiuAYcRA`9lJu8Kr~@igsNj;{5i1CMw^o+3xG>TNU$Q)W=zc)BTg0- zYV43GVM5N77)fzZp$c?1a3QTW1^ugmVK+cyQFY!>0j|I&6`#gf81%L)&0qxgfO0Hn zyxbI~FM1NdsGyM`fWiJ_fYZ+^_z<+bfQ}2SH4W1a=*d;>Zk-vG@DdT`Tlk>iQt7yn zuNt5=8u%;Xr3IRorj!4sB~|<{#w};K9B29jt`nl~%s_-O`gyM1OF6UGiU*eC5aJ*%gTA3g8}#L`!e~v*c`)b_3#IDF z@@D1YY=E+$yc^oU))#QI2RNo7$Y%R6hq)CILu)7~9O;BP)tQDFA~a5`O+~jWtS2s) z3>+4lujL7?2^t!KoEqG6vq01P?UX=WQ3G!uXv%cVAox&e3W-+LkdB+5)fr-8cf&RTH>*9n!c;pVvV{ zs907URTg}`%WkOXIR-7ZjV z#S8e!h~ODRsEff^1_|?Yj!Z=h7*G*ZLd$dwHdX?cX`Y-VAUNSA*v0V#<_a0?0kX6Q zke^U+dwDe_Y$pQkF`$h#@0z1o9CTQ;YSJ`UF=Es2!8X1A{Bnk@4ghQ&5C4CA-`b=o zwr2f(BF=xPn23p)6Gk0wa_i`>3GWvW6%^2S-k1PEML@2i^6TG)q*hf|b#^YlbQbGwMchQeM5fX$LULV(>zk_dT8b@3j=;vU(7M#NXx3(1?8E}< z5EJCcO3E$-irdBk@0xvn+})UZo}B6`vAm(1t=V{%_`SnmK^pq$c-d@OPYMuiz|}G3 z5m3bInF?u?r{s{zMnwW9Q=f57{jlLe7aiPQ=W?N`I=!9Qnm#^BL6Vb=5_LP7-MCO+hUW9ep?t7IkkFMv;-T5^Uyf z`BDI2YFL78WGV!^J`I)q*3x^yX{&}#cii5nvomUcB(0u>z3Eu3VUnDWDsXjS)Kuyn z`;Y?)W-q}4o48TiX&($}Jjf%BqeuCAw-`1WedLfc4Zvo^Zk?1t$HTAc*F%YPE{oS)yf0pq0A696_d2bAt}LgjjQ^SPV;M-Eb8J)R!}Q zlboHLvr@G4W}*7vqV*;~m)r*2f-M>>7s{Rb{GD??qbAz%2YKXTjaDS>BGyuv3!bP)i5=sq11hN*Lg^{U;V|}q0HIG66>I-W% zDmi;3*zH{!kGg^^Ny&LUkm}^I5W<;sYzzrWAMX9!_5{atufFH@3~oM;ZB>=BgEnPQ z8}@hwBTvs!q^|)sEt%3zr~)X-qa~+dbY^ak&6>8e zcw~;`PDo4XRz_i|2xsUxk(YSWZ#qh@bp3qHhg_DPu1lcYZv$>N-Y7aXqYf*L7Q#rW z*jy^yfie?XrB77=^?k!F(Es2{*2Yq zMmCCY2LT|(4zS0D@2+yl!OHNYQ-ibg%jTkGmoNt$0+@UmB(CMq-9=sGr>J+L3@@-c zQ5P}Bjn(jo{UD;_hT%x)&l!V@l22DGpqXQ&)`VxMJ}q7C9#~ln>k>XHmd>Htp*utq zE@$A<#5ZWC3j3y?JjVEW!XnpZJVfT~TCo_m;cVq6;i zODwW6NnYo`l=q7bb{k=tTzB=-V|gmAxK%(Q4F#GRhIHxhQySDVRg~5;H=ElF66o|| zxxcnTKh&+rlP`3;Z!Ke{lTs#-P+OoCRK%+{qZB^iUENb^Xkt%jyB%g17))TfsGM|q z;b!WA^#O+U;R5gt8?aW@_j7q!LnSrnF8K?<=@#I`PQ2RIJ9f_6vo`L3)^CowfL9{E zI%F!hjye%n;aC|2{2oJ0HG-9`s(&Y=8Eu|+(>+zF2MLLqz8?ga?(8DhdCJgk>W*<3 z4)XTNIwEkrl(*j9aex&EhnmN*)<#xyncQk<`e-YVWrwrbRGv$t=4js|_nqyDGTohC zf8_u(XwvAXUbetnT(`tzSfYuC86kpU*#j1)r|kRj(v#LB(Bda#<|AYjD8D5xhdaFw zx#S%RDKrZ7b#)G$(6Z<|7Zh{Z+&d}r;DlbkO$FgDG%13o?GOx9^^~j2O(Ft?v>XON z6sC)r4D_+>lpcr31HA0`g$>u*X#kmmOEi#&O)tkA60k_WZk7Mhf8MP8!#5vldIX@w zp(&i4HW`}0{n{Z$Jk)!l*y3g6xbKA4-rD(GWW26XA*w z8{V6D2G-P_c8WNN#-YbbgYl@lk;tlA4L9DT*Z|F6tTe-aDW(A;NX%kAjid&l;I+psiH-R)CHTJ~>D)(8U}$z#c~m<@DSccry(O%5==c)yW1mw`5zT!X)pfH()jLsL8N0M|a{S}{wQ1m*T*Ik!9Bem6w|QTO!(Sd5sW@h}wy z(wO?p$+K3r+XTh)9QwI@iHETR#pJop;ycR-~uI#M3^y?dznLQ zF6YvqP$0Vv$k>c}*rLSXvYt4aBt&oOUScguVSEy$;0wGL+#wpoTLgm#*6~rhi)3g4 zG|jH%jVZss)g~)MrSrP;xGEb0pKJp!*$_cBZHtBp6vLcGxgMn}$ET;h8Fx;l+v}aK zTH`#tY}paupg^5>3&ebr;bJ>BgP4B-g*I|~wv=-U1 zPN2eXD2)Z`j6$|>S1VESg$8G%sYJDxhb&m5K$Mw>Y3-MLT4&tbyVLowX%T|~4SM>u zay@1M(j_Rx83*i)aJuBtMk+0S+MV^mKby8~YoJZ1YXGH3*%_6L&T&*{^xNLNU+o&8 z)WCD#d1sb0#W@0en5T-^T51}~1wl&>wegCMxKOhX88K|C=u}^$wbw$MjZWJ^x0843 z=g^BrQ^Knr1@}gs=eEbRTV=*OD=K{V461jZH9e{`4gnPK%#BLvaTLzZ=UAngsO)Vg zK#wlaVr|rgAO=gXi1VCP1sXCOq;Vxrr7m~%71i5pj^G70wF_m7&88h(&BVge5d(Z9 zJVNW@dKQ{m$uTRs=c9dldu$BK6a0b|m5}P7xg3P6g|?Bc2B`^#vNifT=*nt?$`*jG zBa0x-vfV`uC*mB3o)4D$(2782{ z79z390BDFNh?g=O0c2${6eyJacng4lsQT2D>CIh4RM*>p{1${ZhBdfk6~&#{KGOXb znt6bXR|s7%1}x*a4IS2neu%Tld0v$}O^q$&b42CSR-lf%AX%KZ%Xv^2g670VoN|cJ z5tS9-p(3hkUQIW00V_mXw13=kbR#!=fGX1h6k+HHz0{GlQ_3@&u<|k{`3ABQlpcsW za_E*~#Dv>9NF7qnSjZ4Ban5hKy=w(=c2$i$0NQ$IAms>4WxkvN+b)83UZ9je-yZcf zaXchTJWw`Uvx5(gG7L$N0rNgZO_0~vK_VxbGD;ST+?S$8oLEE_#{J5^XX4rh2NLzr zMZ+G1mY59u#vxXK89=5{uVtzfSNX9?(@5Sozyq8${RrSe+;8P-gG6tdn_)8eZFp$F z%CU6-e=2p?TY0kCAjfkG>vA}N{16LXo!+(wBf9Igqbto(eGPR@z-|j-s-UZH97Bsd z$sQ`|!^MouS5~muD^R{td)d(m)4}`_IK^_-4;gctp)7i{vWT*9!vTvi-lEP4N-a*M z*l`DTNs7)~yXNf5-gTP0ovW0ipCHmqi!6jlgugJT!ZW)}1#(^yAzi zJRf|b)36l?_Y{Fk6aXbMwo%VvkN_EH>KCb}_q^Sy=ld(P_VfkltpEazh$$*UayknV zBF|0IQJmc0`@v#i=!R>kBf6P(7U-xjaJjWsRj-FAvij876!oB$VfYsOBbCm4u>HM; z*IaPx#7!3$Gdhe`yUTgATFp=*O#mfI^v1}cOcL?$4LWo)%I&v*(2v`I6)5Ry8mQ+J z3dr#-WdJ@(B%&`IWRy5?+j2rkW)>vPcCaM_8z@O~75Zw6-(>otD`c~oc`VTA-cfaB zsjJIdb*!{WD3Y`xDrN3YL(uO*asm*rHEZb>YQEG|N5v~fSO?$Sx_}ELlyi5@^LS42 z;B$k8+FZSKd?scno8w`gb}p8{s%Ld#baW?l$J83w@1+-BB7~SMAXPRS0AaLnp-D3h z!?U$z{aucl)nQ|~Yk*?J?Dmz-O)^H=?1Y-(9#z|ee~H>g1ix#ev&A4pl!+NrmT+N5 zb0Nb2osGrWoE}xiKbVun^*YcD*OI+rptf%V&O1Hlgb4dWjJpE(f`Y2VMygl}yWeGz zqxu1fGD#-%nnsevveKP(K)#R%%(fZOQ+Qn9Tgns?EeKO?1N!KScpQ<4Menpj1NF23J)YYhE%oHayP#vC-dO zZ2c4{B38P(j}1yM~tJNvss?=YTqM}{-!^vPy7Ui$sToJ9Aa ziDVhIhysL3n~>a-1$_E2YE$s2{e!p;n%YU5*O5aqT9w1>;GU91V$gH9hl?5VWR13a=ivC68Q(57O|dPItlPoh-q(M8A=_l$)X2Vj2Lc& z5`U}&NxL9gcwjY#I{RA8nH?|M`+Gn+I0`VP&UOTDPuExAUh>Aq8KalC!P;(_ z4s^@VSBkkrYA`@I1K-i(1$Rmyl_t%~&6FCU9Ir*gpbv8^NO$lyd@xaB%SgcFIJETD zA-vWbY=7x!24)E18~~)+^Z>wD3EHycO=Ct$K@U@{;VQLMxw}sL12gnb;~o-d+9`77 z(u~@3y)7ev5-`T?E5~4pvy?&j2Vh(*A!7!?%vBq!P@kp#<_vKWca5H&gY2SjBwG(@ z$IQk9&6X3=G8e!}(?Vu;P%}5{!gy*;RA;mf`_yowp}QnbWMM`b!PF(>G(RN`uL5`R zuH>}lP#xrUkQ0!+9K7pEwezu@aB0jPH+(F;5JfKDAOh6;oL;`~1*{7;LEAhny-DYa z^NLdNlJ<+^a&u6VPJn?>WJY9&rtWnOLP;S?RyP>{oN}z^Ftyh5rm(JRhuS&B;^0qu zha;6}JZT>C42=sOb$@I-t*$2Q8Y@Sph*DSDky4`6>bnkdqk}2WG~hFd+Z^V6x;R?R zuBsbI0Xn^nm}F*@ceMmDO#p};oy}MTrBI^^NOzfcNa?&qKV`bprnc7v>OCIIo@?pl zwKhsd?nl$6lrQpSQfz?5K-C)0Sb!QY8nqjc8|7i_BBrq`35R4QTjx9;!&9qFa3=ls z(U@A(fu~93#=qU6l^lU{-Vu$BiZzv63${Tu_z=i-ySso?ntHB^4@Jwh7niKZPLkvj z?JFUQ6eSmF25CHOVYA|B5maquIlV%0#VRc>ND$?v?x3ftSL0kPb6uS6WqHU2Gbq;e zdODAdsBH(m|@o15Kx) z7ZVzIIAL>H20{o#J38`dV?Cles1Qe%YMT@4yk01rr>R-l zCCT2}!^3x^{Z^!KV(ZpnXb$TK8(X;w6-Dq$Dd>H~Xr2TR4I>hZkxW@z%m#v)3?@-4 zDe3db-Z_=%)(R}}#$v_>+`5YAcx+h0{%q7=8Q8LHLtWghv7Rv?W}8WCYmTMB(pybH zg-~16E8=CvZ$#_aMC&;hQVWgVy&(jmV|C>zDIPl0<>6e{96E97^agx(n5V+1Z&gmO zSpxM-p}(RODmq>Or5uEUF^+VS7?i{U8{&KW{y~~fg29#q^l(V`mlW%$H!EMzYilt0 z9)PEs$Q;77bbzHgx@!joYL_AhZjYe~d9-3Z%>Sa_B=(Y`qHJxn1qr@-1)E>0G|sGx zX;tSOl%SbKoKpIFiqf%-0zg0SLQqcbxBJVGHI5hY!0Y;U-QRbF{=uGKx3=f0gZLyR zQTw8sFHN7@9sYq%`5%7EZ9u7LS1yRXs)f@QL>bJ2n6quDpUfv77a-{ad?Rj^yUASJ z8{Q>iByFCn+b+85JTWSSMiVVw?6U)^=2k2&F;G~GzNopB>aEySuu_4iCJs<7n5QGk z(g!RP-Q2Dxfd!yUBU9l4b877hxl@ABBXgyLm89tPZo}H^aws9$>WTfH=R=_x$^*bX z*%jPbFH)q4+mzm4jGmE}Xu|~?lu<=IM#|`bqI!B5?EyMYLWzDUnT~X()mN%cR*FCm z<*ZvD<-+=v+S`Pmq4!m&{FDWwxw)oKcFY>`0774F1RR%`I(1DokvdNt7*n^wsNbd@L_3BPO$uqrtLp;%Nca)#YME0hBc=wGwL`xXgSy z=d|vU&822{pU`;?+zF69kVI z0r9136Jdsaw=BSoskjPZ1dW2#8c8gUT2Rbzt}Sn087-#mN;-qE3{49DTG7|pkO?!u z7{{c?3F(Cv1`)IA$K%=1$*Q{GToul-w^S~y9#=&{IPT$WvJLCaVTn46Y|fQ-J_5xS z5-NNUo=i)kfTvS-`|!AK@kgKEteO;RbPm-TcM=^ynH{8XWnhhB;^+>p#{&f-!tD;J zJe`ICB!xKJC-JG>(QMa49a2+`k-Y89J1XR`DnwOUgdGNaE{24Rqdb*MIoWJV^sAXe zmXx`jmbG7|wNyY~*WVscNj4x~YdC4z2qCA3aLdKq{=dlbof6m0ybE#g#p30`M$iaHJp#`j zfDiUU$^y+ZV6}vxC8o!KFycYr+bRdm(=OB5+xtcT9CkZ}v~wqyEN&iYeXYY~=#3W{ z;n2GRmY@!!D%E zVH;*6=46O;fyc{lOfYMpVP3CgzQbkQ(2-hOqv28uL4mhf>zs(N6_AadGSVCcAxlFMqCn#c~FThTLtnN@9l$=pa z=uAP0H0i^qbQK<=nq|)CkgLY#McG-HohR8q=tmRa1 zMuA!HHloxwEKBOU($#2kjmSGVGkQ-puz`n;u23EFB0CItZrbU7gC5^k@VK$s@$l@=RmxkD47Au-vA zmq-9RHP`n#>Uc!;XPO@QPPh`#V7omw{biRmaVH@$_1#V0r(|>89Avz?Y&vRzio?0g zI^z)&`W;({hsIdt$v%qOCXEkoiw>D^PzksmkEp2M2BhsJWJI$q3Grzq(L}13ZFc_d zG>WuyFWFj#3Iz;amb$_mwF5qB90;Xljk{~~@1&=<|$cAp>_8k^_!hEXFC1+rTz@hrFs!o?8tSQOWbxgo22(mw_{GtaR)Jz*6xVB%!0fZCQk zd_c$y(RjSJQzb;;%#Ulo45|iaOeG1=)TB*K4|`faNf%`iDxMpnT~kB_Z~_p^iu+Fb`-x7S5>TqEi)kAM-6w_#|TxpcBm zQw^I>*V1f`ca3$v1`N+14%{Uuv1556Qk$M%nh0B3N&S`2pnUcbz%s98l7G?hzCAYI zYo1qShZ91^r9iki`Iy44V}i+AEMkD@N9j72L*9c}Cd>3zeq)Rx%yMayts312J8^s9 zom*2|0gx9E8C0_KMS2Ry9T64t&6VDGW+#Z)kuhHT4bUBx@~Z9^o8=hHN3>3XSWg9L z2vCRH9mc27@L^brvJgUDWOPZ#=g{k+tFiC*HdqT^ope$Tb~uYcL!tV1hh=$PH#QUVD3@y#&rh@jdG5tz!pJ6&!reKu z?6%y)#^5grx$>7n6tdgFG;FS22Hb2;n&Xg$CBXmp(FJ8U%*2w}MG zZFmdWWGK7>8BKt51=YyaGyx2STsoI6)9W1wqurvC;4)SqWIBS<#BLbmIn{Rpy$Fyv z-R^MGy{7D5C^;S4cmpvvDTDK}DBZ`Sqdu1Rm*K#G*v-`L6gzw{f!rx2rUXRABnW#A z%KWlA>WW&AU|mB0JwCEF5R`UBp`D(%-Qj8k zAyn%G?Q-E!X4VsOI3o4Alv$8ptg=lICr~4}edQw?pj9LE0hiDT4oy)(VN<}gfU(40dmsbd?hr`c zoMG3%nyf9_jbf`qUb^YiXKZ7rt@{^_^>aofbMJh%YbDAuW_f>>4RpP0nl@ zG~%tbuPf~qP`Q?2++A6XPL} zANjtq2A&ICK_KN^69jYbNGWTUIuvU=>;`=sAfayC*$llycd~B{N5hp+fl3-x9fJU< z{=n7+Nn)~x6e$yImou_zemIv4%EG)S8U3*y95jepOZMT6P+c!PPv5JF&M(mfMkA4R zpolP<0oOGbyZdHTrxn8!pPvDS9Vbi6(D&4s??!D1ysXi8h0F$f<#*_Qafp&M6qy0E z4P+O^O+fS~o036=z26`A&nNJDTD4!M=n-J9XJ+W=9%Q$MC<#DXe=V|8F`o_B7t5TE z;{ooqJCpn8_BfJ`p4F`)h6r6+y#PF8M}&|sOdEC0VK#v(*145mtrV2W?jlkYD0?ui zygfrZe9_j`st-svnzkKj5~$R;!Pzw-rk;u3+sFpIeei zPaeX73$Y)Zk8~g$HCnkBEiPo1n^$MtI`qm)n4& zGZ=C+((mgB0L|Fwyfz|r&hPd85s=E@$TkGv5!84X9&|_cL0Mp;{y5b-I5vSkh?CA- zoztsTuV{#Mo+2#)FtfAEI%H6bLM-2@qPH1n3Rj8ugwoYh9mhb#vPYIZVMY3>xP!v%RgE9yR3l;Jf$- zPbv{F#OoF+A_#1k9LnulCHI9;w5oxgZeKZ?V?!UZQ>sCEKw>qb^H^~?@I@(RlX6Kp z6iYj|c4ND|Bs);*6m$wUMjsCqu&R+LWuQz15S@V-O6{a@?9G`wK>VtaL$0Brl;RSf zJ0s;-SBh2WQc$pAfQW}~c6H52$D`UVy;L(~_tJrk#*|~bnPen5Dk^m&HB%a>B zGR_D!#sGej0DxX_dc$~ojd7lVBwr8M5to$Mw>W>DhSLEAw3@Babh5+2NJig9?GTVY zy_mX@=^QGBmfEK{29g)ij$ZO=>eZu8k~b+(kuE=)|to44qXIL4~oVN62-WNl=$r_U;Bu@30-~EQ zh!E)k9ewvjzxwS87D-4Xr|e>2cUXXuy-@i$O{}JBK`*Yk)q306rTGH=y)4~IYGf;< z%8Dwq8HBM469o)7Z@aK$7- zffW;NnS}=Ch<5BB1f$$Q#BU`0#?1k|>7Z~FY|At{fHDm$1Jyw8+X+GbUJy?PXg);0=sE`{E1$0i2)Ck+(N%ZBx9eNp#-o1YDhidw& zBSbYf`TEuSA8^A+EmZir_920Qkf5D5#L|?e9NDY7_Hy%oyUXPxZ;+w zw;wm#W)sVbZhjOT!TLxyEgoQ0hvme__+MQ9+n;gXyT_LkXoZh7y`Y*uG1O1!PrsZ% zTi?m;UB5j@1`+SGmAb7RHi18S0Bk+-*O&hGM{M>ukJoiR5%<}J8sFLiLvPe$7+6OZ_C^^M2ZT zfjhHsh%vFu+%zMqA71;#-t@Tki`Tw$?R_pE6ZN%StK0hS!Q9m!stx=3 zefulRy+PAPXFw+{CnH9a!GH21%lvJo;7IA(5PzDm+9ThY3906vCd7LE{NFn?q3}P| zggwO?QOkM?XonyXiPmH$0+^2fL7|3!21hxffVF(>tk`g;4hXB4C3_qME`y&yPc zc?vnp^d~L1K$M7QX;j5opJpjep8uKn!8<;$=xSeF%yvHwtxWea)G^&@;ihpl!l%9k zI^OLze(N1S8fTGO#|*V6WFFVw9O|n#eLI>mvvzLwiF(|`%M0JWb7Ebp_iA40{=t+5 zhVOdePv=hz`8V?RUlpv@FMS@r@&NU#`)}X4|Jqx;yzzAO@=r7G0`}c~#M?`s2Yq~< zFYfw_q3$-B1s0Agu|mwi=WFjS>Fe~fj!|BG)u+zYI{w}!{b_>fI_B2zzHj9QL3IAz zx3vRnhCKmNn*^KUo&<(s}T$v5LHuCe+Dq~>1VW?o~r`vQH^Z1>CFnAv`z*bkFmaJKu0)h{CXLBg-^Wz|vQ z{Z^k@cFg^vr|j3fXBltJd?c&~yRCi^SQzjA-M&b_e?PbR@5tIdyPjuk$K9>)l+$!E^PPn(?5iS{M?LbX zjq_1Rduzr+dRL|CkAU<2r0I88^wiROUA)QN7wlWJ9y0XFFU&1ysZza14dTt`>8~;# zd5;{QT6*j~N_}g_d+eL|eo?^@aU}>5A~IoeY5$ltoN#g$K5^U zQwxuJIM}ylJpN|9Do=k`HI_$P?WvW=-%b9M@o4&=AE1-em3z z;+fUQ+zs)R{T|u)mscw`M&wh3;qw{Q9oY5bUeA&U-`YDf@|UwXcT)+1-3thwms^r>WOikG@~@ zob~S8^jlkekB}2xqW5IGR|PGv14dJij?!B*9sYA5X}&A#QQ|#%e8%rluWK(* z4-oxZGarmL`2{61ZB_y_Ft&71F4uJ4t7qWdoW)~t8S8E)3Q?VOMP^P4x`V>f$d={>l9 zPi>t4n1t_pvNfOOH)`32-WbmGlh?ol&(#&VCc$WxXR?<@7KMG9Y9?)`)b6nT%lo-rNuC;&WVJBqqj zl;5)P9+A_VUv|`^xA~Ou9?1IVjQ3~MZ=0_QS3WDLJZC)dJs6LEH|ZVDn0?7apILb{bq^b# zG9FF62je}0u{Xc+=*K4Ul<{7tL`uI^Dblaf^Lx(w_HFm5us>zH*Fm^&R@TcZ|GR?C zH(XO};{?5Z{=c)TSR=oypYIC6c&9Ht_59yE`cL_tM;-p}diww2n%8wr7zluSFYEn8 z4Uhfg8RJpptD=Sn)#fc)?AhL(@UO)!-p$&(-{>>O zqqtYCJpLX{y|tBB`MMVk%6H}T9yPybjQ6^h%xBEpTQeRor|;2r)T>z94`rsOc1`LZ zQ(yf55wCx5%v)|zowB5T|HPZ0asKyDIN!-RZQS(bNaICcJ{Y-rI zt`|5!{c$*Xb(4DW?bzq)5A~~RxBuy%@Yz2>`Z;uS>xXA*Jg^Uc?=RoMDg3=detZ3& zAM)*-{NR;8r|Sok^X;GhoUU)@e`3Lvt{PNG|fByGRf5C4!Y0|aA>bJ-~{Dt{IeyINc^Up*FuUA1u7e^KT zTlXiLqJiekH0o{|ot{`Iq|C z$Li+?j%A@7u>H$F)vq-O;^rrp4{680{uy_Cf literal 0 HcmV?d00001 diff --git a/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/rocket.imageset/Contents.json b/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/rocket.imageset/Contents.json new file mode 100644 index 0000000..541d052 --- /dev/null +++ b/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/rocket.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "rocket.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/rocket.imageset/rocket.pdf b/Example/GradientLoadingBar/Images.xcassets/iOS 11 Glyphen/rocket.imageset/rocket.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4bb9759f1ec36460f35b480fb5d17c3507b417f0 GIT binary patch literal 62126 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 Jbf@xP{x=L2hc5sC literal 0 HcmV?d00001 diff --git a/Example/GradientLoadingBar/NavigationBarExampleViewController.swift b/Example/GradientLoadingBar/NavigationBarExampleViewController.swift new file mode 100644 index 0000000..fb1b304 --- /dev/null +++ b/Example/GradientLoadingBar/NavigationBarExampleViewController.swift @@ -0,0 +1,49 @@ +// +// NavigationBarExampleViewController.swift +// GradientLoadingBar_Example +// +// Created by Felix Mau on 29.08.18. +// Copyright © 2018 CocoaPods. All rights reserved. +// + +import UIKit +import GradientLoadingBar + +class NavigationBarExampleViewController: UIViewController { + // MARK: - Outlets + + @IBOutlet var navigationBar: UINavigationBar! + + // MARK: - Private properties + + private var gradientLoadingBar: BottomGradientLoadingBar? + + // MARK: - Public methods + + override func viewDidLoad() { + super.viewDidLoad() + + gradientLoadingBar = BottomGradientLoadingBar(onView: navigationBar) + } + + @IBAction func showButtonTouchUpInside(_: Any) { + gradientLoadingBar?.show() + } + + @IBAction func toggleButtonTouchUpInside(_: Any) { + gradientLoadingBar?.toggle() + } + + @IBAction func hideButtonTouchUpInside(_: Any) { + gradientLoadingBar?.hide() + } +} + +// MARK: - UIBarPositioningDelegate + +// Notice: Delegate is setted-up via storyboard. +extension NavigationBarExampleViewController: UINavigationBarDelegate { + func position(for _: UIBarPositioning) -> UIBarPosition { + return .topAttached + } +} diff --git a/Example/GradientLoadingBar/SafeAreaExampleViewController.swift b/Example/GradientLoadingBar/SafeAreaExampleViewController.swift new file mode 100644 index 0000000..9316d22 --- /dev/null +++ b/Example/GradientLoadingBar/SafeAreaExampleViewController.swift @@ -0,0 +1,39 @@ +// +// SafeAreaExampleViewController.swift +// GradientLoadingBar_Example +// +// Created by Felix Mau on 30.08.18. +// Copyright © 2018 CocoaPods. All rights reserved. +// + +import UIKit +import GradientLoadingBar + +class SafeAreaExampleViewController: UIViewController { + // MARK: - Private properties + + let safeAreaGradientLoadingBar = SafeAreaGradientLoadingBar() + + // MARK: - Public methods + + @IBAction func showButtonTouchUpInside(_: Any) { + safeAreaGradientLoadingBar.show() + } + + @IBAction func toggleButtonTouchUpInside(_: Any) { + safeAreaGradientLoadingBar.toggle() + } + + @IBAction func hideButtonTouchUpInside(_: Any) { + safeAreaGradientLoadingBar.hide() + } +} + +// MARK: - UIBarPositioningDelegate + +// Notice: Delegate is setted-up via storyboard. +extension SafeAreaExampleViewController: UINavigationBarDelegate { + func position(for _: UIBarPositioning) -> UIBarPosition { + return .topAttached + } +} diff --git a/Example/GradientLoadingBar/UIColor+CustomColors.swift b/Example/GradientLoadingBar/UIColor+CustomColors.swift new file mode 100644 index 0000000..e5a421b --- /dev/null +++ b/Example/GradientLoadingBar/UIColor+CustomColors.swift @@ -0,0 +1,13 @@ +// +// UIColor+CustomColors.swift +// GradientLoadingBar_Example +// +// Created by Felix Mau on 29.08.18. +// Copyright © 2018 CocoaPods. All rights reserved. +// + +import UIKit + +extension UIColor { + static let aquaBlue = UIColor(hex: "#4990e2") +} diff --git a/Example/GradientLoadingBar/ViewController.swift b/Example/GradientLoadingBar/ViewController.swift deleted file mode 100644 index def1516..0000000 --- a/Example/GradientLoadingBar/ViewController.swift +++ /dev/null @@ -1,113 +0,0 @@ -// -// ViewController.swift -// GradientLoadingBar -// -// Created by fxm90 on 09/30/2017. -// Copyright (c) 2017 fxm90. All rights reserved. -// - -import GradientLoadingBar -import UIKit - -class ViewController: UIViewController { - @IBOutlet var showButton: UIButton! - @IBOutlet var toggleButton: UIButton! - @IBOutlet var hideButton: UIButton! - - @IBOutlet var customSuperviewButton: UIButton! - @IBOutlet var customContraintsButton: UIButton! - - @IBOutlet var navigationBarButton: UIButton! - - var customSuperviewLoadingBar: GradientLoadingBar? - var customConstraintsLoadingBar: BottomGradientLoadingBar? - var navigationLoadingBar: BottomGradientLoadingBar? - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - - // Style buttons - let basicButtonList = [showButton, toggleButton, hideButton, navigationBarButton] - basicButtonList.forEach { (button: UIButton!) in - button.layer.cornerRadius = 4.0 - button.tintColor = UIColor.white - button.backgroundColor = UIColor.aquaBlue - } - - let customButtonList = [customSuperviewButton, customContraintsButton] - customButtonList.forEach { (button: UIButton!) in - button.layer.borderColor = UIColor.aquaBlue.cgColor - button.layer.borderWidth = 1.0 - button.layer.cornerRadius = 4.0 - - button.tintColor = UIColor.aquaBlue - button.backgroundColor = UIColor.clear - } - - // Add gradient loading bar to button. - customSuperviewLoadingBar = GradientLoadingBar(onView: customSuperviewButton) - customSuperviewButton.clipsToBounds = true - - // Add custom gradient loading bar to button. - customConstraintsLoadingBar = BottomGradientLoadingBar(onView: customContraintsButton) - customContraintsButton.clipsToBounds = true - - // Add custom gradient loading bar to navigation bar - if let navigationBar = navigationController?.navigationBar { - navigationLoadingBar = BottomGradientLoadingBar(onView: navigationBar) - } - } - - // MARK: - User actions - - @IBAction func onShowButtonTouchUpInside(_: Any) { - GradientLoadingBar.shared.show() - } - - @IBAction func onToggleButtonTouchUpInside(_: Any) { - GradientLoadingBar.shared.toggle() - } - - @IBAction func onHideButtonTouchUpInside(_: Any) { - GradientLoadingBar.shared.hide() - } - - @IBAction func onCustomSuperviewButtonTouchUpInside(_: Any) { - guard let customSuperviewLoadingBar = customSuperviewLoadingBar else { return } - - customSuperviewLoadingBar.toggle() - } - - @IBAction func onCustomContraintsButtonTouchUpInside(_: Any) { - guard let customConstraintsLoadingBar = customConstraintsLoadingBar else { return } - - customConstraintsLoadingBar.toggle() - } - - @IBAction func onNavigationBarButtonTouchUpInside(_: Any) { - guard let navigationLoadingBar = navigationLoadingBar else { return } - - navigationLoadingBar.toggle() - } -} - -// MARK: - Custom Gradient Loading Bar - -class BottomGradientLoadingBar: GradientLoadingBar { - override func setupConstraints(superview: UIView) { - NSLayoutConstraint.activate([ - gradientView.leadingAnchor.constraint(equalTo: superview.leadingAnchor), - gradientView.trailingAnchor.constraint(equalTo: superview.trailingAnchor), - - gradientView.bottomAnchor.constraint(equalTo: superview.bottomAnchor), - gradientView.heightAnchor.constraint(equalToConstant: CGFloat(height)) - ]) - } -} - -// MARK: - Helper - -fileprivate extension UIColor { - static let aquaBlue = UIColor(hex: "#4990e2") -} diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 9808bf1..7b2dd4c 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,5 +1,7 @@ PODS: - - GradientLoadingBar (1.1.11) + - GradientLoadingBar (1.1.11): + - Observable + - Observable (1.3.3) - SwiftFormat/CLI (0.35.2) - SwiftLint (0.27.0) @@ -13,7 +15,8 @@ EXTERNAL SOURCES: :path: ../ SPEC CHECKSUMS: - GradientLoadingBar: d06c05c4732c6a1404d47f33342de8fb3062d5e2 + GradientLoadingBar: ab1b7e3fb70aa3843a4c87fc511c681bac91778f + Observable: 360b0132cef970a50bc69611df7fcbda46e91c34 SwiftFormat: d26c78821785f8c1d029323658c93a977cdf31bf SwiftLint: 3207c1faa2240bf8973b191820a116113cd11073 diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index ff903f4..7b2dd4c 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -20,6 +20,6 @@ SPEC CHECKSUMS: SwiftFormat: d26c78821785f8c1d029323658c93a977cdf31bf SwiftLint: 3207c1faa2240bf8973b191820a116113cd11073 -PODFILE CHECKSUM: cb5da5528bd7a41bec85ae0311fc5e9fc0b96e9c +PODFILE CHECKSUM: 55891446b31c0884d45a4c65f1b52d307ff274bc COCOAPODS: 1.3.1 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 3ec2150..18a853a 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,132 +7,136 @@ objects = { /* Begin PBXBuildFile section */ - 0A24F9CFA5D9A8D086D604E3D2F83840 /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D757C4DAB7D299B5B6A9C78D8558897 /* GradientView.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1B508C3732F51FCEB0F4635A802DADCA /* Pods-GradientLoadingBar_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 50C7A707D05A1C993F972D63ED341DF2 /* Pods-GradientLoadingBar_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1BE3FC45282A489B41CADBB91B26597B /* Pods-GradientLoadingBar_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 35F45E13E0437FDF717140CA22C9C52A /* Pods-GradientLoadingBar_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 21099F053678CC07D8C1C5B04346D9A3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5A944939BE5460DEF5F9F4588F9DFF7 /* Foundation.framework */; }; - 263627164E406AFFD95155E173027782 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5A944939BE5460DEF5F9F4588F9DFF7 /* Foundation.framework */; }; - 2DE42A29980B215709D0374B9CDAF864 /* Observable-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AA2687E35F25C441F2E81A536762B2F5 /* Observable-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3D3CCA6D43E5AE89C0845F773BED920F /* GradientLoadingBar-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 00A137836E31F0B85F44FE7ED28C8A1E /* GradientLoadingBar-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 42C9B868EFF007C954640D7937E4D31F /* Pods-GradientLoadingBar_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 91C3A7E062B6B3E795C008251C9BD8BA /* Pods-GradientLoadingBar_Example-dummy.m */; }; - 53B37B1A5CD4E5752EC90305BCA9A1E4 /* Durations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 246B489FC979CB11F78FF76AE8B59FE2 /* Durations.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 58DAC4AC2D0F3E54E5BBB5CE6FE6C93D /* GradientLoadingBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 754B7114D4EEDF2BB932C2E3D924F774 /* GradientLoadingBarViewModel.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6D5912C2DDE4662EB68F4569C645C09B /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 722B62968CEEC329B4F457E386567386 /* Disposable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 77A0F79C95F0C2561B91D4B5F5C2EED4 /* Observable.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C47C72A5BD1CE40555C3CA440845A93E /* Observable.framework */; }; - A2B4EF6ABA56186BAE518466847A0490 /* UIColor+Initializers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63D66746F49F8782E7357FA82EF7779D /* UIColor+Initializers.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A30BEAE852275C391EAEC9E314339EB1 /* GradientLoadingBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A09E03ECBCBDC050671661FC8AE063 /* GradientLoadingBarController.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - ADBF676850928CD01AAD7CD65CDF91A8 /* GradientLoadingBar-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C47EFA242B2BA62A2408CC13176C080D /* GradientLoadingBar-dummy.m */; }; - B197025B05C5C81BF8345D13849A9C81 /* Pods-GradientLoadingBar_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E81AB562A2ACC55D8595C5C93F545EA7 /* Pods-GradientLoadingBar_Tests-dummy.m */; }; - BA95AAF46D83E99F038F9161921D0FF8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5A944939BE5460DEF5F9F4588F9DFF7 /* Foundation.framework */; }; - E61B45CF190D839749DAB21660A95E78 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5A944939BE5460DEF5F9F4588F9DFF7 /* Foundation.framework */; }; - EA0BC8E6D4AFBEA5C2AD8E065FEF64B8 /* Observable-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 08B7FD7F0ECBFCA1FB3F301D61BF4F2A /* Observable-dummy.m */; }; - F7EC2D3AE7D079C6008BB3D8A140C53F /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01C43F7177749CE2D34E637E99D91ADF /* Observable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 14E34F2FC56CDB341B8CD173401FF66F /* GradientLoadingBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 754B7114D4EEDF2BB932C2E3D924F774 /* GradientLoadingBarViewModel.swift */; }; + 19F491169D5D7A76C3D583361A5F765E /* Observable-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CF9C904F0858CDFA3AFA72795D139166 /* Observable-dummy.m */; }; + 3BD55B868DB764CCD2E943DE6522C711 /* Pods-GradientLoadingBar_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B611CFC1F8EE4FAEC01581F75425F48F /* Pods-GradientLoadingBar_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 410C32527DA1C36AD0EB1F734DF30F63 /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D757C4DAB7D299B5B6A9C78D8558897 /* GradientView.swift */; }; + 41FE926E4A2953011E28E0828D9C4D47 /* Pods-GradientLoadingBar_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BD04847FCD93EA8DB873ED60D7DAFE9 /* Pods-GradientLoadingBar_Tests-dummy.m */; }; + 42700F5C19F84B620D310DDA38358680 /* Pods-GradientLoadingBar_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 82F153091821DD341797CA12A8D4CAE1 /* Pods-GradientLoadingBar_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 42A5BF833E99B4308184BAC0683BB844 /* GradientLoadingBar-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C3DD02551A23555DB276E5C889202410 /* GradientLoadingBar-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 51FD697B3B39906373FCA272F04DBB21 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01C43F7177749CE2D34E637E99D91ADF /* Observable.swift */; }; + 55656C05E84FBAA439434628CAE0807C /* Durations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91137801425EC3258DF0A324E7E21479 /* Durations.swift */; }; + 583320F81D5FB0A79AEE966E30726847 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DF6AA5B777CE6872A2AC92643E0F757 /* Foundation.framework */; }; + 58D38BC09745F446AC48F11334057D84 /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 722B62968CEEC329B4F457E386567386 /* Disposable.swift */; }; + 59D5281FED73053EB4FC2B7C18BB549A /* GradientLoadingBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06A09E03ECBCBDC050671661FC8AE063 /* GradientLoadingBarController.swift */; }; + 6E44A75E5276817BB08F4F73C2990FFB /* UIColor+Initializers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF45528DA03D1112CBFCB0C3C2CC5D5 /* UIColor+Initializers.swift */; }; + 85AB74790BFEF71ECBF8E4E0E474EE1D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DF6AA5B777CE6872A2AC92643E0F757 /* Foundation.framework */; }; + 8F4564D8D28F3E6B247AC23E5056A66A /* Observable-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3131299175A2E33CBF0F769C12C56D84 /* Observable-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 97DCD2C821329F760063390D /* UIColor+DefaultGradientColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DCD2C721329F760063390D /* UIColor+DefaultGradientColors.swift */; }; + 97FA5959213184BB00CCD446 /* Observable+ObserveDistinct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97FA5958213184BB00CCD446 /* Observable+ObserveDistinct.swift */; }; + 9FDB4DBD4970F733BC1D1920C105F50D /* Observable.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C47C72A5BD1CE40555C3CA440845A93E /* Observable.framework */; }; + AB3A9CC5A95BFB9B88345250A55CB9B2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DF6AA5B777CE6872A2AC92643E0F757 /* Foundation.framework */; }; + C5CDCD73BBA932C6431C08C26F7A3F27 /* GradientLoadingBar-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FAD0086F8B0C17E13326B0E8980BBD99 /* GradientLoadingBar-dummy.m */; }; + D05F2CAFDA528ECC86E05E2713F3D18A /* Pods-GradientLoadingBar_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EADFB0EFFF6A08CAA2D4588D6C2F0C44 /* Pods-GradientLoadingBar_Example-dummy.m */; }; + F3F8076DA9EAC73A76B9FE9443230FFD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DF6AA5B777CE6872A2AC92643E0F757 /* Foundation.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 11F0ABF401134D6A07D63CBB85302D0B /* PBXContainerItemProxy */ = { + 0C93EAA1ABD99668F20204408933B35E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 6D7DBBC4BB6995891B4D548F93F52286; + remoteGlobalIDString = 1B4557A96F50C37EE5009366B45453B2; remoteInfo = Observable; }; - 9BBDC016F505E44F0E066512798A7A25 /* PBXContainerItemProxy */ = { + 9BCA4EFA4B96155A510D23270C4FCCCA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 2B63880316D7E6A564FC45314A003B39; + remoteGlobalIDString = 29BC83516D9F29C0D714E5CAF9880C36; remoteInfo = GradientLoadingBar; }; - B51DA324BB2D0F54655F1FA7419616A0 /* PBXContainerItemProxy */ = { + A6D751D2F5C50986BC226AD93E23CB05 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 6D7DBBC4BB6995891B4D548F93F52286; + remoteGlobalIDString = 1B4557A96F50C37EE5009366B45453B2; remoteInfo = Observable; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 00A137836E31F0B85F44FE7ED28C8A1E /* GradientLoadingBar-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GradientLoadingBar-umbrella.h"; sourceTree = ""; }; 01C43F7177749CE2D34E637E99D91ADF /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = Observable/Classes/Observable.swift; sourceTree = ""; }; 06A09E03ECBCBDC050671661FC8AE063 /* GradientLoadingBarController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GradientLoadingBarController.swift; path = GradientLoadingBar/Classes/GradientLoadingBarController.swift; sourceTree = ""; }; - 08B7FD7F0ECBFCA1FB3F301D61BF4F2A /* Observable-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Observable-dummy.m"; sourceTree = ""; }; - 0F3D57DC040DA67C87298D736812CC57 /* GradientLoadingBar.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = GradientLoadingBar.modulemap; sourceTree = ""; }; - 14091D853C2B706DF1AE856AE9CFCB78 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 17F4D7C8C9BBFFB7EF138F17A231CC6C /* Pods-GradientLoadingBar_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GradientLoadingBar_Example-resources.sh"; sourceTree = ""; }; - 1878BB23EEDD3A204AC30460410579BB /* GradientLoadingBar-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GradientLoadingBar-prefix.pch"; sourceTree = ""; }; - 1B905A25A2D3A59BB8868C53B35A84E3 /* Pods-GradientLoadingBar_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GradientLoadingBar_Example-frameworks.sh"; sourceTree = ""; }; + 1422984811CD4F12D80E9B354599586E /* Pods-GradientLoadingBar_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GradientLoadingBar_Tests-acknowledgements.markdown"; sourceTree = ""; }; + 1ACAE8D17B2522B64920E9EA81C13EBA /* Pods-GradientLoadingBar_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-GradientLoadingBar_Tests.modulemap"; sourceTree = ""; }; + 1B20B670FBFC9008DFDE45D9D36A94BF /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1D757C4DAB7D299B5B6A9C78D8558897 /* GradientView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GradientView.swift; sourceTree = ""; }; - 22C2A4F9D4B8EA034AC866A1472C25AB /* Pods-GradientLoadingBar_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GradientLoadingBar_Tests-resources.sh"; sourceTree = ""; }; - 246B489FC979CB11F78FF76AE8B59FE2 /* Durations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Durations.swift; sourceTree = ""; }; - 256932D0EFF124768B7828B4DBB26BB6 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 22AA11253C3E2F00F94AAA627F044BD9 /* GradientLoadingBar.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GradientLoadingBar.xcconfig; sourceTree = ""; }; 284E5B1E5B78675A430CFB3C83D79E8F /* Pods_GradientLoadingBar_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GradientLoadingBar_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 29F34B3709A0B91080A953ED30B6C8F6 /* GradientLoadingBar.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GradientLoadingBar.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 32E0246132717AB85B87AD5A70F2E50F /* Pods-GradientLoadingBar_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GradientLoadingBar_Tests-acknowledgements.plist"; sourceTree = ""; }; - 34665263080E033320411F4B5805E2FB /* Observable.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Observable.modulemap; sourceTree = ""; }; - 34E3BE59D6126F5B792C30F96DB73D61 /* Pods-GradientLoadingBar_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GradientLoadingBar_Example-acknowledgements.plist"; sourceTree = ""; }; - 35F45E13E0437FDF717140CA22C9C52A /* Pods-GradientLoadingBar_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GradientLoadingBar_Tests-umbrella.h"; sourceTree = ""; }; - 4C3D18A136BBE022D715E4F77216A1F0 /* Pods-GradientLoadingBar_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_Example.debug.xcconfig"; sourceTree = ""; }; - 4C6F162952B5A3ED1A168FAE5C81155D /* Pods-GradientLoadingBar_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-GradientLoadingBar_Tests.modulemap"; sourceTree = ""; }; - 501B9AB1C1F1E59F4628E81A7970CD37 /* Pods-GradientLoadingBar_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_Example.release.xcconfig"; sourceTree = ""; }; - 50C7A707D05A1C993F972D63ED341DF2 /* Pods-GradientLoadingBar_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GradientLoadingBar_Example-umbrella.h"; sourceTree = ""; }; - 53267FC01B3E758EC7BC06C1D2220B74 /* Pods-GradientLoadingBar_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_Tests.release.xcconfig"; sourceTree = ""; }; - 59139AD54A0546CEF68F95C77C8D6708 /* Pods-GradientLoadingBar_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GradientLoadingBar_Tests-frameworks.sh"; sourceTree = ""; }; - 5F2D68AB1D719F1B064D511C976B1ABE /* Pods-GradientLoadingBar_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GradientLoadingBar_Tests-acknowledgements.markdown"; sourceTree = ""; }; - 62982164F2B5DEF7B82A870F71FBFE74 /* Observable.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Observable.xcconfig; sourceTree = ""; }; - 63D66746F49F8782E7357FA82EF7779D /* UIColor+Initializers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+Initializers.swift"; sourceTree = ""; }; - 6518FD84E10BB5DA39E8C1DB4FB82203 /* Pods-GradientLoadingBar_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-GradientLoadingBar_Example.modulemap"; sourceTree = ""; }; + 2A531589E8C2F7E9E4724BEC2BBFDF40 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2A8296F5F5318573C2FDDBC6C1D3C70E /* Observable.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Observable.modulemap; sourceTree = ""; }; + 2BB9B4AFA01DC30399978F0AFE74FB96 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2F96DBDA2338122C5D2332063A0DDC4B /* Pods-GradientLoadingBar_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_Example.release.xcconfig"; sourceTree = ""; }; + 3131299175A2E33CBF0F769C12C56D84 /* Observable-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Observable-umbrella.h"; sourceTree = ""; }; + 3BF45528DA03D1112CBFCB0C3C2CC5D5 /* UIColor+Initializers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+Initializers.swift"; sourceTree = ""; }; + 6B955E6ED6F1FC3FAAD1C08036A4E384 /* Pods-GradientLoadingBar_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GradientLoadingBar_Example-acknowledgements.markdown"; sourceTree = ""; }; + 6BD04847FCD93EA8DB873ED60D7DAFE9 /* Pods-GradientLoadingBar_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GradientLoadingBar_Tests-dummy.m"; sourceTree = ""; }; 722B62968CEEC329B4F457E386567386 /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = Observable/Classes/Disposable.swift; sourceTree = ""; }; 754B7114D4EEDF2BB932C2E3D924F774 /* GradientLoadingBarViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GradientLoadingBarViewModel.swift; sourceTree = ""; }; - 77280710966B3ABC4F68126D78BA144E /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 91C3A7E062B6B3E795C008251C9BD8BA /* Pods-GradientLoadingBar_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GradientLoadingBar_Example-dummy.m"; sourceTree = ""; }; + 75C5982942533A2C5C4EB95855F66B17 /* GradientLoadingBar.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = GradientLoadingBar.modulemap; sourceTree = ""; }; + 799C8ECAB8385DF70782BAA1ADF9A6F2 /* Observable-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Observable-prefix.pch"; sourceTree = ""; }; + 82F153091821DD341797CA12A8D4CAE1 /* Pods-GradientLoadingBar_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GradientLoadingBar_Tests-umbrella.h"; sourceTree = ""; }; + 833F0F13D70DBDC5C2103FB7B32A4551 /* Pods-GradientLoadingBar_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GradientLoadingBar_Tests-resources.sh"; sourceTree = ""; }; + 8DF6AA5B777CE6872A2AC92643E0F757 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 91137801425EC3258DF0A324E7E21479 /* Durations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Durations.swift; sourceTree = ""; }; 92A830507050E1BD2B0BDFF09D9D3B54 /* Observable.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Observable.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 94987193A3C956E52823A639B1A63FE9 /* Pods_GradientLoadingBar_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GradientLoadingBar_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AA2687E35F25C441F2E81A536762B2F5 /* Observable-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Observable-umbrella.h"; sourceTree = ""; }; - AE41E5BEBBA1125468690FAAE3B7E176 /* Pods-GradientLoadingBar_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GradientLoadingBar_Example-acknowledgements.markdown"; sourceTree = ""; }; - AE81FE3F50CEA8E993C3DC8F5A9989B8 /* Pods-GradientLoadingBar_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_Tests.debug.xcconfig"; sourceTree = ""; }; - B4E51896180DEC5DBCEC4A155254A5B7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BF697EEBEEA924D759152FB1E68358EA /* Observable-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Observable-prefix.pch"; sourceTree = ""; }; + 97DCD2C721329F760063390D /* UIColor+DefaultGradientColors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+DefaultGradientColors.swift"; sourceTree = ""; }; + 97FA5958213184BB00CCD446 /* Observable+ObserveDistinct.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Observable+ObserveDistinct.swift"; sourceTree = ""; }; + 9A04D73ADF1F86BA48555BCA8C37357F /* Pods-GradientLoadingBar_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GradientLoadingBar_Tests-acknowledgements.plist"; sourceTree = ""; }; + 9AC0D5BE1D3E0BD55B9098C545D90E0E /* Observable.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Observable.xcconfig; sourceTree = ""; }; + A7EE3290A69260383C55CBE340D72011 /* Pods-GradientLoadingBar_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_Tests.debug.xcconfig"; sourceTree = ""; }; + AA412B257C4E7111197588A95B11802A /* Pods-GradientLoadingBar_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-GradientLoadingBar_Example.modulemap"; sourceTree = ""; }; + B611CFC1F8EE4FAEC01581F75425F48F /* Pods-GradientLoadingBar_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GradientLoadingBar_Example-umbrella.h"; sourceTree = ""; }; + C3DD02551A23555DB276E5C889202410 /* GradientLoadingBar-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GradientLoadingBar-umbrella.h"; sourceTree = ""; }; C47C72A5BD1CE40555C3CA440845A93E /* Observable.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Observable.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C47EFA242B2BA62A2408CC13176C080D /* GradientLoadingBar-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GradientLoadingBar-dummy.m"; sourceTree = ""; }; - C5A944939BE5460DEF5F9F4588F9DFF7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - CCC1BC5CEB1151E0A04A33B26AE57411 /* GradientLoadingBar.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GradientLoadingBar.xcconfig; sourceTree = ""; }; - E81AB562A2ACC55D8595C5C93F545EA7 /* Pods-GradientLoadingBar_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GradientLoadingBar_Tests-dummy.m"; sourceTree = ""; }; + C9A69D64E3CB45E450A0A9A578B867B1 /* GradientLoadingBar-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GradientLoadingBar-prefix.pch"; sourceTree = ""; }; + CF9C904F0858CDFA3AFA72795D139166 /* Observable-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Observable-dummy.m"; sourceTree = ""; }; + D1B3EBFC292193F84BD5C4C3A34B09A1 /* Pods-GradientLoadingBar_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GradientLoadingBar_Example-resources.sh"; sourceTree = ""; }; + D5977AF0FD89C99333D17D9288C45267 /* Pods-GradientLoadingBar_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GradientLoadingBar_Tests-frameworks.sh"; sourceTree = ""; }; + D9DE45D95CCA0E5D76226B173898C17B /* Pods-GradientLoadingBar_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_Tests.release.xcconfig"; sourceTree = ""; }; + E2E8B226D43266B87011381F86DE1C82 /* Pods-GradientLoadingBar_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GradientLoadingBar_Example-acknowledgements.plist"; sourceTree = ""; }; + E38BA62D05FF76C025CDBDB59DF741BB /* Pods-GradientLoadingBar_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GradientLoadingBar_Example-frameworks.sh"; sourceTree = ""; }; + EADFB0EFFF6A08CAA2D4588D6C2F0C44 /* Pods-GradientLoadingBar_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GradientLoadingBar_Example-dummy.m"; sourceTree = ""; }; + EDF962C570BB30FE0D9F48B3D7F9A90A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F0F91F53502405804E4AFA6E2F5FF2A8 /* Pods-GradientLoadingBar_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_Example.debug.xcconfig"; sourceTree = ""; }; + FAD0086F8B0C17E13326B0E8980BBD99 /* GradientLoadingBar-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GradientLoadingBar-dummy.m"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 59F37F7D8B605E50951D3B44E3346680 /* Frameworks */ = { + 5D645B329A93EDD2A3CA49E6D094D9D7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E61B45CF190D839749DAB21660A95E78 /* Foundation.framework in Frameworks */, + 85AB74790BFEF71ECBF8E4E0E474EE1D /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - B217AC9E2BED077FE57913D6F7FA922D /* Frameworks */ = { + B55473D3F1732C74E6FF23E04945B768 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 263627164E406AFFD95155E173027782 /* Foundation.framework in Frameworks */, - 77A0F79C95F0C2561B91D4B5F5C2EED4 /* Observable.framework in Frameworks */, + AB3A9CC5A95BFB9B88345250A55CB9B2 /* Foundation.framework in Frameworks */, + 9FDB4DBD4970F733BC1D1920C105F50D /* Observable.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - B8F019218DBFA9F8332F0920CA8CC9B7 /* Frameworks */ = { + BD7DAE274BD59408E3C217FD879EA1B1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 21099F053678CC07D8C1C5B04346D9A3 /* Foundation.framework in Frameworks */, + F3F8076DA9EAC73A76B9FE9443230FFD /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - F647AA8CBE0A1F1C353CFA2CB5B2AB2E /* Frameworks */ = { + D2A4EF1259F904762E08BC447A5DE5B6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BA95AAF46D83E99F038F9161921D0FF8 /* Foundation.framework in Frameworks */, + 583320F81D5FB0A79AEE966E30726847 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -144,7 +148,7 @@ children = ( 722B62968CEEC329B4F457E386567386 /* Disposable.swift */, 01C43F7177749CE2D34E637E99D91ADF /* Observable.swift */, - D14DA957BF229DC52113DDB438027DC5 /* Support Files */, + B9A3C301A18A8AC0473E69E97CAB7736 /* Support Files */, ); path = Observable; sourceTree = ""; @@ -165,14 +169,18 @@ path = SwiftLint; sourceTree = ""; }; - 1B4DA3251E5BE2DF50EBFA48751BC9B9 /* Helpers */ = { + 1BA5227236DF21EEF1E76FB43C7CA971 /* Support Files */ = { isa = PBXGroup; children = ( - 5E53040C37E18BA3B646FACB44A8F5F1 /* Extensions */, - DC7FD9A01C467AB3B493793994163D68 /* Structs */, + 75C5982942533A2C5C4EB95855F66B17 /* GradientLoadingBar.modulemap */, + 22AA11253C3E2F00F94AAA627F044BD9 /* GradientLoadingBar.xcconfig */, + FAD0086F8B0C17E13326B0E8980BBD99 /* GradientLoadingBar-dummy.m */, + C9A69D64E3CB45E450A0A9A578B867B1 /* GradientLoadingBar-prefix.pch */, + C3DD02551A23555DB276E5C889202410 /* GradientLoadingBar-umbrella.h */, + 2A531589E8C2F7E9E4724BEC2BBFDF40 /* Info.plist */, ); - name = Helpers; - path = GradientLoadingBar/Classes/Helpers; + name = "Support Files"; + path = "Example/Pods/Target Support Files/GradientLoadingBar"; sourceTree = ""; }; 20E70D97A2915DA6914F9C107FDBBE1E /* Products */ = { @@ -186,50 +194,29 @@ name = Products; sourceTree = ""; }; - 46CFB12F74039FE17BF676EE34443260 /* iOS */ = { + 2F5986BA41C59FC4798632C728EEE280 /* Pods-GradientLoadingBar_Tests */ = { isa = PBXGroup; children = ( - C5A944939BE5460DEF5F9F4588F9DFF7 /* Foundation.framework */, + 2BB9B4AFA01DC30399978F0AFE74FB96 /* Info.plist */, + 1ACAE8D17B2522B64920E9EA81C13EBA /* Pods-GradientLoadingBar_Tests.modulemap */, + 1422984811CD4F12D80E9B354599586E /* Pods-GradientLoadingBar_Tests-acknowledgements.markdown */, + 9A04D73ADF1F86BA48555BCA8C37357F /* Pods-GradientLoadingBar_Tests-acknowledgements.plist */, + 6BD04847FCD93EA8DB873ED60D7DAFE9 /* Pods-GradientLoadingBar_Tests-dummy.m */, + D5977AF0FD89C99333D17D9288C45267 /* Pods-GradientLoadingBar_Tests-frameworks.sh */, + 833F0F13D70DBDC5C2103FB7B32A4551 /* Pods-GradientLoadingBar_Tests-resources.sh */, + 82F153091821DD341797CA12A8D4CAE1 /* Pods-GradientLoadingBar_Tests-umbrella.h */, + A7EE3290A69260383C55CBE340D72011 /* Pods-GradientLoadingBar_Tests.debug.xcconfig */, + D9DE45D95CCA0E5D76226B173898C17B /* Pods-GradientLoadingBar_Tests.release.xcconfig */, ); - name = iOS; + name = "Pods-GradientLoadingBar_Tests"; + path = "Target Support Files/Pods-GradientLoadingBar_Tests"; sourceTree = ""; }; - 4AC9178D9814BACA9FE9E7A77F04973D /* Support Files */ = { + 5B86B3E4B046CE8CEE7CB92D250BF78D /* Extensions */ = { isa = PBXGroup; children = ( - 0F3D57DC040DA67C87298D736812CC57 /* GradientLoadingBar.modulemap */, - CCC1BC5CEB1151E0A04A33B26AE57411 /* GradientLoadingBar.xcconfig */, - C47EFA242B2BA62A2408CC13176C080D /* GradientLoadingBar-dummy.m */, - 1878BB23EEDD3A204AC30460410579BB /* GradientLoadingBar-prefix.pch */, - 00A137836E31F0B85F44FE7ED28C8A1E /* GradientLoadingBar-umbrella.h */, - 77280710966B3ABC4F68126D78BA144E /* Info.plist */, - ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/GradientLoadingBar"; - sourceTree = ""; - }; - 5B9E84DCD3E3A5647594EEBFF0F5B00A /* Pods-GradientLoadingBar_Example */ = { - isa = PBXGroup; - children = ( - 14091D853C2B706DF1AE856AE9CFCB78 /* Info.plist */, - 6518FD84E10BB5DA39E8C1DB4FB82203 /* Pods-GradientLoadingBar_Example.modulemap */, - AE41E5BEBBA1125468690FAAE3B7E176 /* Pods-GradientLoadingBar_Example-acknowledgements.markdown */, - 34E3BE59D6126F5B792C30F96DB73D61 /* Pods-GradientLoadingBar_Example-acknowledgements.plist */, - 91C3A7E062B6B3E795C008251C9BD8BA /* Pods-GradientLoadingBar_Example-dummy.m */, - 1B905A25A2D3A59BB8868C53B35A84E3 /* Pods-GradientLoadingBar_Example-frameworks.sh */, - 17F4D7C8C9BBFFB7EF138F17A231CC6C /* Pods-GradientLoadingBar_Example-resources.sh */, - 50C7A707D05A1C993F972D63ED341DF2 /* Pods-GradientLoadingBar_Example-umbrella.h */, - 4C3D18A136BBE022D715E4F77216A1F0 /* Pods-GradientLoadingBar_Example.debug.xcconfig */, - 501B9AB1C1F1E59F4628E81A7970CD37 /* Pods-GradientLoadingBar_Example.release.xcconfig */, - ); - name = "Pods-GradientLoadingBar_Example"; - path = "Target Support Files/Pods-GradientLoadingBar_Example"; - sourceTree = ""; - }; - 5E53040C37E18BA3B646FACB44A8F5F1 /* Extensions */ = { - isa = PBXGroup; - children = ( - 63D66746F49F8782E7357FA82EF7779D /* UIColor+Initializers.swift */, + 97DCD2C621329F5D0063390D /* UIColor */, + 97FA5958213184BB00CCD446 /* Observable+ObserveDistinct.swift */, ); path = Extensions; sourceTree = ""; @@ -268,8 +255,8 @@ 89EC43461F8350C8C85CBAA922CE7FC3 /* Targets Support Files */ = { isa = PBXGroup; children = ( - 5B9E84DCD3E3A5647594EEBFF0F5B00A /* Pods-GradientLoadingBar_Example */, - C618633350DBB1327D211DE794417A1F /* Pods-GradientLoadingBar_Tests */, + D78297D5D15B07F65F5BE3EFB324B611 /* Pods-GradientLoadingBar_Example */, + 2F5986BA41C59FC4798632C728EEE280 /* Pods-GradientLoadingBar_Tests */, ); name = "Targets Support Files"; sourceTree = ""; @@ -282,33 +269,40 @@ name = "Development Pods"; sourceTree = ""; }; - C618633350DBB1327D211DE794417A1F /* Pods-GradientLoadingBar_Tests */ = { + 91E52B6A4D0399DEC177B4245278E3EB /* iOS */ = { isa = PBXGroup; children = ( - B4E51896180DEC5DBCEC4A155254A5B7 /* Info.plist */, - 4C6F162952B5A3ED1A168FAE5C81155D /* Pods-GradientLoadingBar_Tests.modulemap */, - 5F2D68AB1D719F1B064D511C976B1ABE /* Pods-GradientLoadingBar_Tests-acknowledgements.markdown */, - 32E0246132717AB85B87AD5A70F2E50F /* Pods-GradientLoadingBar_Tests-acknowledgements.plist */, - E81AB562A2ACC55D8595C5C93F545EA7 /* Pods-GradientLoadingBar_Tests-dummy.m */, - 59139AD54A0546CEF68F95C77C8D6708 /* Pods-GradientLoadingBar_Tests-frameworks.sh */, - 22C2A4F9D4B8EA034AC866A1472C25AB /* Pods-GradientLoadingBar_Tests-resources.sh */, - 35F45E13E0437FDF717140CA22C9C52A /* Pods-GradientLoadingBar_Tests-umbrella.h */, - AE81FE3F50CEA8E993C3DC8F5A9989B8 /* Pods-GradientLoadingBar_Tests.debug.xcconfig */, - 53267FC01B3E758EC7BC06C1D2220B74 /* Pods-GradientLoadingBar_Tests.release.xcconfig */, + 8DF6AA5B777CE6872A2AC92643E0F757 /* Foundation.framework */, ); - name = "Pods-GradientLoadingBar_Tests"; - path = "Target Support Files/Pods-GradientLoadingBar_Tests"; + name = iOS; sourceTree = ""; }; - D14DA957BF229DC52113DDB438027DC5 /* Support Files */ = { + 97DCD2C621329F5D0063390D /* UIColor */ = { isa = PBXGroup; children = ( - 256932D0EFF124768B7828B4DBB26BB6 /* Info.plist */, - 34665263080E033320411F4B5805E2FB /* Observable.modulemap */, - 62982164F2B5DEF7B82A870F71FBFE74 /* Observable.xcconfig */, - 08B7FD7F0ECBFCA1FB3F301D61BF4F2A /* Observable-dummy.m */, - BF697EEBEEA924D759152FB1E68358EA /* Observable-prefix.pch */, - AA2687E35F25C441F2E81A536762B2F5 /* Observable-umbrella.h */, + 3BF45528DA03D1112CBFCB0C3C2CC5D5 /* UIColor+Initializers.swift */, + 97DCD2C721329F760063390D /* UIColor+DefaultGradientColors.swift */, + ); + path = UIColor; + sourceTree = ""; + }; + B17F5509E43F875711A13CD2968D398C /* Structs */ = { + isa = PBXGroup; + children = ( + 91137801425EC3258DF0A324E7E21479 /* Durations.swift */, + ); + path = Structs; + sourceTree = ""; + }; + B9A3C301A18A8AC0473E69E97CAB7736 /* Support Files */ = { + isa = PBXGroup; + children = ( + EDF962C570BB30FE0D9F48B3D7F9A90A /* Info.plist */, + 2A8296F5F5318573C2FDDBC6C1D3C70E /* Observable.modulemap */, + 9AC0D5BE1D3E0BD55B9098C545D90E0E /* Observable.xcconfig */, + CF9C904F0858CDFA3AFA72795D139166 /* Observable-dummy.m */, + 799C8ECAB8385DF70782BAA1ADF9A6F2 /* Observable-prefix.pch */, + 3131299175A2E33CBF0F769C12C56D84 /* Observable-umbrella.h */, ); name = "Support Files"; path = "../Target Support Files/Observable"; @@ -318,17 +312,27 @@ isa = PBXGroup; children = ( C47C72A5BD1CE40555C3CA440845A93E /* Observable.framework */, - 46CFB12F74039FE17BF676EE34443260 /* iOS */, + 91E52B6A4D0399DEC177B4245278E3EB /* iOS */, ); name = Frameworks; sourceTree = ""; }; - DC7FD9A01C467AB3B493793994163D68 /* Structs */ = { + D78297D5D15B07F65F5BE3EFB324B611 /* Pods-GradientLoadingBar_Example */ = { isa = PBXGroup; children = ( - 246B489FC979CB11F78FF76AE8B59FE2 /* Durations.swift */, + 1B20B670FBFC9008DFDE45D9D36A94BF /* Info.plist */, + AA412B257C4E7111197588A95B11802A /* Pods-GradientLoadingBar_Example.modulemap */, + 6B955E6ED6F1FC3FAAD1C08036A4E384 /* Pods-GradientLoadingBar_Example-acknowledgements.markdown */, + E2E8B226D43266B87011381F86DE1C82 /* Pods-GradientLoadingBar_Example-acknowledgements.plist */, + EADFB0EFFF6A08CAA2D4588D6C2F0C44 /* Pods-GradientLoadingBar_Example-dummy.m */, + E38BA62D05FF76C025CDBDB59DF741BB /* Pods-GradientLoadingBar_Example-frameworks.sh */, + D1B3EBFC292193F84BD5C4C3A34B09A1 /* Pods-GradientLoadingBar_Example-resources.sh */, + B611CFC1F8EE4FAEC01581F75425F48F /* Pods-GradientLoadingBar_Example-umbrella.h */, + F0F91F53502405804E4AFA6E2F5FF2A8 /* Pods-GradientLoadingBar_Example.debug.xcconfig */, + 2F96DBDA2338122C5D2332063A0DDC4B /* Pods-GradientLoadingBar_Example.release.xcconfig */, ); - path = Structs; + name = "Pods-GradientLoadingBar_Example"; + path = "Target Support Files/Pods-GradientLoadingBar_Example"; sourceTree = ""; }; E00683E90061990C87DF25B5810284BB /* SwiftFormat */ = { @@ -342,8 +346,9 @@ isa = PBXGroup; children = ( 06A09E03ECBCBDC050671661FC8AE063 /* GradientLoadingBarController.swift */, - 1B4DA3251E5BE2DF50EBFA48751BC9B9 /* Helpers */, - 4AC9178D9814BACA9FE9E7A77F04973D /* Support Files */, + 5B86B3E4B046CE8CEE7CB92D250BF78D /* Extensions */, + B17F5509E43F875711A13CD2968D398C /* Structs */, + 1BA5227236DF21EEF1E76FB43C7CA971 /* Support Files */, 8403B26617BC5720B6F7AFBB72852C26 /* ViewModel */, 03FE9A8BF388CAA1FCEA89FEFEDC42CA /* Views */, ); @@ -354,83 +359,49 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 2A3519C597CAFBF6C661E70C07E4F9C6 /* Headers */ = { + 020552841CAD9616C6F108C7DDA653E4 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 3D3CCA6D43E5AE89C0845F773BED920F /* GradientLoadingBar-umbrella.h in Headers */, + 42A5BF833E99B4308184BAC0683BB844 /* GradientLoadingBar-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5E91C05C0FA2EC76430171501C458770 /* Headers */ = { + 6AD2175A80A812DA862C4B02BE1A91EC /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 1BE3FC45282A489B41CADBB91B26597B /* Pods-GradientLoadingBar_Tests-umbrella.h in Headers */, + 3BD55B868DB764CCD2E943DE6522C711 /* Pods-GradientLoadingBar_Example-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - E45FB182CB503AA3F930BC401966B247 /* Headers */ = { + 9B17BD85DCD21BEDF5D38E04125EAD06 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 1B508C3732F51FCEB0F4635A802DADCA /* Pods-GradientLoadingBar_Example-umbrella.h in Headers */, + 8F4564D8D28F3E6B247AC23E5056A66A /* Observable-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - FB3204964DA0E9693C894666218B8BAA /* Headers */ = { + BAAB2DD73D11B10930D83170C07910E3 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 2DE42A29980B215709D0374B9CDAF864 /* Observable-umbrella.h in Headers */, + 42700F5C19F84B620D310DDA38358680 /* Pods-GradientLoadingBar_Tests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 0DDE9A7CA243FF8773CE97E05871E530 /* Pods-GradientLoadingBar_Tests */ = { + 1B4557A96F50C37EE5009366B45453B2 /* Observable */ = { isa = PBXNativeTarget; - buildConfigurationList = 769F26B1F11CC0AB6BE2AE773FF66E01 /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_Tests" */; + buildConfigurationList = 994EE5A58AF8B36DD55E52C1787AD1DD /* Build configuration list for PBXNativeTarget "Observable" */; buildPhases = ( - 7C7895461F82DE790DC7F478F1204306 /* Sources */, - B8F019218DBFA9F8332F0920CA8CC9B7 /* Frameworks */, - 5E91C05C0FA2EC76430171501C458770 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Pods-GradientLoadingBar_Tests"; - productName = "Pods-GradientLoadingBar_Tests"; - productReference = 94987193A3C956E52823A639B1A63FE9 /* Pods_GradientLoadingBar_Tests.framework */; - productType = "com.apple.product-type.framework"; - }; - 2B63880316D7E6A564FC45314A003B39 /* GradientLoadingBar */ = { - isa = PBXNativeTarget; - buildConfigurationList = 37515D7500C740E1F892D462242EE790 /* Build configuration list for PBXNativeTarget "GradientLoadingBar" */; - buildPhases = ( - C47DF8F5CAE3C2D6102D0EDA7329B0A5 /* Sources */, - B217AC9E2BED077FE57913D6F7FA922D /* Frameworks */, - 2A3519C597CAFBF6C661E70C07E4F9C6 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - B92FAD085B6E660E09702054FD94753F /* PBXTargetDependency */, - ); - name = GradientLoadingBar; - productName = GradientLoadingBar; - productReference = 29F34B3709A0B91080A953ED30B6C8F6 /* GradientLoadingBar.framework */; - productType = "com.apple.product-type.framework"; - }; - 6D7DBBC4BB6995891B4D548F93F52286 /* Observable */ = { - isa = PBXNativeTarget; - buildConfigurationList = 00E38063FE1C1ED092C80D09810F4D14 /* Build configuration list for PBXNativeTarget "Observable" */; - buildPhases = ( - FC8393BA9581130F79E1DAD4E4E99763 /* Sources */, - 59F37F7D8B605E50951D3B44E3346680 /* Frameworks */, - FB3204964DA0E9693C894666218B8BAA /* Headers */, + 9B17BD85DCD21BEDF5D38E04125EAD06 /* Headers */, + 8EA26E87E8F728A5B4A7514EE20CCC08 /* Sources */, + 5D645B329A93EDD2A3CA49E6D094D9D7 /* Frameworks */, + C28982422E43BC29FB9E6DD9D172B4C2 /* Resources */, ); buildRules = ( ); @@ -441,19 +412,57 @@ productReference = 92A830507050E1BD2B0BDFF09D9D3B54 /* Observable.framework */; productType = "com.apple.product-type.framework"; }; - C9E360AE7E621FF686F7C060178481D1 /* Pods-GradientLoadingBar_Example */ = { + 29BC83516D9F29C0D714E5CAF9880C36 /* GradientLoadingBar */ = { isa = PBXNativeTarget; - buildConfigurationList = CE51B32DA3B3093FF3BA59642B6C54A8 /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_Example" */; + buildConfigurationList = D104056D84CD79BDB5002659695AC7FB /* Build configuration list for PBXNativeTarget "GradientLoadingBar" */; buildPhases = ( - 652F4121229E4DEADA081DDBD3ED8583 /* Sources */, - F647AA8CBE0A1F1C353CFA2CB5B2AB2E /* Frameworks */, - E45FB182CB503AA3F930BC401966B247 /* Headers */, + 020552841CAD9616C6F108C7DDA653E4 /* Headers */, + B7D13CDC491AB0F30F4D7AE35A5510D8 /* Sources */, + B55473D3F1732C74E6FF23E04945B768 /* Frameworks */, + 4EF358D9C0876239BAD9BCE3B8EA0BB7 /* Resources */, ); buildRules = ( ); dependencies = ( - F0D652528A64CFF6B7D836DAAA8C7AEE /* PBXTargetDependency */, - 8F53C1FF4329F6085BB69BF395E65785 /* PBXTargetDependency */, + 145ABAB33E35774F0F3129FF078F2988 /* PBXTargetDependency */, + ); + name = GradientLoadingBar; + productName = GradientLoadingBar; + productReference = 29F34B3709A0B91080A953ED30B6C8F6 /* GradientLoadingBar.framework */; + productType = "com.apple.product-type.framework"; + }; + 9D42E4BDBAC963058ACB7E9BFBABAA71 /* Pods-GradientLoadingBar_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = FC7BD56761426B5F94E35E60E95CBA50 /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_Tests" */; + buildPhases = ( + BAAB2DD73D11B10930D83170C07910E3 /* Headers */, + 073D260DB926462CE6874413F6BD144C /* Sources */, + D2A4EF1259F904762E08BC447A5DE5B6 /* Frameworks */, + 2ECBDF9FF13C8D2A193090D7316226EE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-GradientLoadingBar_Tests"; + productName = "Pods-GradientLoadingBar_Tests"; + productReference = 94987193A3C956E52823A639B1A63FE9 /* Pods_GradientLoadingBar_Tests.framework */; + productType = "com.apple.product-type.framework"; + }; + F4D39355B29826360A572EE3C73331E9 /* Pods-GradientLoadingBar_Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = B3073FF85CC042B5C8BF8C85D5503C1E /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_Example" */; + buildPhases = ( + 6AD2175A80A812DA862C4B02BE1A91EC /* Headers */, + C7919E2E88E9D84627A984B23209EBBF /* Sources */, + BD7DAE274BD59408E3C217FD879EA1B1 /* Frameworks */, + BD78764497D6D39615357FE9AF4D3A11 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 8FEFE449390B7AA7B0E1F2F975B8D8AF /* PBXTargetDependency */, + B34F64432C2628511F768F271DC8BEBB /* PBXTargetDependency */, ); name = "Pods-GradientLoadingBar_Example"; productName = "Pods-GradientLoadingBar_Example"; @@ -466,7 +475,7 @@ D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0830; + LastSwiftUpdateCheck = 0930; LastUpgradeCheck = 1000; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; @@ -481,81 +490,114 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 2B63880316D7E6A564FC45314A003B39 /* GradientLoadingBar */, - 6D7DBBC4BB6995891B4D548F93F52286 /* Observable */, - C9E360AE7E621FF686F7C060178481D1 /* Pods-GradientLoadingBar_Example */, - 0DDE9A7CA243FF8773CE97E05871E530 /* Pods-GradientLoadingBar_Tests */, + 29BC83516D9F29C0D714E5CAF9880C36 /* GradientLoadingBar */, + 1B4557A96F50C37EE5009366B45453B2 /* Observable */, + F4D39355B29826360A572EE3C73331E9 /* Pods-GradientLoadingBar_Example */, + 9D42E4BDBAC963058ACB7E9BFBABAA71 /* Pods-GradientLoadingBar_Tests */, ); }; /* End PBXProject section */ +/* Begin PBXResourcesBuildPhase section */ + 2ECBDF9FF13C8D2A193090D7316226EE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4EF358D9C0876239BAD9BCE3B8EA0BB7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BD78764497D6D39615357FE9AF4D3A11 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C28982422E43BC29FB9E6DD9D172B4C2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ - 652F4121229E4DEADA081DDBD3ED8583 /* Sources */ = { + 073D260DB926462CE6874413F6BD144C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 42C9B868EFF007C954640D7937E4D31F /* Pods-GradientLoadingBar_Example-dummy.m in Sources */, + 41FE926E4A2953011E28E0828D9C4D47 /* Pods-GradientLoadingBar_Tests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7C7895461F82DE790DC7F478F1204306 /* Sources */ = { + 8EA26E87E8F728A5B4A7514EE20CCC08 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - B197025B05C5C81BF8345D13849A9C81 /* Pods-GradientLoadingBar_Tests-dummy.m in Sources */, + 58D38BC09745F446AC48F11334057D84 /* Disposable.swift in Sources */, + 19F491169D5D7A76C3D583361A5F765E /* Observable-dummy.m in Sources */, + 51FD697B3B39906373FCA272F04DBB21 /* Observable.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - C47DF8F5CAE3C2D6102D0EDA7329B0A5 /* Sources */ = { + B7D13CDC491AB0F30F4D7AE35A5510D8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 53B37B1A5CD4E5752EC90305BCA9A1E4 /* Durations.swift in Sources */, - ADBF676850928CD01AAD7CD65CDF91A8 /* GradientLoadingBar-dummy.m in Sources */, - A30BEAE852275C391EAEC9E314339EB1 /* GradientLoadingBarController.swift in Sources */, - 58DAC4AC2D0F3E54E5BBB5CE6FE6C93D /* GradientLoadingBarViewModel.swift in Sources */, - 0A24F9CFA5D9A8D086D604E3D2F83840 /* GradientView.swift in Sources */, - A2B4EF6ABA56186BAE518466847A0490 /* UIColor+Initializers.swift in Sources */, + 55656C05E84FBAA439434628CAE0807C /* Durations.swift in Sources */, + C5CDCD73BBA932C6431C08C26F7A3F27 /* GradientLoadingBar-dummy.m in Sources */, + 59D5281FED73053EB4FC2B7C18BB549A /* GradientLoadingBarController.swift in Sources */, + 97DCD2C821329F760063390D /* UIColor+DefaultGradientColors.swift in Sources */, + 14E34F2FC56CDB341B8CD173401FF66F /* GradientLoadingBarViewModel.swift in Sources */, + 97FA5959213184BB00CCD446 /* Observable+ObserveDistinct.swift in Sources */, + 410C32527DA1C36AD0EB1F734DF30F63 /* GradientView.swift in Sources */, + 6E44A75E5276817BB08F4F73C2990FFB /* UIColor+Initializers.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - FC8393BA9581130F79E1DAD4E4E99763 /* Sources */ = { + C7919E2E88E9D84627A984B23209EBBF /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6D5912C2DDE4662EB68F4569C645C09B /* Disposable.swift in Sources */, - EA0BC8E6D4AFBEA5C2AD8E065FEF64B8 /* Observable-dummy.m in Sources */, - F7EC2D3AE7D079C6008BB3D8A140C53F /* Observable.swift in Sources */, + D05F2CAFDA528ECC86E05E2713F3D18A /* Pods-GradientLoadingBar_Example-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 8F53C1FF4329F6085BB69BF395E65785 /* PBXTargetDependency */ = { + 145ABAB33E35774F0F3129FF078F2988 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Observable; - target = 6D7DBBC4BB6995891B4D548F93F52286 /* Observable */; - targetProxy = 11F0ABF401134D6A07D63CBB85302D0B /* PBXContainerItemProxy */; + target = 1B4557A96F50C37EE5009366B45453B2 /* Observable */; + targetProxy = 0C93EAA1ABD99668F20204408933B35E /* PBXContainerItemProxy */; }; - B92FAD085B6E660E09702054FD94753F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Observable; - target = 6D7DBBC4BB6995891B4D548F93F52286 /* Observable */; - targetProxy = B51DA324BB2D0F54655F1FA7419616A0 /* PBXContainerItemProxy */; - }; - F0D652528A64CFF6B7D836DAAA8C7AEE /* PBXTargetDependency */ = { + 8FEFE449390B7AA7B0E1F2F975B8D8AF /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GradientLoadingBar; - target = 2B63880316D7E6A564FC45314A003B39 /* GradientLoadingBar */; - targetProxy = 9BBDC016F505E44F0E066512798A7A25 /* PBXContainerItemProxy */; + target = 29BC83516D9F29C0D714E5CAF9880C36 /* GradientLoadingBar */; + targetProxy = 9BCA4EFA4B96155A510D23270C4FCCCA /* PBXContainerItemProxy */; + }; + B34F64432C2628511F768F271DC8BEBB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Observable; + target = 1B4557A96F50C37EE5009366B45453B2 /* Observable */; + targetProxy = A6D751D2F5C50986BC226AD93E23CB05 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 1154D18835E11DCF4C6D3ABBD94FC8B2 /* Debug */ = { + 23B2E1163053F92E823AD3DAAE8AB4AF /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4C3D18A136BBE022D715E4F77216A1F0 /* Pods-GradientLoadingBar_Example.debug.xcconfig */; + baseConfigurationReference = 9AC0D5BE1D3E0BD55B9098C545D90E0E /* Observable.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -566,79 +608,13 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-GradientLoadingBar_Example/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Observable/Observable-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Observable/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_GradientLoadingBar_Example; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 2391AB0DF476D0BF15DA502FD5D56E68 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AE81FE3F50CEA8E993C3DC8F5A9989B8 /* Pods-GradientLoadingBar_Tests.debug.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-GradientLoadingBar_Tests/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_GradientLoadingBar_Tests; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 5C79A6E75624EAA3969DA7A663BBA669 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = CCC1BC5CEB1151E0A04A33B26AE57411 /* GradientLoadingBar.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/GradientLoadingBar/GradientLoadingBar-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/GradientLoadingBar/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/GradientLoadingBar/GradientLoadingBar.modulemap"; - PRODUCT_NAME = GradientLoadingBar; + MODULEMAP_FILE = "Target Support Files/Observable/Observable.modulemap"; + PRODUCT_NAME = Observable; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -650,7 +626,7 @@ }; name = Debug; }; - 6F9224530522DD3C735EC96CF142642E /* Release */ = { + 798F283DEF5D6E82C13E1DBA995AA1B8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -660,6 +636,7 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; @@ -694,13 +671,13 @@ ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_INHIBIT_ALL_WARNINGS = NO; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; STRIP_INSTALLED_PRODUCT = NO; @@ -709,9 +686,43 @@ }; name = Release; }; - 7BC683054BF52690B352E993FC6649C1 /* Release */ = { + 7A4149B63F94A67C1FFDB91CA24D7781 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CCC1BC5CEB1151E0A04A33B26AE57411 /* GradientLoadingBar.xcconfig */; + baseConfigurationReference = 2F96DBDA2338122C5D2332063A0DDC4B /* Pods-GradientLoadingBar_Example.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-GradientLoadingBar_Example/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_GradientLoadingBar_Example; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + A8BA56DA06DF9659C35399F99D7564CC /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 22AA11253C3E2F00F94AAA627F044BD9 /* GradientLoadingBar.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -741,9 +752,43 @@ }; name = Release; }; - A0A1595A7BBE7F8799549FBA6D016C5F /* Release */ = { + AD75EFC2881A641F822B2A1E19BFCC77 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 62982164F2B5DEF7B82A870F71FBFE74 /* Observable.xcconfig */; + baseConfigurationReference = F0F91F53502405804E4AFA6E2F5FF2A8 /* Pods-GradientLoadingBar_Example.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-GradientLoadingBar_Example/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_GradientLoadingBar_Example; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + BC2EE1F2621DE364AB5C3BD0FB59458E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9AC0D5BE1D3E0BD55B9098C545D90E0E /* Observable.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -773,7 +818,7 @@ }; name = Release; }; - B57951D085A1B98A97F8A1062A5E5C5B /* Debug */ = { + CE271817CBC0BF8DB9C70409CD854479 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -783,6 +828,7 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; @@ -820,13 +866,13 @@ ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_INHIBIT_ALL_WARNINGS = NO; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; @@ -836,9 +882,72 @@ }; name = Debug; }; - DA21818ADCCFDBE3DC9DF3903419EB9E /* Release */ = { + CEAF18613F6A1C4D7E7343AC88EA547C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 53267FC01B3E758EC7BC06C1D2220B74 /* Pods-GradientLoadingBar_Tests.release.xcconfig */; + baseConfigurationReference = A7EE3290A69260383C55CBE340D72011 /* Pods-GradientLoadingBar_Tests.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-GradientLoadingBar_Tests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_GradientLoadingBar_Tests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + D16C677267F7CF3DA3C42091B0971878 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 22AA11253C3E2F00F94AAA627F044BD9 /* GradientLoadingBar.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/GradientLoadingBar/GradientLoadingBar-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GradientLoadingBar/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/GradientLoadingBar/GradientLoadingBar.modulemap"; + PRODUCT_NAME = GradientLoadingBar; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + F2A7EE53A43335C89262633065606AE3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D9DE45D95CCA0E5D76226B173898C17B /* Pods-GradientLoadingBar_Tests.release.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -869,115 +978,50 @@ }; name = Release; }; - DECE6BFB43A907A4C92FE148A3F86861 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 62982164F2B5DEF7B82A870F71FBFE74 /* Observable.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Observable/Observable-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Observable/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Observable/Observable.modulemap"; - PRODUCT_NAME = Observable; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - F6449C0ACB4664CBCE4ABF2F2A8059F1 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 501B9AB1C1F1E59F4628E81A7970CD37 /* Pods-GradientLoadingBar_Example.release.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-GradientLoadingBar_Example/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_GradientLoadingBar_Example; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 00E38063FE1C1ED092C80D09810F4D14 /* Build configuration list for PBXNativeTarget "Observable" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DECE6BFB43A907A4C92FE148A3F86861 /* Debug */, - A0A1595A7BBE7F8799549FBA6D016C5F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - B57951D085A1B98A97F8A1062A5E5C5B /* Debug */, - 6F9224530522DD3C735EC96CF142642E /* Release */, + CE271817CBC0BF8DB9C70409CD854479 /* Debug */, + 798F283DEF5D6E82C13E1DBA995AA1B8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 37515D7500C740E1F892D462242EE790 /* Build configuration list for PBXNativeTarget "GradientLoadingBar" */ = { + 994EE5A58AF8B36DD55E52C1787AD1DD /* Build configuration list for PBXNativeTarget "Observable" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5C79A6E75624EAA3969DA7A663BBA669 /* Debug */, - 7BC683054BF52690B352E993FC6649C1 /* Release */, + 23B2E1163053F92E823AD3DAAE8AB4AF /* Debug */, + BC2EE1F2621DE364AB5C3BD0FB59458E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 769F26B1F11CC0AB6BE2AE773FF66E01 /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_Tests" */ = { + B3073FF85CC042B5C8BF8C85D5503C1E /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_Example" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2391AB0DF476D0BF15DA502FD5D56E68 /* Debug */, - DA21818ADCCFDBE3DC9DF3903419EB9E /* Release */, + AD75EFC2881A641F822B2A1E19BFCC77 /* Debug */, + 7A4149B63F94A67C1FFDB91CA24D7781 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - CE51B32DA3B3093FF3BA59642B6C54A8 /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_Example" */ = { + D104056D84CD79BDB5002659695AC7FB /* Build configuration list for PBXNativeTarget "GradientLoadingBar" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1154D18835E11DCF4C6D3ABBD94FC8B2 /* Debug */, - F6449C0ACB4664CBCE4ABF2F2A8059F1 /* Release */, + D16C677267F7CF3DA3C42091B0971878 /* Debug */, + A8BA56DA06DF9659C35399F99D7564CC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FC7BD56761426B5F94E35E60E95CBA50 /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CEAF18613F6A1C4D7E7343AC88EA547C /* Debug */, + F2A7EE53A43335C89262633065606AE3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/GradientLoadingBar.xcscheme b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/GradientLoadingBar.xcscheme index 36db50b..891390a 100644 --- a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/GradientLoadingBar.xcscheme +++ b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/GradientLoadingBar.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> @@ -45,7 +45,7 @@ diff --git a/Example/Pods/Target Support Files/GradientLoadingBar/GradientLoadingBar.xcconfig b/Example/Pods/Target Support Files/GradientLoadingBar/GradientLoadingBar.xcconfig index 934bcd4..114eee8 100644 --- a/Example/Pods/Target Support Files/GradientLoadingBar/GradientLoadingBar.xcconfig +++ b/Example/Pods/Target Support Files/GradientLoadingBar/GradientLoadingBar.xcconfig @@ -2,7 +2,7 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/GradientLoadingBar FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Observable" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/SwiftFormat" "${PODS_ROOT}/Headers/Public/SwiftLint" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" "-suppress-warnings" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} diff --git a/Example/Pods/Target Support Files/Observable/Observable.xcconfig b/Example/Pods/Target Support Files/Observable/Observable.xcconfig index 243ff81..a369bc9 100644 --- a/Example/Pods/Target Support Files/Observable/Observable.xcconfig +++ b/Example/Pods/Target Support Files/Observable/Observable.xcconfig @@ -1,7 +1,7 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Observable GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/SwiftFormat" "${PODS_ROOT}/Headers/Public/SwiftLint" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" "-suppress-warnings" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.markdown index c855ef2..cee7fec 100644 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.markdown @@ -49,54 +49,4 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -## SwiftFormat - -MIT License - -Copyright (c) 2016 Nick Lockwood - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -## SwiftLint - -The MIT License (MIT) - -Copyright (c) 2015 Realm Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.plist index 610c2bd..316a391 100644 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.plist @@ -73,68 +73,6 @@ THE SOFTWARE. Type PSGroupSpecifier - - FooterText - MIT License - -Copyright (c) 2016 Nick Lockwood - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - License - MIT - Title - SwiftFormat - Type - PSGroupSpecifier - - - FooterText - The MIT License (MIT) - -Copyright (c) 2015 Realm Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - License - MIT - Title - SwiftLint - Type - PSGroupSpecifier - FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Tests/Helpers/Extensions/Observable+ObserveDistinctTestCase.swift b/Example/Tests/Helpers/Extensions/Observable+ObserveDistinctTestCase.swift new file mode 100644 index 0000000..07b5593 --- /dev/null +++ b/Example/Tests/Helpers/Extensions/Observable+ObserveDistinctTestCase.swift @@ -0,0 +1,54 @@ +// +// Observable+ObserveDistinctTestCase.swift +// GradientLoadingBarTests +// +// Created by Felix Mau on 25.08.18. +// Copyright © 2018 CocoaPods. All rights reserved. +// + +import XCTest +import Observable + +class ObservableObserveDistinctTestCase: XCTestCase { + func testObserveDistinctShouldNotifyListener() { + // Given + let prevValue = 123 + let nextValue = 456 + + let observable = Observable(prevValue) + + var observeCallCounter = 0 + + var disposeBag = Disposal() + observable.observeDistinct { _, _ in + observeCallCounter += 1 + }.add(to: &disposeBag) + + // When + observable.value = nextValue + + // Then + XCTAssertEqual(observeCallCounter, 2) + } + + func testObserveDistinctShouldNotNotifyListenerDueToSameValue() { + // Given + let prevValue = 123 + let nextValue = 123 + + let observable = Observable(prevValue) + + var observeCallCounter = 0 + + var disposeBag = Disposal() + observable.observeDistinct { _, _ in + observeCallCounter += 1 + }.add(to: &disposeBag) + + // When + observable.value = nextValue + + // Then + XCTAssertEqual(observeCallCounter, 1) + } +} diff --git a/Example/Tests/ViewModel/GradientLoadingBarViewModelTestCase.swift b/Example/Tests/ViewModel/GradientLoadingBarViewModelTestCase.swift index c73df84..f21a4b2 100644 --- a/Example/Tests/ViewModel/GradientLoadingBarViewModelTestCase.swift +++ b/Example/Tests/ViewModel/GradientLoadingBarViewModelTestCase.swift @@ -15,6 +15,7 @@ import XCTest class GradientLoadingBarViewModelTestCase: XCTestCase { private var superview: UIView! + private var durations: Durations! private var sharedApplicationMock: SharedApplicationMock! private var notificationCenter: NotificationCenter! @@ -24,10 +25,15 @@ class GradientLoadingBarViewModelTestCase: XCTestCase { super.setUp() superview = UIView() + durations = Durations(fadeIn: 1.2, + fadeOut: 3.4, + progress: 5.6) + sharedApplicationMock = SharedApplicationMock() notificationCenter = NotificationCenter() viewModel = GradientLoadingBarViewModel(superview: superview, + durations: durations, sharedApplication: sharedApplicationMock, notificationCenter: notificationCenter) } @@ -36,6 +42,7 @@ class GradientLoadingBarViewModelTestCase: XCTestCase { viewModel = nil superview = nil + durations = nil notificationCenter = nil sharedApplicationMock = nil @@ -56,6 +63,7 @@ class GradientLoadingBarViewModelTestCase: XCTestCase { func testListenerForSuperviewShouldBeInformedAfterUIWindowDidBecomeKeyNotification() { // Given let viewModel = GradientLoadingBarViewModel(superview: nil, + durations: durations, sharedApplication: sharedApplicationMock, notificationCenter: notificationCenter) @@ -74,13 +82,14 @@ class GradientLoadingBarViewModelTestCase: XCTestCase { }.add(to: &disposal) // When - notificationCenter.post(name: UIWindow.didBecomeKeyNotification, + notificationCenter.post(name: .UIWindowDidBecomeKey, object: nil) } func testListenerForSuperviewShouldBeInformedAfterUIWindowDidBecomeKeyNotificationJustOnce() { // Given let viewModel = GradientLoadingBarViewModel(superview: nil, + durations: durations, sharedApplication: sharedApplicationMock, notificationCenter: notificationCenter) @@ -101,7 +110,7 @@ class GradientLoadingBarViewModelTestCase: XCTestCase { // When for _ in 1 ... 3 { - notificationCenter.post(name: UIWindow.didBecomeKeyNotification, + notificationCenter.post(name: .UIWindowDidBecomeKey, object: nil) } @@ -115,7 +124,7 @@ class GradientLoadingBarViewModelTestCase: XCTestCase { viewModel.show() // Then - XCTAssertTrue(viewModel.isVisible.value) + XCTAssertTrue(viewModel.isVisible.value.isHidden) } func testShowShouldUpdateVisibilityJustOnce() { @@ -133,7 +142,7 @@ class GradientLoadingBarViewModelTestCase: XCTestCase { } // Then - XCTAssertTrue(viewModel.isVisible.value) + XCTAssertTrue(viewModel.isVisible.value.isHidden) XCTAssertEqual(visiblityCounter, 2, "After the initial call to the observer, we expect it to be notified just one more time.") } @@ -145,7 +154,7 @@ class GradientLoadingBarViewModelTestCase: XCTestCase { // When viewModel.hide() - XCTAssertFalse(viewModel.isVisible.value) + XCTAssertFalse(viewModel.isVisible.value.isHidden) } func testHideShouldUpdateVisibilityJustOnce() { @@ -166,7 +175,7 @@ class GradientLoadingBarViewModelTestCase: XCTestCase { } // Then - XCTAssertFalse(viewModel.isVisible.value) + XCTAssertFalse(viewModel.isVisible.value.isHidden) XCTAssertEqual(visiblityCounter, 2, "After the initial call to the observer, we expect it to be notified just one more time.") } @@ -175,7 +184,7 @@ class GradientLoadingBarViewModelTestCase: XCTestCase { viewModel.toggle() let isOdd = idx % 2 == 1 - XCTAssertEqual(viewModel.isVisible.value, isOdd) + XCTAssertEqual(viewModel.isVisible.value.isHidden, isOdd) } } } diff --git a/Extensions/Observable+ObserveDistinct.swift b/Extensions/Observable+ObserveDistinct.swift new file mode 100644 index 0000000..360cc09 --- /dev/null +++ b/Extensions/Observable+ObserveDistinct.swift @@ -0,0 +1,21 @@ +// +// Observable+ObserveDistinct.swift +// GradientLoadingBar +// +// Created by Felix Mau on 25.08.18. +// + +import Foundation +import Observable + +extension Observable where T: Equatable { + /// A wrapper around the `observe` method, that checks whether the previous value is different from the next value. + /// If they are equal the listener will not be notified. This is useful to prevent unnecessary UI updates. + public func observeDistinct(_ observer: @escaping Observer) -> Disposable { + return observe({ nextValue, prevValue in + guard nextValue != prevValue else { return } + + observer(nextValue, prevValue) + }) + } +} diff --git a/Extensions/UIColor/UIColor+DefaultGradientColors.swift b/Extensions/UIColor/UIColor+DefaultGradientColors.swift new file mode 100644 index 0000000..2ba09fc --- /dev/null +++ b/Extensions/UIColor/UIColor+DefaultGradientColors.swift @@ -0,0 +1,21 @@ +// +// UIColor+DefaultGradientColors.swift +// GradientLoadingBar +// +// Created by Felix Mau on 26.08.18. +// + +import UIKit + +extension UIColor { + // iOS color palette + // From: https://codepen.io/marcobiedermann/pen/LExXWW + public static let defaultGradientColorList = [ + UIColor(hex: "#4cd964"), + UIColor(hex: "#5ac8fa"), + UIColor(hex: "#007aff"), + UIColor(hex: "#34aadc"), + UIColor(hex: "#5856d6"), + UIColor(hex: "#ff2d55") + ] +} diff --git a/GradientLoadingBar/Classes/Helpers/Extensions/UIColor+Initializers.swift b/Extensions/UIColor/UIColor+Initializers.swift similarity index 100% rename from GradientLoadingBar/Classes/Helpers/Extensions/UIColor+Initializers.swift rename to Extensions/UIColor/UIColor+Initializers.swift diff --git a/GradientLoadingBar/Classes/GradientLoadingBarController.swift b/GradientLoadingBar/Classes/GradientLoadingBarController.swift index 9b86d07..0d2f45e 100644 --- a/GradientLoadingBar/Classes/GradientLoadingBarController.swift +++ b/GradientLoadingBar/Classes/GradientLoadingBarController.swift @@ -13,41 +13,15 @@ import UIKit public typealias GradientLoadingBar = GradientLoadingBarController open class GradientLoadingBarController { - // MARK: - Types - - /// Struct used for default parameters in initialization - public struct DefaultValues { - /// Height of gradient bar. - public static let height = 2.5 - - /// Configuration with durations for each animation. - public static let durations = Durations(fadeIn: 0.33, fadeOut: 0.66, progress: 3.33) - - // iOS color palette - // From: https://codepen.io/marcobiedermann/pen/LExXWW - public static let gradientColors = [ - UIColor(hex: "#4cd964"), - UIColor(hex: "#5ac8fa"), - UIColor(hex: "#007aff"), - UIColor(hex: "#34aadc"), - UIColor(hex: "#5856d6"), - UIColor(hex: "#ff2d55") - ] - } - // MARK: - Public properties - /// Boolean flag, true if gradient view is currently visible, otherwise false. - public var isVisible: Bool { - return viewModel.isVisible.value - } + /// The height of the gradient bar. + /// Notice: Has to be public to allow overwriting `setupConstraints()` + public let height: Double /// View containing the gradient layer. public let gradientView: GradientView - /// Height of gradient bar. - public let height: Double - /// Singleton instance. public static var shared = GradientLoadingBar() @@ -64,23 +38,26 @@ open class GradientLoadingBarController { /// Creates a new gradient loading bar instance. /// /// Parameters: - /// - height: Height of the gradient bar - /// - durations: Configuration with durations for each animation - /// - gradientColorList: Colors used for the gradient - /// - superview: View containing the gradient bar + /// - height: Height of the gradient bar + /// - durations: Configuration with durations for each animation + /// - gradientColorList: Colors used for the gradient + /// - shouldHandleSafeAreaInsets: Flag whether the top layout constraint should respect `safeAreaLayoutGuide` + /// - superview: View containing the gradient bar /// /// Returns: Instance with gradient bar - public init(height: Double = DefaultValues.height, - durations: Durations = DefaultValues.durations, - gradientColorList: [UIColor] = DefaultValues.gradientColors, + public init(height: Double = 2.5, + durations: Durations = .default, + gradientColorList: [UIColor] = UIColor.defaultGradientColorList, onView superview: UIView? = nil) { self.height = height - gradientView = GradientView(animationDurations: durations, + gradientView = GradientView(progressAnimationDuration: durations.progress, gradientColorList: gradientColorList) + gradientView.isHidden = true + gradientView.clipsToBounds = true - viewModel = GradientLoadingBarViewModel(superview: superview) - + viewModel = GradientLoadingBarViewModel(superview: superview, + durations: durations) bindViewModelToView() } @@ -93,30 +70,41 @@ open class GradientLoadingBarController { // MARK: - Private methods private func bindViewModelToView() { - viewModel.isVisible.observe { [weak self] nextValue, _ in - if nextValue { - self?.gradientView.show() - } else { - self?.gradientView.hide() - } + viewModel.isVisible.observeDistinct { [weak self] nextValue, _ in + self?.updateGradientViewVisibility(nextValue) }.add(to: &disposal) - viewModel.superview.observe { [weak self] nextValue, _ in - guard self?.gradientView.superview == nil else { - // The viewmodel informed us eventhough we already have a valid superview. This isn't supposed to happen, therefore we safely exit here. - return - } - - guard let superview = nextValue else { - // We've got an invalid superview, therefore we safely exit here. - return - } - - self?.addGradientView(to: superview) + viewModel.superview.observeDistinct { [weak self] nextValue, _ in + self?.addGradientView(to: nextValue) }.add(to: &disposal) } - private func addGradientView(to superview: UIView) { + private func updateGradientViewVisibility(_ animatedVisibilityUpdate: GradientLoadingBarViewModel.AnimatedVisibilityUpdate) { + let isHidden = animatedVisibilityUpdate.isHidden + if !isHidden { + gradientView.isHidden = false + } + + UIView.animate(withDuration: animatedVisibilityUpdate.duration, animations: { + self.gradientView.alpha = animatedVisibilityUpdate.alpha + }, completion: { isFinished in + if isFinished && isHidden { + self.gradientView.isHidden = true + } + }) + } + + private func addGradientView(to superview: UIView?) { + guard gradientView.superview == nil else { + // The viewmodel informed us eventhough we already have a valid superview. + return + } + + guard let superview = superview else { + // We've received an invalid superview. + return + } + gradientView.translatesAutoresizingMaskIntoConstraints = false superview.addSubview(gradientView) @@ -127,16 +115,8 @@ open class GradientLoadingBarController { /// Apply layout contraints for gradient loading view. open func setupConstraints(superview: UIView) { - let superViewTopAnchor: NSLayoutYAxisAnchor - if #available(iOS 11.0, *) { - // Handle iPhone X Layout, so gradient view is underneath the status bar - superViewTopAnchor = superview.safeAreaLayoutGuide.topAnchor - } else { - superViewTopAnchor = superview.topAnchor - } - NSLayoutConstraint.activate([ - gradientView.topAnchor.constraint(equalTo: superViewTopAnchor), + gradientView.topAnchor.constraint(equalTo: superview.topAnchor), gradientView.heightAnchor.constraint(equalToConstant: CGFloat(height)), gradientView.leadingAnchor.constraint(equalTo: superview.leadingAnchor), @@ -160,6 +140,49 @@ open class GradientLoadingBarController { } } +// MARK: - Safe Area Gradient Loading Bar + +/// +open class SafeAreaGradientLoadingBar: GradientLoadingBar { + // MARK: - Public properties + + // override public static var shared = SafeAreaGradientLoadingBar() as GradientLoadingBar + + // MARK: - Public methods + + open override func setupConstraints(superview: UIView) { + let superViewTopAnchor: NSLayoutYAxisAnchor + if #available(iOS 11.0, *) { + superViewTopAnchor = superview.safeAreaLayoutGuide.topAnchor + } else { + superViewTopAnchor = superview.topAnchor + } + + NSLayoutConstraint.activate([ + gradientView.leadingAnchor.constraint(equalTo: superview.leadingAnchor), + gradientView.trailingAnchor.constraint(equalTo: superview.trailingAnchor), + + gradientView.topAnchor.constraint(equalTo: superViewTopAnchor), + gradientView.heightAnchor.constraint(equalToConstant: CGFloat(height)) + ]) + } +} + +// MARK: - Bottom Gradient Loading Bar + +/// +open class BottomGradientLoadingBar: GradientLoadingBar { + open override func setupConstraints(superview: UIView) { + NSLayoutConstraint.activate([ + gradientView.leadingAnchor.constraint(equalTo: superview.leadingAnchor), + gradientView.trailingAnchor.constraint(equalTo: superview.trailingAnchor), + + gradientView.bottomAnchor.constraint(equalTo: superview.bottomAnchor), + gradientView.heightAnchor.constraint(equalToConstant: CGFloat(height)) + ]) + } +} + // MARK: - Deprecated methods extension GradientLoadingBarController { @@ -177,8 +200,8 @@ extension GradientLoadingBarController { /// /// Returns: Instance with gradient bar @available(*, deprecated, message: "Please use `init(height: Double, durations: Durations, gradientColorList: [UIColor], onView: UIView?)` instead") - public convenience init(height: Double = DefaultValues.height, - durations: Durations = DefaultValues.durations, + public convenience init(height: Double = 2.5, + durations: Durations = .default, gradientColors: [CGColor], onView superview: UIView? = nil) { self.init(height: height, diff --git a/GradientLoadingBar/Classes/ViewModel/GradientLoadingBarViewModel.swift b/GradientLoadingBar/Classes/ViewModel/GradientLoadingBarViewModel.swift index f6bf8a3..c3474b4 100644 --- a/GradientLoadingBar/Classes/ViewModel/GradientLoadingBarViewModel.swift +++ b/GradientLoadingBar/Classes/ViewModel/GradientLoadingBarViewModel.swift @@ -10,16 +10,36 @@ import Observable /// The `GradientLoadingBarViewModel` class is responsible for the visibility state of the gradient view. class GradientLoadingBarViewModel { + // MARK: - Types + + /// + struct AnimatedVisibilityUpdate: Equatable { + /// + static let zero = AnimatedVisibilityUpdate(duration: 0.0, alpha: 0.0, isHidden: true) + + /// The duration for the visibility update. + let duration: TimeInterval + + /// New alpha value. + let alpha: CGFloat + + /// Boolean flag, whether the view should be hidden after the animation is finished. + let isHidden: Bool + } + // MARK: - Public properties /// Boolean flag determinating whether gradient view is currently visible. - private(set) var isVisible = Observable(false) + let isVisible: Observable = Observable(.zero) /// Boolean flag determinating whether gradient view is currently visible. - private(set) var superview: Observable = Observable(nil) + let superview: Observable = Observable(nil) // MARK: - Private properties + /// Configuration with durations for each animation. + private let durations: Durations + // MARK: - Dependencies private let sharedApplication: UIApplicationProtocol @@ -27,7 +47,11 @@ class GradientLoadingBarViewModel { // MARK: - Constructor - init(superview: UIView?, sharedApplication: UIApplicationProtocol = UIApplication.shared, notificationCenter: NotificationCenter = .default) { + init(superview: UIView?, + durations: Durations, + sharedApplication: UIApplicationProtocol = UIApplication.shared, + notificationCenter: NotificationCenter = .default) { + self.durations = durations self.sharedApplication = sharedApplication self.notificationCenter = notificationCenter @@ -38,7 +62,7 @@ class GradientLoadingBarViewModel { // Therefore we setup an observer to inform the listeners when it's ready. notificationCenter.addObserver(self, selector: #selector(didReceiveUiWindowDidBecomeKeyNotification(_:)), - name: UIWindow.didBecomeKeyNotification, + name: .UIWindowDidBecomeKey, object: nil) } } @@ -51,6 +75,7 @@ class GradientLoadingBarViewModel { // Prevent informing the listeners multiple times. notificationCenter.removeObserver(self) + // superview.value = keyWindow } @@ -58,21 +83,25 @@ class GradientLoadingBarViewModel { /// Fades in the gradient loading bar. func show() { - guard !isVisible.value else { return } - - isVisible.value = true + isVisible.value = AnimatedVisibilityUpdate(duration: durations.fadeIn, + alpha: 1.0, + isHidden: false) } /// Fades out the gradient loading bar. func hide() { - guard isVisible.value else { return } - - isVisible.value = false + isVisible.value = AnimatedVisibilityUpdate(duration: durations.fadeOut, + alpha: 0.0, + isHidden: true) } /// Toggle visiblity of gradient loading bar. func toggle() { - isVisible.value.toggle() + if isVisible.value.isHidden { + show() + } else { + hide() + } } } diff --git a/GradientLoadingBar/Classes/Views/GradientView.swift b/GradientLoadingBar/Classes/Views/GradientView.swift index d830d0a..627c581 100644 --- a/GradientLoadingBar/Classes/Views/GradientView.swift +++ b/GradientLoadingBar/Classes/Views/GradientView.swift @@ -13,10 +13,20 @@ public final class GradientView: UIView { // MARK: - Types /// Animation-Keys for each animation - enum AnimationKeys: String { - case fadeIn - case fadeOut - case progress + static let progressAnimationKey = "GradientView--progressAnimation" + + // MARK: - Public properties + + public override var isHidden: Bool { + didSet { + super.isHidden = isHidden + + if isHidden { + stopProgressAnimation() + } else { + startProgressAnimation() + } + } } // MARK: - Private properties @@ -24,8 +34,8 @@ public final class GradientView: UIView { /// Layer holding the gradient. private let gradientLayer = CAGradientLayer() - /// Configuration with durations for each animation. - private let animationDurations: Durations + /// Duration for the progress animation. + private let progressAnimationDuration: TimeInterval /// Colors used for the gradient. private let gradientColorList: [UIColor] @@ -35,12 +45,12 @@ public final class GradientView: UIView { /// Initializes a new gradient view (holding the `CALayer` used for the gradient) /// /// Parameters: - /// - animationDurations: Configuration with durations for each animation - /// - gradientColors: Colors used for the gradient + /// - progressAnimationDuration: Duration for the progress animation. + /// - gradientColorList: Colors used for the gradient. /// /// Returns: Instance with gradient view - init(animationDurations: Durations, gradientColorList: [UIColor]) { - self.animationDurations = animationDurations + init(progressAnimationDuration: TimeInterval, gradientColorList: [UIColor]) { + self.progressAnimationDuration = progressAnimationDuration self.gradientColorList = gradientColorList super.init(frame: .zero) @@ -52,11 +62,27 @@ public final class GradientView: UIView { fatalError("init(coder:) has not been implemented") } - // MARK: - Layout + public override func layoutSubviews() { + super.layoutSubviews() + + // Unfortunately CGLayer is not affected by autolayout, so any change in the size of the view will not change the gradient layer. + // That's why we'll have to update the frame here manually. + // Three times of the width in order to apply normal, reversed and normal gradient to simulate infinte animation + gradientLayer.frame = CGRect(x: 0, y: 0, width: 3 * bounds.size.width, height: bounds.size.height) + + gradientLayer.anchorPoint = CGPoint(x: 0, y: 0) + gradientLayer.position = CGPoint(x: 0, y: 0) + } + + public override func point(inside _: CGPoint, with _: UIEvent?) -> Bool { + // Passing all touches to the next view (if any), in the view stack. + // + return false + } + + // MARK: - Private methods private func setupGradientLayer() { - gradientLayer.opacity = 0.0 - gradientLayer.startPoint = .zero gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.0) @@ -72,87 +98,22 @@ public final class GradientView: UIView { layer.insertSublayer(gradientLayer, at: 0) } - public override func layoutSubviews() { - super.layoutSubviews() - - // Unfortunately CGLayer is not affected by autolayout, so any change in the size of the view will not change the gradient layer. - // That's why we'll have to update the frame here manually. - - // Three times of the width in order to apply normal, reversed and normal gradient to simulate infinte animation - gradientLayer.frame = CGRect(x: 0, y: 0, width: 3 * bounds.size.width, height: bounds.size.height) - - gradientLayer.anchorPoint = CGPoint(x: 0, y: 0) - gradientLayer.position = CGPoint(x: 0, y: 0) - } - - // MARK: - Show / Hide - - /// Helper to toggle gradient layer visibility. - private func updateGradientLayerVisibility(fromOpacity: CGFloat, toOpacity: CGFloat, duration: TimeInterval, animationKey: String) { - let animation = CABasicAnimation(keyPath: "opacity") - animation.delegate = self - - animation.fromValue = fromOpacity - animation.toValue = toOpacity - - animation.duration = duration - - animation.fillMode = .forwards - animation.isRemovedOnCompletion = false - - gradientLayer.add(animation, forKey: animationKey) - } - - /// Fades in gradient view - public func show() { - // Remove possible existing fade-out animation - gradientLayer.removeAnimation(forKey: AnimationKeys.fadeOut.rawValue) - - updateGradientLayerVisibility(fromOpacity: 0.0, - toOpacity: 1.0, - duration: animationDurations.fadeIn, - animationKey: AnimationKeys.fadeIn.rawValue) - } - - /// Fades out gradient view - public func hide() { - // Remove possible existing fade-in animation - gradientLayer.removeAnimation(forKey: AnimationKeys.fadeIn.rawValue) - - updateGradientLayerVisibility(fromOpacity: 1.0, - toOpacity: 0.0, - duration: animationDurations.fadeOut, - animationKey: AnimationKeys.fadeOut.rawValue) - } -} - -// MARK: - CAAnimationDelegate - -extension GradientView: CAAnimationDelegate { - public func animationDidStart(_ anim: CAAnimation) { - guard anim == gradientLayer.animation(forKey: AnimationKeys.fadeIn.rawValue) else { - // We're only interested in the "fadeIn" animation, so exit here. - return - } - - // Start progress animation together with start of fade-in animation + /// + private func startProgressAnimation() { + // Start progress animation together with start of fade-in animation. let animation = CABasicAnimation(keyPath: "position") animation.fromValue = CGPoint(x: -2 * bounds.size.width, y: 0) animation.toValue = CGPoint.zero - animation.duration = animationDurations.progress + animation.duration = progressAnimationDuration animation.repeatCount = Float.infinity - gradientLayer.add(animation, forKey: AnimationKeys.progress.rawValue) + gradientLayer.add(animation, forKey: GradientView.progressAnimationKey) } - public func animationDidStop(_ anim: CAAnimation, finished _: Bool) { - guard anim == gradientLayer.animation(forKey: AnimationKeys.fadeOut.rawValue) else { - // We're only interested in the "fadeOut" animation, so exit here. - return - } - - // Stop progress animation together with finished fade-out animation - gradientLayer.removeAnimation(forKey: AnimationKeys.progress.rawValue) + /// + private func stopProgressAnimation() { + // Stop progress animation together with finished fade-out animation. + gradientLayer.removeAnimation(forKey: GradientView.progressAnimationKey) } } diff --git a/GradientLoadingBar/Classes/Helpers/Structs/Durations.swift b/Structs/Durations.swift similarity index 88% rename from GradientLoadingBar/Classes/Helpers/Structs/Durations.swift rename to Structs/Durations.swift index 6f12e79..b809546 100644 --- a/GradientLoadingBar/Classes/Helpers/Structs/Durations.swift +++ b/Structs/Durations.swift @@ -11,7 +11,12 @@ import Foundation /// Animation durations for fade-in / fade-out and progress animations. /// All values are in seconds. public struct Durations { - // MARK: - Properties + // MARK: - Config + + /// + public static let `default` = Durations(fadeIn: 0.33, fadeOut: 0.66, progress: 3.33) + + // MARK: - Public Properties /// Duration (in sec.) for fade in animation let fadeIn: Double