├── .gitignore ├── .swiftpm └── xcode │ ├── package.xcworkspace │ └── contents.xcworkspacedata │ └── xcshareddata │ └── xcschemes │ └── SSSwiftUISpinnerButton.xcscheme ├── Example ├── Podfile ├── Podfile.lock ├── Pods │ ├── Local Podspecs │ │ └── SSSwiftUISpinnerButton.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ └── Target Support Files │ │ ├── Pods-SSSwiftUISpinnerButtonDemo │ │ ├── Pods-SSSwiftUISpinnerButtonDemo-Info.plist │ │ ├── Pods-SSSwiftUISpinnerButtonDemo-acknowledgements.markdown │ │ ├── Pods-SSSwiftUISpinnerButtonDemo-acknowledgements.plist │ │ ├── Pods-SSSwiftUISpinnerButtonDemo-dummy.m │ │ ├── Pods-SSSwiftUISpinnerButtonDemo-frameworks-Debug-input-files.xcfilelist │ │ ├── Pods-SSSwiftUISpinnerButtonDemo-frameworks-Debug-output-files.xcfilelist │ │ ├── Pods-SSSwiftUISpinnerButtonDemo-frameworks-Release-input-files.xcfilelist │ │ ├── Pods-SSSwiftUISpinnerButtonDemo-frameworks-Release-output-files.xcfilelist │ │ ├── Pods-SSSwiftUISpinnerButtonDemo-frameworks.sh │ │ ├── Pods-SSSwiftUISpinnerButtonDemo-umbrella.h │ │ ├── Pods-SSSwiftUISpinnerButtonDemo.debug.xcconfig │ │ ├── Pods-SSSwiftUISpinnerButtonDemo.modulemap │ │ └── Pods-SSSwiftUISpinnerButtonDemo.release.xcconfig │ │ └── SSSwiftUISpinnerButton │ │ ├── SSSwiftUISpinnerButton-Info.plist │ │ ├── SSSwiftUISpinnerButton-dummy.m │ │ ├── SSSwiftUISpinnerButton-prefix.pch │ │ ├── SSSwiftUISpinnerButton-umbrella.h │ │ ├── SSSwiftUISpinnerButton.debug.xcconfig │ │ ├── SSSwiftUISpinnerButton.modulemap │ │ └── SSSwiftUISpinnerButton.release.xcconfig ├── SSSwiftUISpinnerButtonDemo.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── SSSwiftUISpinnerButtonDemo.xcscheme ├── SSSwiftUISpinnerButtonDemo.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── SSSwiftUISpinnerButtonDemo │ ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json │ ├── ContentView.swift │ ├── HelperClass │ ├── Color+Extension.swift │ └── Enumerations.swift │ ├── Info.plist │ ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json │ └── SSSwiftUISpinnerButtonDemoApp.swift ├── LICENSE ├── Package.swift ├── README.md ├── SSSwiftUISpinnerButton.gif ├── SSSwiftUISpinnerButton.podspec ├── Sources └── SSSwiftUISpinnerButton │ ├── SpinnerButton.swift │ ├── SpinnerButtonAnimationStyle │ ├── ArcsRotateChaseAnimation.swift │ ├── BallRotateFadeAnimation.swift │ ├── BallSpinChaseAnimation.swift │ └── LineSpinFadeAnimation.swift │ ├── SpinnerButtonAnimationView.swift │ └── SpinnerButtonViewStyle.swift ├── Tests ├── LinuxMain.swift └── SSSwiftUISpinnerButtonTests │ ├── SSSwiftUISpinnerButtonTests.swift │ └── XCTestManifests.swift └── simformBanner.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | build/ 14 | DerivedData/ 15 | *.moved-aside 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | 28 | ## App packaging 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 40 | # Packages/ 41 | # Package.pins 42 | # Package.resolved 43 | # *.xcodeproj 44 | # 45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 46 | # hence it is not needed unless you have added a package configuration file to your project 47 | # .swiftpm 48 | 49 | .build/ 50 | 51 | # CocoaPods 52 | # 53 | # We recommend against adding the Pods directory to your .gitignore. However 54 | # you should judge for yourself, the pros and cons are mentioned at: 55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 56 | # 57 | # Pods/ 58 | # 59 | # Add this line if you want to avoid checking in source code from the Xcode workspace 60 | # *.xcworkspace 61 | 62 | # Carthage 63 | # 64 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 65 | # Carthage/Checkouts 66 | 67 | Carthage/Build/ 68 | 69 | # Accio dependency management 70 | Dependencies/ 71 | .accio/ 72 | 73 | # fastlane 74 | # 75 | # It is recommended to not store the screenshots in the git repo. 76 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 77 | # For more information about the recommended setup visit: 78 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 79 | 80 | fastlane/report.xml 81 | fastlane/Preview.html 82 | fastlane/screenshots/**/*.png 83 | fastlane/test_output 84 | 85 | # Code Injection 86 | # 87 | # After new code Injection tools there's a generated folder /iOSInjectionProject 88 | # https://github.com/johnno1962/injectionforxcode 89 | 90 | iOSInjectionProject/ 91 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.swiftpm/xcode/xcshareddata/xcschemes/SSSwiftUISpinnerButton.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 57 | 58 | 59 | 60 | 62 | 63 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | platform :ios, '13.0' 3 | 4 | target 'SSSwiftUISpinnerButtonDemo' do 5 | 6 | pod 'SSSwiftUISpinnerButton', :path => '../' 7 | 8 | end 9 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SSSwiftUISpinnerButton (0.0.2) 3 | 4 | DEPENDENCIES: 5 | - SSSwiftUISpinnerButton (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | SSSwiftUISpinnerButton: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | SSSwiftUISpinnerButton: fb2c15c4455311962db6fb58627507a19499a20b 13 | 14 | PODFILE CHECKSUM: 91de88df75cf889d0215da32bcf49596e3245789 15 | 16 | COCOAPODS: 1.10.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/SSSwiftUISpinnerButton.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "SSSwiftUISpinnerButton", 3 | "version": "0.0.2", 4 | "summary": "Button with different spinner animation styles.", 5 | "description": "SpinnerButton is a custom button with different spinner animation styles.", 6 | "homepage": "https://github.com/mobile-simformsolutions/SSSwiftUISpinnerButton", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "Chaitali Lad": "chaitali.l@simformsolutions.com" 13 | }, 14 | "platforms": { 15 | "ios": "13.0" 16 | }, 17 | "swift_versions": "5.0", 18 | "source": { 19 | "git": "https://github.com/mobile-simformsolutions/SSSwiftUISpinnerButton.git", 20 | "tag": "0.0.2" 21 | }, 22 | "source_files": "Sources/**/*", 23 | "swift_version": "5.0" 24 | } 25 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SSSwiftUISpinnerButton (0.0.2) 3 | 4 | DEPENDENCIES: 5 | - SSSwiftUISpinnerButton (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | SSSwiftUISpinnerButton: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | SSSwiftUISpinnerButton: fb2c15c4455311962db6fb58627507a19499a20b 13 | 14 | PODFILE CHECKSUM: 91de88df75cf889d0215da32bcf49596e3245789 15 | 16 | COCOAPODS: 1.10.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 17171DF024650A170FB16827056F1641 /* BallSpinChaseAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F8B1F0D8BBA4F7EE3655E8BEBB1DFDF /* BallSpinChaseAnimation.swift */; }; 11 | 1CA7FE270EE7AB3BB8EF93B960B09935 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; 12 | 28497D1CB9006BBE28F13BF2F5BC1F7B /* BallRotateFadeAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FC0556FDD13070815C62F0D9933B69D /* BallRotateFadeAnimation.swift */; }; 13 | 32ED36F6CD7EA11C9AF0DE99C722E7C4 /* SSSwiftUISpinnerButton-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D72B62FC9FC70DC4EC9B051ADC6C66A /* SSSwiftUISpinnerButton-dummy.m */; }; 14 | 733BD72A392B56C1B9E9AA5E6AF41267 /* SpinnerButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5014E674D41833C1D428CA893CB7072 /* SpinnerButton.swift */; }; 15 | 7CC1478F67D30393EDDB89B261E94525 /* SpinnerButtonViewStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23BBDB66D3A953CB43C6EFECCEB30844 /* SpinnerButtonViewStyle.swift */; }; 16 | A311B480923931DC744EBB27C7B31313 /* SSSwiftUISpinnerButton-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 638BB588EDBB08D5AFD1958D1AEBAF9A /* SSSwiftUISpinnerButton-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | B39098035928BB870C4117F59B4D20D3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; 18 | B44D9EE8797DE058D317B9B27DEB09CC /* Pods-SSSwiftUISpinnerButtonDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C43A0634462B0D75D9D102F2B495B1F1 /* Pods-SSSwiftUISpinnerButtonDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 19 | C03B5E462B296241297AA120FE927224 /* SpinnerButtonAnimationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E99EC64F3AD978A5DC3767CD86B8BBC /* SpinnerButtonAnimationView.swift */; }; 20 | C25D65A9EAD72E9B55F9B3A64A67E13B /* ArcsRotateChaseAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48D9712B60491F910AC2CD02BE37CA92 /* ArcsRotateChaseAnimation.swift */; }; 21 | CE6E682A6D7FE94DB9406BD3C8384145 /* LineSpinFadeAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40D80250BFD2FA1BB2084C20D34C297D /* LineSpinFadeAnimation.swift */; }; 22 | DA60344EEB6E29D7A5AD489D0185958D /* Pods-SSSwiftUISpinnerButtonDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B880073B82A47453243AFC670769862B /* Pods-SSSwiftUISpinnerButtonDemo-dummy.m */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXContainerItemProxy section */ 26 | F8C6F145A57D3FB8206BC02568BEEE29 /* PBXContainerItemProxy */ = { 27 | isa = PBXContainerItemProxy; 28 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 29 | proxyType = 1; 30 | remoteGlobalIDString = AC9F0D1F55E9380DB94198699F0659FD; 31 | remoteInfo = SSSwiftUISpinnerButton; 32 | }; 33 | /* End PBXContainerItemProxy section */ 34 | 35 | /* Begin PBXFileReference section */ 36 | 06F98A67C2088AD1D5F34A1120140FF8 /* Pods-SSSwiftUISpinnerButtonDemo-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SSSwiftUISpinnerButtonDemo-Info.plist"; sourceTree = ""; }; 37 | 1D72B62FC9FC70DC4EC9B051ADC6C66A /* SSSwiftUISpinnerButton-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SSSwiftUISpinnerButton-dummy.m"; sourceTree = ""; }; 38 | 20E100DCCE017276266DF9DBFD6178B8 /* SSSwiftUISpinnerButton-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SSSwiftUISpinnerButton-Info.plist"; sourceTree = ""; }; 39 | 21F8970714B8EB78415A44FDFFD894EE /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 40 | 23A54CBE2B45004E7F1BF3B65BFD5F4B /* SSSwiftUISpinnerButton-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SSSwiftUISpinnerButton-prefix.pch"; sourceTree = ""; }; 41 | 23BBDB66D3A953CB43C6EFECCEB30844 /* SpinnerButtonViewStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SpinnerButtonViewStyle.swift; path = Sources/SSSwiftUISpinnerButton/SpinnerButtonViewStyle.swift; sourceTree = ""; }; 42 | 3C35F0C0D79DAF8E23130BBC477F3740 /* SSSwiftUISpinnerButton.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SSSwiftUISpinnerButton.modulemap; sourceTree = ""; }; 43 | 40D80250BFD2FA1BB2084C20D34C297D /* LineSpinFadeAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LineSpinFadeAnimation.swift; sourceTree = ""; }; 44 | 457F0608AE83D6F5BF621805EE06C2AE /* SSSwiftUISpinnerButton.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SSSwiftUISpinnerButton.framework; path = SSSwiftUISpinnerButton.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 48D9712B60491F910AC2CD02BE37CA92 /* ArcsRotateChaseAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ArcsRotateChaseAnimation.swift; sourceTree = ""; }; 46 | 4BCCD93B4EAE75D850BECF072CF1F065 /* SSSwiftUISpinnerButton.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SSSwiftUISpinnerButton.release.xcconfig; sourceTree = ""; }; 47 | 4E99EC64F3AD978A5DC3767CD86B8BBC /* SpinnerButtonAnimationView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SpinnerButtonAnimationView.swift; path = Sources/SSSwiftUISpinnerButton/SpinnerButtonAnimationView.swift; sourceTree = ""; }; 48 | 5CC60E4E0EDFB187DC6F3B8AAADE0B49 /* Pods-SSSwiftUISpinnerButtonDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-SSSwiftUISpinnerButtonDemo-frameworks.sh"; sourceTree = ""; }; 49 | 5F8B1F0D8BBA4F7EE3655E8BEBB1DFDF /* BallSpinChaseAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BallSpinChaseAnimation.swift; sourceTree = ""; }; 50 | 638BB588EDBB08D5AFD1958D1AEBAF9A /* SSSwiftUISpinnerButton-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SSSwiftUISpinnerButton-umbrella.h"; sourceTree = ""; }; 51 | 68AB613917D4C1E19C8B7219FAB7824C /* Pods_SSSwiftUISpinnerButtonDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_SSSwiftUISpinnerButtonDemo.framework; path = "Pods-SSSwiftUISpinnerButtonDemo.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | 6FC0556FDD13070815C62F0D9933B69D /* BallRotateFadeAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BallRotateFadeAnimation.swift; sourceTree = ""; }; 53 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 54 | 875DCED9B5D4F113BEFF40D786E69D02 /* SSSwiftUISpinnerButton.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SSSwiftUISpinnerButton.debug.xcconfig; sourceTree = ""; }; 55 | 886263A340320201DA7E2AFA0D8715A3 /* Pods-SSSwiftUISpinnerButtonDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-SSSwiftUISpinnerButtonDemo-acknowledgements.markdown"; sourceTree = ""; }; 56 | 92FFFACF64BE180C06845D5FFD5FD753 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 57 | 9A934AC70FD41BFADCF9901A656D8F8C /* Pods-SSSwiftUISpinnerButtonDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SSSwiftUISpinnerButtonDemo-acknowledgements.plist"; sourceTree = ""; }; 58 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 59 | AF09B56010EDBB2763BB20CE783FB0C5 /* Pods-SSSwiftUISpinnerButtonDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SSSwiftUISpinnerButtonDemo.debug.xcconfig"; sourceTree = ""; }; 60 | B880073B82A47453243AFC670769862B /* Pods-SSSwiftUISpinnerButtonDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-SSSwiftUISpinnerButtonDemo-dummy.m"; sourceTree = ""; }; 61 | BCF3C98459DC7C79BA4FF4E7C79028B1 /* Pods-SSSwiftUISpinnerButtonDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SSSwiftUISpinnerButtonDemo.release.xcconfig"; sourceTree = ""; }; 62 | C43A0634462B0D75D9D102F2B495B1F1 /* Pods-SSSwiftUISpinnerButtonDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-SSSwiftUISpinnerButtonDemo-umbrella.h"; sourceTree = ""; }; 63 | C6289E9FA35294F1359B92D5EF1E9C89 /* SSSwiftUISpinnerButton.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = SSSwiftUISpinnerButton.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 64 | E5014E674D41833C1D428CA893CB7072 /* SpinnerButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SpinnerButton.swift; path = Sources/SSSwiftUISpinnerButton/SpinnerButton.swift; sourceTree = ""; }; 65 | F917AFA2D13F90426C3AC6D77AECB987 /* Pods-SSSwiftUISpinnerButtonDemo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-SSSwiftUISpinnerButtonDemo.modulemap"; sourceTree = ""; }; 66 | /* End PBXFileReference section */ 67 | 68 | /* Begin PBXFrameworksBuildPhase section */ 69 | 168E08FB7AD3E8AB967DCAAAAE683AE1 /* Frameworks */ = { 70 | isa = PBXFrameworksBuildPhase; 71 | buildActionMask = 2147483647; 72 | files = ( 73 | B39098035928BB870C4117F59B4D20D3 /* Foundation.framework in Frameworks */, 74 | ); 75 | runOnlyForDeploymentPostprocessing = 0; 76 | }; 77 | 383A853EB02D340AD4B8158909598770 /* Frameworks */ = { 78 | isa = PBXFrameworksBuildPhase; 79 | buildActionMask = 2147483647; 80 | files = ( 81 | 1CA7FE270EE7AB3BB8EF93B960B09935 /* Foundation.framework in Frameworks */, 82 | ); 83 | runOnlyForDeploymentPostprocessing = 0; 84 | }; 85 | /* End PBXFrameworksBuildPhase section */ 86 | 87 | /* Begin PBXGroup section */ 88 | 0C020D4B8DF162F66872A936A508ACD1 /* Pods-SSSwiftUISpinnerButtonDemo */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | F917AFA2D13F90426C3AC6D77AECB987 /* Pods-SSSwiftUISpinnerButtonDemo.modulemap */, 92 | 886263A340320201DA7E2AFA0D8715A3 /* Pods-SSSwiftUISpinnerButtonDemo-acknowledgements.markdown */, 93 | 9A934AC70FD41BFADCF9901A656D8F8C /* Pods-SSSwiftUISpinnerButtonDemo-acknowledgements.plist */, 94 | B880073B82A47453243AFC670769862B /* Pods-SSSwiftUISpinnerButtonDemo-dummy.m */, 95 | 5CC60E4E0EDFB187DC6F3B8AAADE0B49 /* Pods-SSSwiftUISpinnerButtonDemo-frameworks.sh */, 96 | 06F98A67C2088AD1D5F34A1120140FF8 /* Pods-SSSwiftUISpinnerButtonDemo-Info.plist */, 97 | C43A0634462B0D75D9D102F2B495B1F1 /* Pods-SSSwiftUISpinnerButtonDemo-umbrella.h */, 98 | AF09B56010EDBB2763BB20CE783FB0C5 /* Pods-SSSwiftUISpinnerButtonDemo.debug.xcconfig */, 99 | BCF3C98459DC7C79BA4FF4E7C79028B1 /* Pods-SSSwiftUISpinnerButtonDemo.release.xcconfig */, 100 | ); 101 | name = "Pods-SSSwiftUISpinnerButtonDemo"; 102 | path = "Target Support Files/Pods-SSSwiftUISpinnerButtonDemo"; 103 | sourceTree = ""; 104 | }; 105 | 2F2FE7A5521A276E499EEDCC6CFC4EC8 /* Development Pods */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 9AEFF512E6D0070947C70F110FACDAB9 /* SSSwiftUISpinnerButton */, 109 | ); 110 | name = "Development Pods"; 111 | sourceTree = ""; 112 | }; 113 | 453C68C99D37F3F31F58ACB070F7AD8A /* SpinnerButtonAnimationStyle */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 48D9712B60491F910AC2CD02BE37CA92 /* ArcsRotateChaseAnimation.swift */, 117 | 6FC0556FDD13070815C62F0D9933B69D /* BallRotateFadeAnimation.swift */, 118 | 5F8B1F0D8BBA4F7EE3655E8BEBB1DFDF /* BallSpinChaseAnimation.swift */, 119 | 40D80250BFD2FA1BB2084C20D34C297D /* LineSpinFadeAnimation.swift */, 120 | ); 121 | name = SpinnerButtonAnimationStyle; 122 | path = Sources/SSSwiftUISpinnerButton/SpinnerButtonAnimationStyle; 123 | sourceTree = ""; 124 | }; 125 | 46DD3909B1C6867932F74D80CA09E157 /* Pod */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | 21F8970714B8EB78415A44FDFFD894EE /* LICENSE */, 129 | 92FFFACF64BE180C06845D5FFD5FD753 /* README.md */, 130 | C6289E9FA35294F1359B92D5EF1E9C89 /* SSSwiftUISpinnerButton.podspec */, 131 | ); 132 | name = Pod; 133 | sourceTree = ""; 134 | }; 135 | 578452D2E740E91742655AC8F1636D1F /* iOS */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, 139 | ); 140 | name = iOS; 141 | sourceTree = ""; 142 | }; 143 | 9AEFF512E6D0070947C70F110FACDAB9 /* SSSwiftUISpinnerButton */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | E5014E674D41833C1D428CA893CB7072 /* SpinnerButton.swift */, 147 | 4E99EC64F3AD978A5DC3767CD86B8BBC /* SpinnerButtonAnimationView.swift */, 148 | 23BBDB66D3A953CB43C6EFECCEB30844 /* SpinnerButtonViewStyle.swift */, 149 | 46DD3909B1C6867932F74D80CA09E157 /* Pod */, 150 | 453C68C99D37F3F31F58ACB070F7AD8A /* SpinnerButtonAnimationStyle */, 151 | C24EBCBB2156BA40EA66C32FA630B3EF /* Support Files */, 152 | ); 153 | name = SSSwiftUISpinnerButton; 154 | path = ../..; 155 | sourceTree = ""; 156 | }; 157 | C0CC15797B9A3382DFAED9669424FB13 /* Products */ = { 158 | isa = PBXGroup; 159 | children = ( 160 | 68AB613917D4C1E19C8B7219FAB7824C /* Pods_SSSwiftUISpinnerButtonDemo.framework */, 161 | 457F0608AE83D6F5BF621805EE06C2AE /* SSSwiftUISpinnerButton.framework */, 162 | ); 163 | name = Products; 164 | sourceTree = ""; 165 | }; 166 | C24EBCBB2156BA40EA66C32FA630B3EF /* Support Files */ = { 167 | isa = PBXGroup; 168 | children = ( 169 | 3C35F0C0D79DAF8E23130BBC477F3740 /* SSSwiftUISpinnerButton.modulemap */, 170 | 1D72B62FC9FC70DC4EC9B051ADC6C66A /* SSSwiftUISpinnerButton-dummy.m */, 171 | 20E100DCCE017276266DF9DBFD6178B8 /* SSSwiftUISpinnerButton-Info.plist */, 172 | 23A54CBE2B45004E7F1BF3B65BFD5F4B /* SSSwiftUISpinnerButton-prefix.pch */, 173 | 638BB588EDBB08D5AFD1958D1AEBAF9A /* SSSwiftUISpinnerButton-umbrella.h */, 174 | 875DCED9B5D4F113BEFF40D786E69D02 /* SSSwiftUISpinnerButton.debug.xcconfig */, 175 | 4BCCD93B4EAE75D850BECF072CF1F065 /* SSSwiftUISpinnerButton.release.xcconfig */, 176 | ); 177 | name = "Support Files"; 178 | path = "Example/Pods/Target Support Files/SSSwiftUISpinnerButton"; 179 | sourceTree = ""; 180 | }; 181 | CEB52D895399B1FA7F06DDFF70AB2EA4 /* Targets Support Files */ = { 182 | isa = PBXGroup; 183 | children = ( 184 | 0C020D4B8DF162F66872A936A508ACD1 /* Pods-SSSwiftUISpinnerButtonDemo */, 185 | ); 186 | name = "Targets Support Files"; 187 | sourceTree = ""; 188 | }; 189 | CF1408CF629C7361332E53B88F7BD30C = { 190 | isa = PBXGroup; 191 | children = ( 192 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 193 | 2F2FE7A5521A276E499EEDCC6CFC4EC8 /* Development Pods */, 194 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, 195 | C0CC15797B9A3382DFAED9669424FB13 /* Products */, 196 | CEB52D895399B1FA7F06DDFF70AB2EA4 /* Targets Support Files */, 197 | ); 198 | sourceTree = ""; 199 | }; 200 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { 201 | isa = PBXGroup; 202 | children = ( 203 | 578452D2E740E91742655AC8F1636D1F /* iOS */, 204 | ); 205 | name = Frameworks; 206 | sourceTree = ""; 207 | }; 208 | /* End PBXGroup section */ 209 | 210 | /* Begin PBXHeadersBuildPhase section */ 211 | 6C02734DBEDBA2CB3B917F165C11AAD1 /* Headers */ = { 212 | isa = PBXHeadersBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | A311B480923931DC744EBB27C7B31313 /* SSSwiftUISpinnerButton-umbrella.h in Headers */, 216 | ); 217 | runOnlyForDeploymentPostprocessing = 0; 218 | }; 219 | B5B902A833490679F1B7F7AE35314CA3 /* Headers */ = { 220 | isa = PBXHeadersBuildPhase; 221 | buildActionMask = 2147483647; 222 | files = ( 223 | B44D9EE8797DE058D317B9B27DEB09CC /* Pods-SSSwiftUISpinnerButtonDemo-umbrella.h in Headers */, 224 | ); 225 | runOnlyForDeploymentPostprocessing = 0; 226 | }; 227 | /* End PBXHeadersBuildPhase section */ 228 | 229 | /* Begin PBXNativeTarget section */ 230 | AC9F0D1F55E9380DB94198699F0659FD /* SSSwiftUISpinnerButton */ = { 231 | isa = PBXNativeTarget; 232 | buildConfigurationList = ED6B977F49BC3E2F0E3916A55F2569FF /* Build configuration list for PBXNativeTarget "SSSwiftUISpinnerButton" */; 233 | buildPhases = ( 234 | 6C02734DBEDBA2CB3B917F165C11AAD1 /* Headers */, 235 | F7903348CD139E0565D48F7A79D4F51D /* Sources */, 236 | 168E08FB7AD3E8AB967DCAAAAE683AE1 /* Frameworks */, 237 | 981D934DCF0AADFC1D83225284EC4219 /* Resources */, 238 | ); 239 | buildRules = ( 240 | ); 241 | dependencies = ( 242 | ); 243 | name = SSSwiftUISpinnerButton; 244 | productName = SSSwiftUISpinnerButton; 245 | productReference = 457F0608AE83D6F5BF621805EE06C2AE /* SSSwiftUISpinnerButton.framework */; 246 | productType = "com.apple.product-type.framework"; 247 | }; 248 | CE6325BC9B07C519E6FB27657FB630E3 /* Pods-SSSwiftUISpinnerButtonDemo */ = { 249 | isa = PBXNativeTarget; 250 | buildConfigurationList = 994F47F3D652905DDE93E1D9FB084C48 /* Build configuration list for PBXNativeTarget "Pods-SSSwiftUISpinnerButtonDemo" */; 251 | buildPhases = ( 252 | B5B902A833490679F1B7F7AE35314CA3 /* Headers */, 253 | 5923284B0E19F77EBBFAEFAA210BD8F2 /* Sources */, 254 | 383A853EB02D340AD4B8158909598770 /* Frameworks */, 255 | 3A945A826022F7CF2FFFB8B63E325999 /* Resources */, 256 | ); 257 | buildRules = ( 258 | ); 259 | dependencies = ( 260 | 9B0BB1D398921A0247583F6C4FB355A9 /* PBXTargetDependency */, 261 | ); 262 | name = "Pods-SSSwiftUISpinnerButtonDemo"; 263 | productName = "Pods-SSSwiftUISpinnerButtonDemo"; 264 | productReference = 68AB613917D4C1E19C8B7219FAB7824C /* Pods_SSSwiftUISpinnerButtonDemo.framework */; 265 | productType = "com.apple.product-type.framework"; 266 | }; 267 | /* End PBXNativeTarget section */ 268 | 269 | /* Begin PBXProject section */ 270 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 271 | isa = PBXProject; 272 | attributes = { 273 | LastSwiftUpdateCheck = 1100; 274 | LastUpgradeCheck = 1100; 275 | }; 276 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 277 | compatibilityVersion = "Xcode 10.0"; 278 | developmentRegion = en; 279 | hasScannedForEncodings = 0; 280 | knownRegions = ( 281 | en, 282 | Base, 283 | ); 284 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 285 | productRefGroup = C0CC15797B9A3382DFAED9669424FB13 /* Products */; 286 | projectDirPath = ""; 287 | projectRoot = ""; 288 | targets = ( 289 | CE6325BC9B07C519E6FB27657FB630E3 /* Pods-SSSwiftUISpinnerButtonDemo */, 290 | AC9F0D1F55E9380DB94198699F0659FD /* SSSwiftUISpinnerButton */, 291 | ); 292 | }; 293 | /* End PBXProject section */ 294 | 295 | /* Begin PBXResourcesBuildPhase section */ 296 | 3A945A826022F7CF2FFFB8B63E325999 /* Resources */ = { 297 | isa = PBXResourcesBuildPhase; 298 | buildActionMask = 2147483647; 299 | files = ( 300 | ); 301 | runOnlyForDeploymentPostprocessing = 0; 302 | }; 303 | 981D934DCF0AADFC1D83225284EC4219 /* Resources */ = { 304 | isa = PBXResourcesBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | ); 308 | runOnlyForDeploymentPostprocessing = 0; 309 | }; 310 | /* End PBXResourcesBuildPhase section */ 311 | 312 | /* Begin PBXSourcesBuildPhase section */ 313 | 5923284B0E19F77EBBFAEFAA210BD8F2 /* Sources */ = { 314 | isa = PBXSourcesBuildPhase; 315 | buildActionMask = 2147483647; 316 | files = ( 317 | DA60344EEB6E29D7A5AD489D0185958D /* Pods-SSSwiftUISpinnerButtonDemo-dummy.m in Sources */, 318 | ); 319 | runOnlyForDeploymentPostprocessing = 0; 320 | }; 321 | F7903348CD139E0565D48F7A79D4F51D /* Sources */ = { 322 | isa = PBXSourcesBuildPhase; 323 | buildActionMask = 2147483647; 324 | files = ( 325 | C25D65A9EAD72E9B55F9B3A64A67E13B /* ArcsRotateChaseAnimation.swift in Sources */, 326 | 28497D1CB9006BBE28F13BF2F5BC1F7B /* BallRotateFadeAnimation.swift in Sources */, 327 | 17171DF024650A170FB16827056F1641 /* BallSpinChaseAnimation.swift in Sources */, 328 | CE6E682A6D7FE94DB9406BD3C8384145 /* LineSpinFadeAnimation.swift in Sources */, 329 | 733BD72A392B56C1B9E9AA5E6AF41267 /* SpinnerButton.swift in Sources */, 330 | C03B5E462B296241297AA120FE927224 /* SpinnerButtonAnimationView.swift in Sources */, 331 | 7CC1478F67D30393EDDB89B261E94525 /* SpinnerButtonViewStyle.swift in Sources */, 332 | 32ED36F6CD7EA11C9AF0DE99C722E7C4 /* SSSwiftUISpinnerButton-dummy.m in Sources */, 333 | ); 334 | runOnlyForDeploymentPostprocessing = 0; 335 | }; 336 | /* End PBXSourcesBuildPhase section */ 337 | 338 | /* Begin PBXTargetDependency section */ 339 | 9B0BB1D398921A0247583F6C4FB355A9 /* PBXTargetDependency */ = { 340 | isa = PBXTargetDependency; 341 | name = SSSwiftUISpinnerButton; 342 | target = AC9F0D1F55E9380DB94198699F0659FD /* SSSwiftUISpinnerButton */; 343 | targetProxy = F8C6F145A57D3FB8206BC02568BEEE29 /* PBXContainerItemProxy */; 344 | }; 345 | /* End PBXTargetDependency section */ 346 | 347 | /* Begin XCBuildConfiguration section */ 348 | 0375DD6B939103092E8E61A90D99C798 /* Release */ = { 349 | isa = XCBuildConfiguration; 350 | baseConfigurationReference = BCF3C98459DC7C79BA4FF4E7C79028B1 /* Pods-SSSwiftUISpinnerButtonDemo.release.xcconfig */; 351 | buildSettings = { 352 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 353 | CLANG_ENABLE_OBJC_WEAK = NO; 354 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 355 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 356 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 357 | CURRENT_PROJECT_VERSION = 1; 358 | DEFINES_MODULE = YES; 359 | DYLIB_COMPATIBILITY_VERSION = 1; 360 | DYLIB_CURRENT_VERSION = 1; 361 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 362 | INFOPLIST_FILE = "Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-Info.plist"; 363 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 364 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 365 | LD_RUNPATH_SEARCH_PATHS = ( 366 | "$(inherited)", 367 | "@executable_path/Frameworks", 368 | "@loader_path/Frameworks", 369 | ); 370 | MACH_O_TYPE = staticlib; 371 | MODULEMAP_FILE = "Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo.modulemap"; 372 | OTHER_LDFLAGS = ""; 373 | OTHER_LIBTOOLFLAGS = ""; 374 | PODS_ROOT = "$(SRCROOT)"; 375 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 376 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 377 | SDKROOT = iphoneos; 378 | SKIP_INSTALL = YES; 379 | TARGETED_DEVICE_FAMILY = "1,2"; 380 | VALIDATE_PRODUCT = YES; 381 | VERSIONING_SYSTEM = "apple-generic"; 382 | VERSION_INFO_PREFIX = ""; 383 | }; 384 | name = Release; 385 | }; 386 | 6AC9ED9172F6A08E24EBC2B26DEDCAEC /* Debug */ = { 387 | isa = XCBuildConfiguration; 388 | baseConfigurationReference = 875DCED9B5D4F113BEFF40D786E69D02 /* SSSwiftUISpinnerButton.debug.xcconfig */; 389 | buildSettings = { 390 | CLANG_ENABLE_OBJC_WEAK = NO; 391 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 392 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 393 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 394 | CURRENT_PROJECT_VERSION = 1; 395 | DEFINES_MODULE = YES; 396 | DYLIB_COMPATIBILITY_VERSION = 1; 397 | DYLIB_CURRENT_VERSION = 1; 398 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 399 | GCC_PREFIX_HEADER = "Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton-prefix.pch"; 400 | INFOPLIST_FILE = "Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton-Info.plist"; 401 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 402 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 403 | LD_RUNPATH_SEARCH_PATHS = ( 404 | "$(inherited)", 405 | "@executable_path/Frameworks", 406 | "@loader_path/Frameworks", 407 | ); 408 | MODULEMAP_FILE = "Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton.modulemap"; 409 | PRODUCT_MODULE_NAME = SSSwiftUISpinnerButton; 410 | PRODUCT_NAME = SSSwiftUISpinnerButton; 411 | SDKROOT = iphoneos; 412 | SKIP_INSTALL = YES; 413 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 414 | SWIFT_VERSION = 5.0; 415 | TARGETED_DEVICE_FAMILY = "1,2"; 416 | VERSIONING_SYSTEM = "apple-generic"; 417 | VERSION_INFO_PREFIX = ""; 418 | }; 419 | name = Debug; 420 | }; 421 | 8DE5143C03248BB6CD542DE3963D6F3A /* Debug */ = { 422 | isa = XCBuildConfiguration; 423 | buildSettings = { 424 | ALWAYS_SEARCH_USER_PATHS = NO; 425 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 426 | CLANG_ANALYZER_NONNULL = YES; 427 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 428 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 429 | CLANG_CXX_LIBRARY = "libc++"; 430 | CLANG_ENABLE_MODULES = YES; 431 | CLANG_ENABLE_OBJC_ARC = YES; 432 | CLANG_ENABLE_OBJC_WEAK = YES; 433 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 434 | CLANG_WARN_BOOL_CONVERSION = YES; 435 | CLANG_WARN_COMMA = YES; 436 | CLANG_WARN_CONSTANT_CONVERSION = YES; 437 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 438 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 439 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 440 | CLANG_WARN_EMPTY_BODY = YES; 441 | CLANG_WARN_ENUM_CONVERSION = YES; 442 | CLANG_WARN_INFINITE_RECURSION = YES; 443 | CLANG_WARN_INT_CONVERSION = YES; 444 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 445 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 446 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 447 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 448 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 449 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 450 | CLANG_WARN_STRICT_PROTOTYPES = YES; 451 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 452 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 453 | CLANG_WARN_UNREACHABLE_CODE = YES; 454 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 455 | COPY_PHASE_STRIP = NO; 456 | DEBUG_INFORMATION_FORMAT = dwarf; 457 | ENABLE_STRICT_OBJC_MSGSEND = YES; 458 | ENABLE_TESTABILITY = YES; 459 | GCC_C_LANGUAGE_STANDARD = gnu11; 460 | GCC_DYNAMIC_NO_PIC = NO; 461 | GCC_NO_COMMON_BLOCKS = YES; 462 | GCC_OPTIMIZATION_LEVEL = 0; 463 | GCC_PREPROCESSOR_DEFINITIONS = ( 464 | "POD_CONFIGURATION_DEBUG=1", 465 | "DEBUG=1", 466 | "$(inherited)", 467 | ); 468 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 469 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 470 | GCC_WARN_UNDECLARED_SELECTOR = YES; 471 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 472 | GCC_WARN_UNUSED_FUNCTION = YES; 473 | GCC_WARN_UNUSED_VARIABLE = YES; 474 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 475 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 476 | MTL_FAST_MATH = YES; 477 | ONLY_ACTIVE_ARCH = YES; 478 | PRODUCT_NAME = "$(TARGET_NAME)"; 479 | STRIP_INSTALLED_PRODUCT = NO; 480 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 481 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 482 | SWIFT_VERSION = 5.0; 483 | SYMROOT = "${SRCROOT}/../build"; 484 | }; 485 | name = Debug; 486 | }; 487 | 9E406C6AAF85E580207CD97B0044DEAB /* Release */ = { 488 | isa = XCBuildConfiguration; 489 | buildSettings = { 490 | ALWAYS_SEARCH_USER_PATHS = NO; 491 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 492 | CLANG_ANALYZER_NONNULL = YES; 493 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 494 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 495 | CLANG_CXX_LIBRARY = "libc++"; 496 | CLANG_ENABLE_MODULES = YES; 497 | CLANG_ENABLE_OBJC_ARC = YES; 498 | CLANG_ENABLE_OBJC_WEAK = YES; 499 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 500 | CLANG_WARN_BOOL_CONVERSION = YES; 501 | CLANG_WARN_COMMA = YES; 502 | CLANG_WARN_CONSTANT_CONVERSION = YES; 503 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 504 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 505 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 506 | CLANG_WARN_EMPTY_BODY = YES; 507 | CLANG_WARN_ENUM_CONVERSION = YES; 508 | CLANG_WARN_INFINITE_RECURSION = YES; 509 | CLANG_WARN_INT_CONVERSION = YES; 510 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 511 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 512 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 513 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 514 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 515 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 516 | CLANG_WARN_STRICT_PROTOTYPES = YES; 517 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 518 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 519 | CLANG_WARN_UNREACHABLE_CODE = YES; 520 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 521 | COPY_PHASE_STRIP = NO; 522 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 523 | ENABLE_NS_ASSERTIONS = NO; 524 | ENABLE_STRICT_OBJC_MSGSEND = YES; 525 | GCC_C_LANGUAGE_STANDARD = gnu11; 526 | GCC_NO_COMMON_BLOCKS = YES; 527 | GCC_PREPROCESSOR_DEFINITIONS = ( 528 | "POD_CONFIGURATION_RELEASE=1", 529 | "$(inherited)", 530 | ); 531 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 532 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 533 | GCC_WARN_UNDECLARED_SELECTOR = YES; 534 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 535 | GCC_WARN_UNUSED_FUNCTION = YES; 536 | GCC_WARN_UNUSED_VARIABLE = YES; 537 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 538 | MTL_ENABLE_DEBUG_INFO = NO; 539 | MTL_FAST_MATH = YES; 540 | PRODUCT_NAME = "$(TARGET_NAME)"; 541 | STRIP_INSTALLED_PRODUCT = NO; 542 | SWIFT_COMPILATION_MODE = wholemodule; 543 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 544 | SWIFT_VERSION = 5.0; 545 | SYMROOT = "${SRCROOT}/../build"; 546 | }; 547 | name = Release; 548 | }; 549 | C5E1DB6CA5F1551E9075E54CDC8D81C4 /* Debug */ = { 550 | isa = XCBuildConfiguration; 551 | baseConfigurationReference = AF09B56010EDBB2763BB20CE783FB0C5 /* Pods-SSSwiftUISpinnerButtonDemo.debug.xcconfig */; 552 | buildSettings = { 553 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 554 | CLANG_ENABLE_OBJC_WEAK = NO; 555 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 556 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 557 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 558 | CURRENT_PROJECT_VERSION = 1; 559 | DEFINES_MODULE = YES; 560 | DYLIB_COMPATIBILITY_VERSION = 1; 561 | DYLIB_CURRENT_VERSION = 1; 562 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 563 | INFOPLIST_FILE = "Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-Info.plist"; 564 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 565 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 566 | LD_RUNPATH_SEARCH_PATHS = ( 567 | "$(inherited)", 568 | "@executable_path/Frameworks", 569 | "@loader_path/Frameworks", 570 | ); 571 | MACH_O_TYPE = staticlib; 572 | MODULEMAP_FILE = "Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo.modulemap"; 573 | OTHER_LDFLAGS = ""; 574 | OTHER_LIBTOOLFLAGS = ""; 575 | PODS_ROOT = "$(SRCROOT)"; 576 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 577 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 578 | SDKROOT = iphoneos; 579 | SKIP_INSTALL = YES; 580 | TARGETED_DEVICE_FAMILY = "1,2"; 581 | VERSIONING_SYSTEM = "apple-generic"; 582 | VERSION_INFO_PREFIX = ""; 583 | }; 584 | name = Debug; 585 | }; 586 | D7920D3FFA7E645B5D9BF8E22E7F94BA /* Release */ = { 587 | isa = XCBuildConfiguration; 588 | baseConfigurationReference = 4BCCD93B4EAE75D850BECF072CF1F065 /* SSSwiftUISpinnerButton.release.xcconfig */; 589 | buildSettings = { 590 | CLANG_ENABLE_OBJC_WEAK = NO; 591 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 592 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 593 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 594 | CURRENT_PROJECT_VERSION = 1; 595 | DEFINES_MODULE = YES; 596 | DYLIB_COMPATIBILITY_VERSION = 1; 597 | DYLIB_CURRENT_VERSION = 1; 598 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 599 | GCC_PREFIX_HEADER = "Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton-prefix.pch"; 600 | INFOPLIST_FILE = "Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton-Info.plist"; 601 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 602 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 603 | LD_RUNPATH_SEARCH_PATHS = ( 604 | "$(inherited)", 605 | "@executable_path/Frameworks", 606 | "@loader_path/Frameworks", 607 | ); 608 | MODULEMAP_FILE = "Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton.modulemap"; 609 | PRODUCT_MODULE_NAME = SSSwiftUISpinnerButton; 610 | PRODUCT_NAME = SSSwiftUISpinnerButton; 611 | SDKROOT = iphoneos; 612 | SKIP_INSTALL = YES; 613 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 614 | SWIFT_VERSION = 5.0; 615 | TARGETED_DEVICE_FAMILY = "1,2"; 616 | VALIDATE_PRODUCT = YES; 617 | VERSIONING_SYSTEM = "apple-generic"; 618 | VERSION_INFO_PREFIX = ""; 619 | }; 620 | name = Release; 621 | }; 622 | /* End XCBuildConfiguration section */ 623 | 624 | /* Begin XCConfigurationList section */ 625 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 626 | isa = XCConfigurationList; 627 | buildConfigurations = ( 628 | 8DE5143C03248BB6CD542DE3963D6F3A /* Debug */, 629 | 9E406C6AAF85E580207CD97B0044DEAB /* Release */, 630 | ); 631 | defaultConfigurationIsVisible = 0; 632 | defaultConfigurationName = Release; 633 | }; 634 | 994F47F3D652905DDE93E1D9FB084C48 /* Build configuration list for PBXNativeTarget "Pods-SSSwiftUISpinnerButtonDemo" */ = { 635 | isa = XCConfigurationList; 636 | buildConfigurations = ( 637 | C5E1DB6CA5F1551E9075E54CDC8D81C4 /* Debug */, 638 | 0375DD6B939103092E8E61A90D99C798 /* Release */, 639 | ); 640 | defaultConfigurationIsVisible = 0; 641 | defaultConfigurationName = Release; 642 | }; 643 | ED6B977F49BC3E2F0E3916A55F2569FF /* Build configuration list for PBXNativeTarget "SSSwiftUISpinnerButton" */ = { 644 | isa = XCConfigurationList; 645 | buildConfigurations = ( 646 | 6AC9ED9172F6A08E24EBC2B26DEDCAEC /* Debug */, 647 | D7920D3FFA7E645B5D9BF8E22E7F94BA /* Release */, 648 | ); 649 | defaultConfigurationIsVisible = 0; 650 | defaultConfigurationName = Release; 651 | }; 652 | /* End XCConfigurationList section */ 653 | }; 654 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 655 | } 656 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## SSSwiftUISpinnerButton 5 | 6 | MIT License 7 | 8 | Copyright (c) 2020 Simform Solutions 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | Generated by CocoaPods - https://cocoapods.org 29 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | MIT License 18 | 19 | Copyright (c) 2020 Simform Solutions 20 | 21 | Permission is hereby granted, free of charge, to any person obtaining a copy 22 | of this software and associated documentation files (the "Software"), to deal 23 | in the Software without restriction, including without limitation the rights 24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 25 | copies of the Software, and to permit persons to whom the Software is 26 | furnished to do so, subject to the following conditions: 27 | 28 | The above copyright notice and this permission notice shall be included in all 29 | copies or substantial portions of the Software. 30 | 31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 37 | SOFTWARE. 38 | 39 | License 40 | MIT 41 | Title 42 | SSSwiftUISpinnerButton 43 | Type 44 | PSGroupSpecifier 45 | 46 | 47 | FooterText 48 | Generated by CocoaPods - https://cocoapods.org 49 | Title 50 | 51 | Type 52 | PSGroupSpecifier 53 | 54 | 55 | StringsTable 56 | Acknowledgements 57 | Title 58 | Acknowledgements 59 | 60 | 61 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_SSSwiftUISpinnerButtonDemo : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_SSSwiftUISpinnerButtonDemo 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-frameworks-Debug-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton.framework -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-frameworks-Debug-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SSSwiftUISpinnerButton.framework -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-frameworks-Release-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton.framework -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-frameworks-Release-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SSSwiftUISpinnerButton.framework -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | BCSYMBOLMAP_DIR="BCSymbolMaps" 23 | 24 | 25 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 26 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 27 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 28 | 29 | # Copies and strips a vendored framework 30 | install_framework() 31 | { 32 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 33 | local source="${BUILT_PRODUCTS_DIR}/$1" 34 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 35 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 36 | elif [ -r "$1" ]; then 37 | local source="$1" 38 | fi 39 | 40 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 41 | 42 | if [ -L "${source}" ]; then 43 | echo "Symlinked..." 44 | source="$(readlink "${source}")" 45 | fi 46 | 47 | if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then 48 | # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied 49 | find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do 50 | echo "Installing $f" 51 | install_bcsymbolmap "$f" "$destination" 52 | rm "$f" 53 | done 54 | rmdir "${source}/${BCSYMBOLMAP_DIR}" 55 | fi 56 | 57 | # Use filter instead of exclude so missing patterns don't throw errors. 58 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 59 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 60 | 61 | local basename 62 | basename="$(basename -s .framework "$1")" 63 | binary="${destination}/${basename}.framework/${basename}" 64 | 65 | if ! [ -r "$binary" ]; then 66 | binary="${destination}/${basename}" 67 | elif [ -L "${binary}" ]; then 68 | echo "Destination binary is symlinked..." 69 | dirname="$(dirname "${binary}")" 70 | binary="${dirname}/$(readlink "${binary}")" 71 | fi 72 | 73 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 74 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 75 | strip_invalid_archs "$binary" 76 | fi 77 | 78 | # Resign the code if required by the build settings to avoid unstable apps 79 | code_sign_if_enabled "${destination}/$(basename "$1")" 80 | 81 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 82 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 83 | local swift_runtime_libs 84 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 85 | for lib in $swift_runtime_libs; do 86 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 87 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 88 | code_sign_if_enabled "${destination}/${lib}" 89 | done 90 | fi 91 | } 92 | # Copies and strips a vendored dSYM 93 | install_dsym() { 94 | local source="$1" 95 | warn_missing_arch=${2:-true} 96 | if [ -r "$source" ]; then 97 | # Copy the dSYM into the targets temp dir. 98 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 99 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 100 | 101 | local basename 102 | basename="$(basename -s .dSYM "$source")" 103 | binary_name="$(ls "$source/Contents/Resources/DWARF")" 104 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" 105 | 106 | # Strip invalid architectures from the dSYM. 107 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 108 | strip_invalid_archs "$binary" "$warn_missing_arch" 109 | fi 110 | if [[ $STRIP_BINARY_RETVAL == 0 ]]; then 111 | # Move the stripped file into its final destination. 112 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 113 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 114 | else 115 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 116 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" 117 | fi 118 | fi 119 | } 120 | 121 | # Used as a return value for each invocation of `strip_invalid_archs` function. 122 | STRIP_BINARY_RETVAL=0 123 | 124 | # Strip invalid architectures 125 | strip_invalid_archs() { 126 | binary="$1" 127 | warn_missing_arch=${2:-true} 128 | # Get architectures for current target binary 129 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 130 | # Intersect them with the architectures we are building for 131 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 132 | # If there are no archs supported by this binary then warn the user 133 | if [[ -z "$intersected_archs" ]]; then 134 | if [[ "$warn_missing_arch" == "true" ]]; then 135 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 136 | fi 137 | STRIP_BINARY_RETVAL=1 138 | return 139 | fi 140 | stripped="" 141 | for arch in $binary_archs; do 142 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 143 | # Strip non-valid architectures in-place 144 | lipo -remove "$arch" -output "$binary" "$binary" 145 | stripped="$stripped $arch" 146 | fi 147 | done 148 | if [[ "$stripped" ]]; then 149 | echo "Stripped $binary of architectures:$stripped" 150 | fi 151 | STRIP_BINARY_RETVAL=0 152 | } 153 | 154 | # Copies the bcsymbolmap files of a vendored framework 155 | install_bcsymbolmap() { 156 | local bcsymbolmap_path="$1" 157 | local destination="${BUILT_PRODUCTS_DIR}" 158 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 159 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 160 | } 161 | 162 | # Signs a framework with the provided identity 163 | code_sign_if_enabled() { 164 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 165 | # Use the current code_sign_identity 166 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 167 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 168 | 169 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 170 | code_sign_cmd="$code_sign_cmd &" 171 | fi 172 | echo "$code_sign_cmd" 173 | eval "$code_sign_cmd" 174 | fi 175 | } 176 | 177 | if [[ "$CONFIGURATION" == "Debug" ]]; then 178 | install_framework "${BUILT_PRODUCTS_DIR}/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton.framework" 179 | fi 180 | if [[ "$CONFIGURATION" == "Release" ]]; then 181 | install_framework "${BUILT_PRODUCTS_DIR}/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton.framework" 182 | fi 183 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 184 | wait 185 | fi 186 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_SSSwiftUISpinnerButtonDemoVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_SSSwiftUISpinnerButtonDemoVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SSSwiftUISpinnerButton" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | OTHER_LDFLAGS = $(inherited) -framework "SSSwiftUISpinnerButton" 8 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 9 | PODS_BUILD_DIR = ${BUILD_DIR} 10 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 11 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 12 | PODS_ROOT = ${SRCROOT}/Pods 13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_SSSwiftUISpinnerButtonDemo { 2 | umbrella header "Pods-SSSwiftUISpinnerButtonDemo-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SSSwiftUISpinnerButton" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | OTHER_LDFLAGS = $(inherited) -framework "SSSwiftUISpinnerButton" 8 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 9 | PODS_BUILD_DIR = ${BUILD_DIR} 10 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 11 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 12 | PODS_ROOT = ${SRCROOT}/Pods 13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.0.2 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_SSSwiftUISpinnerButton : NSObject 3 | @end 4 | @implementation PodsDummy_SSSwiftUISpinnerButton 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double SSSwiftUISpinnerButtonVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char SSSwiftUISpinnerButtonVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SSSwiftUISpinnerButton 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 9 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | SKIP_INSTALL = YES 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton.modulemap: -------------------------------------------------------------------------------- 1 | framework module SSSwiftUISpinnerButton { 2 | umbrella header "SSSwiftUISpinnerButton-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SSSwiftUISpinnerButton/SSSwiftUISpinnerButton.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SSSwiftUISpinnerButton 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 9 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | SKIP_INSTALL = YES 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | AA2A4948268CC92B00189154 /* Color+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA2A4947268CC92A00189154 /* Color+Extension.swift */; }; 11 | AA2A494A268CC97400189154 /* Enumerations.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA2A4949268CC97400189154 /* Enumerations.swift */; }; 12 | AA8E91A1269303070093E989 /* SSSwiftUISpinnerButtonDemoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA8E91A0269303070093E989 /* SSSwiftUISpinnerButtonDemoApp.swift */; }; 13 | C2FE74BB25D6DABF005B5998 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2FE74BA25D6DABF005B5998 /* ContentView.swift */; }; 14 | C2FE74BD25D6DAC0005B5998 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C2FE74BC25D6DAC0005B5998 /* Assets.xcassets */; }; 15 | C2FE74C025D6DAC0005B5998 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C2FE74BF25D6DAC0005B5998 /* Preview Assets.xcassets */; }; 16 | E53D394C6CD8637BBDFC71C4 /* Pods_SSSwiftUISpinnerButtonDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8036AA54AAEF9380BCCDB59 /* Pods_SSSwiftUISpinnerButtonDemo.framework */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXCopyFilesBuildPhase section */ 20 | AAB82F19268B36A200C8FF49 /* Embed Frameworks */ = { 21 | isa = PBXCopyFilesBuildPhase; 22 | buildActionMask = 2147483647; 23 | dstPath = ""; 24 | dstSubfolderSpec = 10; 25 | files = ( 26 | ); 27 | name = "Embed Frameworks"; 28 | runOnlyForDeploymentPostprocessing = 0; 29 | }; 30 | /* End PBXCopyFilesBuildPhase section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 2263A54CD7E10CBF240C46E8 /* Pods-SSSwiftUISpinnerButton.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SSSwiftUISpinnerButton.debug.xcconfig"; path = "Target Support Files/Pods-SSSwiftUISpinnerButton/Pods-SSSwiftUISpinnerButton.debug.xcconfig"; sourceTree = ""; }; 34 | 65FD2CE938DA0A8244B162DB /* Pods-SSSwiftUISpinnerButtonDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SSSwiftUISpinnerButtonDemo.debug.xcconfig"; path = "Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo.debug.xcconfig"; sourceTree = ""; }; 35 | 739DFA407AD72206B563D10E /* Pods-SSSwiftUISpinnerButtonDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SSSwiftUISpinnerButtonDemo.release.xcconfig"; path = "Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo.release.xcconfig"; sourceTree = ""; }; 36 | AA2A4947268CC92A00189154 /* Color+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Extension.swift"; sourceTree = ""; }; 37 | AA2A4949268CC97400189154 /* Enumerations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Enumerations.swift; sourceTree = ""; }; 38 | AA8E91A0269303070093E989 /* SSSwiftUISpinnerButtonDemoApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSSwiftUISpinnerButtonDemoApp.swift; sourceTree = ""; }; 39 | B8036AA54AAEF9380BCCDB59 /* Pods_SSSwiftUISpinnerButtonDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SSSwiftUISpinnerButtonDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | BD949CFBFFC125D068BB1D1E /* Pods-SSSwiftUISpinnerButton.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SSSwiftUISpinnerButton.release.xcconfig"; path = "Target Support Files/Pods-SSSwiftUISpinnerButton/Pods-SSSwiftUISpinnerButton.release.xcconfig"; sourceTree = ""; }; 41 | C2FE74B525D6DABF005B5998 /* SSSwiftUISpinnerButtonDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SSSwiftUISpinnerButtonDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | C2FE74BA25D6DABF005B5998 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 43 | C2FE74BC25D6DAC0005B5998 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 44 | C2FE74BF25D6DAC0005B5998 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 45 | C2FE74C125D6DAC0005B5998 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 46 | /* End PBXFileReference section */ 47 | 48 | /* Begin PBXFrameworksBuildPhase section */ 49 | C2FE74B225D6DABF005B5998 /* Frameworks */ = { 50 | isa = PBXFrameworksBuildPhase; 51 | buildActionMask = 2147483647; 52 | files = ( 53 | E53D394C6CD8637BBDFC71C4 /* Pods_SSSwiftUISpinnerButtonDemo.framework in Frameworks */, 54 | ); 55 | runOnlyForDeploymentPostprocessing = 0; 56 | }; 57 | /* End PBXFrameworksBuildPhase section */ 58 | 59 | /* Begin PBXGroup section */ 60 | 12E81EB5142C31A175468F08 /* Pods */ = { 61 | isa = PBXGroup; 62 | children = ( 63 | 2263A54CD7E10CBF240C46E8 /* Pods-SSSwiftUISpinnerButton.debug.xcconfig */, 64 | BD949CFBFFC125D068BB1D1E /* Pods-SSSwiftUISpinnerButton.release.xcconfig */, 65 | 65FD2CE938DA0A8244B162DB /* Pods-SSSwiftUISpinnerButtonDemo.debug.xcconfig */, 66 | 739DFA407AD72206B563D10E /* Pods-SSSwiftUISpinnerButtonDemo.release.xcconfig */, 67 | ); 68 | path = Pods; 69 | sourceTree = ""; 70 | }; 71 | AA2A494B268CC97C00189154 /* HelperClass */ = { 72 | isa = PBXGroup; 73 | children = ( 74 | AA2A4947268CC92A00189154 /* Color+Extension.swift */, 75 | AA2A4949268CC97400189154 /* Enumerations.swift */, 76 | ); 77 | path = HelperClass; 78 | sourceTree = ""; 79 | }; 80 | B1E6CB95185E5528C39E2A54 /* Frameworks */ = { 81 | isa = PBXGroup; 82 | children = ( 83 | B8036AA54AAEF9380BCCDB59 /* Pods_SSSwiftUISpinnerButtonDemo.framework */, 84 | ); 85 | name = Frameworks; 86 | sourceTree = ""; 87 | }; 88 | C2FE74AC25D6DABF005B5998 = { 89 | isa = PBXGroup; 90 | children = ( 91 | C2FE74B725D6DABF005B5998 /* SSSwiftUISpinnerButtonDemo */, 92 | C2FE74B625D6DABF005B5998 /* Products */, 93 | 12E81EB5142C31A175468F08 /* Pods */, 94 | B1E6CB95185E5528C39E2A54 /* Frameworks */, 95 | ); 96 | sourceTree = ""; 97 | }; 98 | C2FE74B625D6DABF005B5998 /* Products */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | C2FE74B525D6DABF005B5998 /* SSSwiftUISpinnerButtonDemo.app */, 102 | ); 103 | name = Products; 104 | sourceTree = ""; 105 | }; 106 | C2FE74B725D6DABF005B5998 /* SSSwiftUISpinnerButtonDemo */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | AA2A494B268CC97C00189154 /* HelperClass */, 110 | C2FE74BA25D6DABF005B5998 /* ContentView.swift */, 111 | AA8E91A0269303070093E989 /* SSSwiftUISpinnerButtonDemoApp.swift */, 112 | C2FE74BC25D6DAC0005B5998 /* Assets.xcassets */, 113 | C2FE74C125D6DAC0005B5998 /* Info.plist */, 114 | C2FE74BE25D6DAC0005B5998 /* Preview Content */, 115 | ); 116 | path = SSSwiftUISpinnerButtonDemo; 117 | sourceTree = ""; 118 | }; 119 | C2FE74BE25D6DAC0005B5998 /* Preview Content */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | C2FE74BF25D6DAC0005B5998 /* Preview Assets.xcassets */, 123 | ); 124 | path = "Preview Content"; 125 | sourceTree = ""; 126 | }; 127 | /* End PBXGroup section */ 128 | 129 | /* Begin PBXNativeTarget section */ 130 | C2FE74B425D6DABF005B5998 /* SSSwiftUISpinnerButtonDemo */ = { 131 | isa = PBXNativeTarget; 132 | buildConfigurationList = C2FE74C425D6DAC0005B5998 /* Build configuration list for PBXNativeTarget "SSSwiftUISpinnerButtonDemo" */; 133 | buildPhases = ( 134 | 92918E7A2C8CB80D136B028D /* [CP] Check Pods Manifest.lock */, 135 | C2FE74B125D6DABF005B5998 /* Sources */, 136 | C2FE74B225D6DABF005B5998 /* Frameworks */, 137 | C2FE74B325D6DABF005B5998 /* Resources */, 138 | AAB82F19268B36A200C8FF49 /* Embed Frameworks */, 139 | B548ABCBFF48BBE0BDC65C30 /* [CP] Embed Pods Frameworks */, 140 | ); 141 | buildRules = ( 142 | ); 143 | dependencies = ( 144 | ); 145 | name = SSSwiftUISpinnerButtonDemo; 146 | productName = SSSwiftUISpinnerButton; 147 | productReference = C2FE74B525D6DABF005B5998 /* SSSwiftUISpinnerButtonDemo.app */; 148 | productType = "com.apple.product-type.application"; 149 | }; 150 | /* End PBXNativeTarget section */ 151 | 152 | /* Begin PBXProject section */ 153 | C2FE74AD25D6DABF005B5998 /* Project object */ = { 154 | isa = PBXProject; 155 | attributes = { 156 | LastSwiftUpdateCheck = 1220; 157 | LastUpgradeCheck = 1220; 158 | TargetAttributes = { 159 | C2FE74B425D6DABF005B5998 = { 160 | CreatedOnToolsVersion = 12.2; 161 | }; 162 | }; 163 | }; 164 | buildConfigurationList = C2FE74B025D6DABF005B5998 /* Build configuration list for PBXProject "SSSwiftUISpinnerButtonDemo" */; 165 | compatibilityVersion = "Xcode 9.3"; 166 | developmentRegion = en; 167 | hasScannedForEncodings = 0; 168 | knownRegions = ( 169 | en, 170 | Base, 171 | ); 172 | mainGroup = C2FE74AC25D6DABF005B5998; 173 | productRefGroup = C2FE74B625D6DABF005B5998 /* Products */; 174 | projectDirPath = ""; 175 | projectRoot = ""; 176 | targets = ( 177 | C2FE74B425D6DABF005B5998 /* SSSwiftUISpinnerButtonDemo */, 178 | ); 179 | }; 180 | /* End PBXProject section */ 181 | 182 | /* Begin PBXResourcesBuildPhase section */ 183 | C2FE74B325D6DABF005B5998 /* Resources */ = { 184 | isa = PBXResourcesBuildPhase; 185 | buildActionMask = 2147483647; 186 | files = ( 187 | C2FE74C025D6DAC0005B5998 /* Preview Assets.xcassets in Resources */, 188 | C2FE74BD25D6DAC0005B5998 /* Assets.xcassets in Resources */, 189 | ); 190 | runOnlyForDeploymentPostprocessing = 0; 191 | }; 192 | /* End PBXResourcesBuildPhase section */ 193 | 194 | /* Begin PBXShellScriptBuildPhase section */ 195 | 92918E7A2C8CB80D136B028D /* [CP] Check Pods Manifest.lock */ = { 196 | isa = PBXShellScriptBuildPhase; 197 | buildActionMask = 2147483647; 198 | files = ( 199 | ); 200 | inputFileListPaths = ( 201 | ); 202 | inputPaths = ( 203 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 204 | "${PODS_ROOT}/Manifest.lock", 205 | ); 206 | name = "[CP] Check Pods Manifest.lock"; 207 | outputFileListPaths = ( 208 | ); 209 | outputPaths = ( 210 | "$(DERIVED_FILE_DIR)/Pods-SSSwiftUISpinnerButtonDemo-checkManifestLockResult.txt", 211 | ); 212 | runOnlyForDeploymentPostprocessing = 0; 213 | shellPath = /bin/sh; 214 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 215 | showEnvVarsInLog = 0; 216 | }; 217 | B548ABCBFF48BBE0BDC65C30 /* [CP] Embed Pods Frameworks */ = { 218 | isa = PBXShellScriptBuildPhase; 219 | buildActionMask = 2147483647; 220 | files = ( 221 | ); 222 | inputFileListPaths = ( 223 | "${PODS_ROOT}/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-frameworks-${CONFIGURATION}-input-files.xcfilelist", 224 | ); 225 | name = "[CP] Embed Pods Frameworks"; 226 | outputFileListPaths = ( 227 | "${PODS_ROOT}/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-frameworks-${CONFIGURATION}-output-files.xcfilelist", 228 | ); 229 | runOnlyForDeploymentPostprocessing = 0; 230 | shellPath = /bin/sh; 231 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SSSwiftUISpinnerButtonDemo/Pods-SSSwiftUISpinnerButtonDemo-frameworks.sh\"\n"; 232 | showEnvVarsInLog = 0; 233 | }; 234 | /* End PBXShellScriptBuildPhase section */ 235 | 236 | /* Begin PBXSourcesBuildPhase section */ 237 | C2FE74B125D6DABF005B5998 /* Sources */ = { 238 | isa = PBXSourcesBuildPhase; 239 | buildActionMask = 2147483647; 240 | files = ( 241 | AA2A4948268CC92B00189154 /* Color+Extension.swift in Sources */, 242 | C2FE74BB25D6DABF005B5998 /* ContentView.swift in Sources */, 243 | AA2A494A268CC97400189154 /* Enumerations.swift in Sources */, 244 | AA8E91A1269303070093E989 /* SSSwiftUISpinnerButtonDemoApp.swift in Sources */, 245 | ); 246 | runOnlyForDeploymentPostprocessing = 0; 247 | }; 248 | /* End PBXSourcesBuildPhase section */ 249 | 250 | /* Begin XCBuildConfiguration section */ 251 | C2FE74C225D6DAC0005B5998 /* Debug */ = { 252 | isa = XCBuildConfiguration; 253 | buildSettings = { 254 | ALWAYS_SEARCH_USER_PATHS = NO; 255 | CLANG_ANALYZER_NONNULL = YES; 256 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 257 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 258 | CLANG_CXX_LIBRARY = "libc++"; 259 | CLANG_ENABLE_MODULES = YES; 260 | CLANG_ENABLE_OBJC_ARC = YES; 261 | CLANG_ENABLE_OBJC_WEAK = YES; 262 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 263 | CLANG_WARN_BOOL_CONVERSION = YES; 264 | CLANG_WARN_COMMA = YES; 265 | CLANG_WARN_CONSTANT_CONVERSION = YES; 266 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 267 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 268 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 269 | CLANG_WARN_EMPTY_BODY = YES; 270 | CLANG_WARN_ENUM_CONVERSION = YES; 271 | CLANG_WARN_INFINITE_RECURSION = YES; 272 | CLANG_WARN_INT_CONVERSION = YES; 273 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 274 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 275 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 276 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 277 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 278 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 279 | CLANG_WARN_STRICT_PROTOTYPES = YES; 280 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 281 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 282 | CLANG_WARN_UNREACHABLE_CODE = YES; 283 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 284 | COPY_PHASE_STRIP = NO; 285 | DEBUG_INFORMATION_FORMAT = dwarf; 286 | ENABLE_STRICT_OBJC_MSGSEND = YES; 287 | ENABLE_TESTABILITY = YES; 288 | GCC_C_LANGUAGE_STANDARD = gnu11; 289 | GCC_DYNAMIC_NO_PIC = NO; 290 | GCC_NO_COMMON_BLOCKS = YES; 291 | GCC_OPTIMIZATION_LEVEL = 0; 292 | GCC_PREPROCESSOR_DEFINITIONS = ( 293 | "DEBUG=1", 294 | "$(inherited)", 295 | ); 296 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 297 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 298 | GCC_WARN_UNDECLARED_SELECTOR = YES; 299 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 300 | GCC_WARN_UNUSED_FUNCTION = YES; 301 | GCC_WARN_UNUSED_VARIABLE = YES; 302 | IPHONEOS_DEPLOYMENT_TARGET = 14.2; 303 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 304 | MTL_FAST_MATH = YES; 305 | ONLY_ACTIVE_ARCH = YES; 306 | SDKROOT = iphoneos; 307 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 308 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 309 | }; 310 | name = Debug; 311 | }; 312 | C2FE74C325D6DAC0005B5998 /* Release */ = { 313 | isa = XCBuildConfiguration; 314 | buildSettings = { 315 | ALWAYS_SEARCH_USER_PATHS = NO; 316 | CLANG_ANALYZER_NONNULL = YES; 317 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 318 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 319 | CLANG_CXX_LIBRARY = "libc++"; 320 | CLANG_ENABLE_MODULES = YES; 321 | CLANG_ENABLE_OBJC_ARC = YES; 322 | CLANG_ENABLE_OBJC_WEAK = YES; 323 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 324 | CLANG_WARN_BOOL_CONVERSION = YES; 325 | CLANG_WARN_COMMA = YES; 326 | CLANG_WARN_CONSTANT_CONVERSION = YES; 327 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 328 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 329 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 330 | CLANG_WARN_EMPTY_BODY = YES; 331 | CLANG_WARN_ENUM_CONVERSION = YES; 332 | CLANG_WARN_INFINITE_RECURSION = YES; 333 | CLANG_WARN_INT_CONVERSION = YES; 334 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 335 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 336 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 337 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 338 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 339 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 340 | CLANG_WARN_STRICT_PROTOTYPES = YES; 341 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 342 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 343 | CLANG_WARN_UNREACHABLE_CODE = YES; 344 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 345 | COPY_PHASE_STRIP = NO; 346 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 347 | ENABLE_NS_ASSERTIONS = NO; 348 | ENABLE_STRICT_OBJC_MSGSEND = YES; 349 | GCC_C_LANGUAGE_STANDARD = gnu11; 350 | GCC_NO_COMMON_BLOCKS = YES; 351 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 352 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 353 | GCC_WARN_UNDECLARED_SELECTOR = YES; 354 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 355 | GCC_WARN_UNUSED_FUNCTION = YES; 356 | GCC_WARN_UNUSED_VARIABLE = YES; 357 | IPHONEOS_DEPLOYMENT_TARGET = 14.2; 358 | MTL_ENABLE_DEBUG_INFO = NO; 359 | MTL_FAST_MATH = YES; 360 | SDKROOT = iphoneos; 361 | SWIFT_COMPILATION_MODE = wholemodule; 362 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 363 | VALIDATE_PRODUCT = YES; 364 | }; 365 | name = Release; 366 | }; 367 | C2FE74C525D6DAC0005B5998 /* Debug */ = { 368 | isa = XCBuildConfiguration; 369 | baseConfigurationReference = 65FD2CE938DA0A8244B162DB /* Pods-SSSwiftUISpinnerButtonDemo.debug.xcconfig */; 370 | buildSettings = { 371 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 372 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 373 | CODE_SIGN_STYLE = Automatic; 374 | DEVELOPMENT_ASSET_PATHS = "\"SSSwiftUISpinnerButtonDemo/Preview Content\""; 375 | DEVELOPMENT_TEAM = UH3C932562; 376 | ENABLE_PREVIEWS = YES; 377 | INFOPLIST_FILE = SSSwiftUISpinnerButtonDemo/Info.plist; 378 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 379 | LD_RUNPATH_SEARCH_PATHS = ( 380 | "$(inherited)", 381 | "@executable_path/Frameworks", 382 | ); 383 | PRODUCT_BUNDLE_IDENTIFIER = com.simform.SSSwiftUISpinnerButton; 384 | PRODUCT_NAME = "$(TARGET_NAME)"; 385 | SWIFT_VERSION = 5.0; 386 | TARGETED_DEVICE_FAMILY = "1,2"; 387 | }; 388 | name = Debug; 389 | }; 390 | C2FE74C625D6DAC0005B5998 /* Release */ = { 391 | isa = XCBuildConfiguration; 392 | baseConfigurationReference = 739DFA407AD72206B563D10E /* Pods-SSSwiftUISpinnerButtonDemo.release.xcconfig */; 393 | buildSettings = { 394 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 395 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 396 | CODE_SIGN_STYLE = Automatic; 397 | DEVELOPMENT_ASSET_PATHS = "\"SSSwiftUISpinnerButtonDemo/Preview Content\""; 398 | DEVELOPMENT_TEAM = UH3C932562; 399 | ENABLE_PREVIEWS = YES; 400 | INFOPLIST_FILE = SSSwiftUISpinnerButtonDemo/Info.plist; 401 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 402 | LD_RUNPATH_SEARCH_PATHS = ( 403 | "$(inherited)", 404 | "@executable_path/Frameworks", 405 | ); 406 | PRODUCT_BUNDLE_IDENTIFIER = com.simform.SSSwiftUISpinnerButton; 407 | PRODUCT_NAME = "$(TARGET_NAME)"; 408 | SWIFT_VERSION = 5.0; 409 | TARGETED_DEVICE_FAMILY = "1,2"; 410 | }; 411 | name = Release; 412 | }; 413 | /* End XCBuildConfiguration section */ 414 | 415 | /* Begin XCConfigurationList section */ 416 | C2FE74B025D6DABF005B5998 /* Build configuration list for PBXProject "SSSwiftUISpinnerButtonDemo" */ = { 417 | isa = XCConfigurationList; 418 | buildConfigurations = ( 419 | C2FE74C225D6DAC0005B5998 /* Debug */, 420 | C2FE74C325D6DAC0005B5998 /* Release */, 421 | ); 422 | defaultConfigurationIsVisible = 0; 423 | defaultConfigurationName = Release; 424 | }; 425 | C2FE74C425D6DAC0005B5998 /* Build configuration list for PBXNativeTarget "SSSwiftUISpinnerButtonDemo" */ = { 426 | isa = XCConfigurationList; 427 | buildConfigurations = ( 428 | C2FE74C525D6DAC0005B5998 /* Debug */, 429 | C2FE74C625D6DAC0005B5998 /* Release */, 430 | ); 431 | defaultConfigurationIsVisible = 0; 432 | defaultConfigurationName = Release; 433 | }; 434 | /* End XCConfigurationList section */ 435 | }; 436 | rootObject = C2FE74AD25D6DABF005B5998 /* Project object */; 437 | } 438 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo.xcodeproj/xcshareddata/xcschemes/SSSwiftUISpinnerButtonDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 60 | 62 | 68 | 69 | 70 | 71 | 73 | 74 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | } 93 | ], 94 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // SSSwiftUISpinnerButton 4 | // 5 | // Created by Nilisha Gupta on 12/02/21. 6 | // 7 | 8 | import SwiftUI 9 | import SSSwiftUISpinnerButton 10 | 11 | struct ContentView: View { 12 | 13 | // MARK: State variables for animation 14 | @State var isLineSpinFadeButtonAnimating: Bool = false 15 | @State var isBallRotateFadeButtonAnimating: Bool = false 16 | @State var isArcRotateFadeButtonAnimating: Bool = false 17 | @State var isBallSpinChaseButtonAnimating: Bool = false 18 | @State var isCustomShapeSpinChaseButtonAnimating: Bool = false 19 | 20 | // MARK: Variables for button customisation 21 | private var buttonStyleWithBasicDesign = SpinnerButtonViewStyle(width: 300, height: 50, cornerRadius: 5, backgroundColor: Color(hex: Colors.pink.rawValue), spinningButtonBackgroundColor: Color(hex: Colors.pink.rawValue), spinningStrokeColor: .white) 22 | 23 | private var buttonStyleWithBorderAndShadow: SpinnerButtonViewStyle { 24 | var buttonStyle = SpinnerButtonViewStyle() 25 | buttonStyle.cornerRadius = buttonStyle.height / 2 26 | buttonStyle.backgroundColor = Color(hex: Colors.darkBlue.rawValue) 27 | buttonStyle.spinningButtonBackgroundColor = Color(hex: Colors.darkBlue.rawValue) 28 | buttonStyle.spinningStrokeColor = .white 29 | buttonStyle.borderWidth = 2 30 | buttonStyle.borderColor = .white 31 | buttonStyle.shadowColor = Color(hex: Colors.darkBlue.rawValue) 32 | buttonStyle.shadowRadius = 2 33 | buttonStyle.shadowOffset = CGPoint(x: 0, y: 2) 34 | return buttonStyle 35 | } 36 | 37 | private var buttonStyleWithLinearGradient: SpinnerButtonViewStyle { 38 | var buttonStyle = SpinnerButtonViewStyle() 39 | buttonStyle.height = 50 40 | buttonStyle.cornerRadius = buttonStyle.height / 2 41 | buttonStyle.backgroundColor = .green 42 | buttonStyle.spinningStrokeColor = .white 43 | buttonStyle.gradient = LinearGradient( 44 | gradient: .init(colors: [Color(hex: Colors.darkGreen.rawValue),Color(hex: Colors.lightGreen.rawValue),Color(hex: Colors.lightBlue.rawValue)]), 45 | startPoint: .leading, 46 | endPoint: .trailing) 47 | return buttonStyle 48 | } 49 | 50 | private var buttonStyleWithChangedBackground: SpinnerButtonViewStyle { 51 | var buttonStyle = SpinnerButtonViewStyle() 52 | buttonStyle.backgroundColor = Color(hex: Colors.blue.rawValue) 53 | buttonStyle.spinningButtonBackgroundColor = .white 54 | buttonStyle.borderWidth = 1.5 55 | buttonStyle.borderColor = Color(hex: Colors.blue.rawValue) 56 | buttonStyle.spinningStrokeColor = Color(hex: Colors.blue.rawValue) 57 | return buttonStyle 58 | } 59 | 60 | private var buttonStyleWithLesserWidth: SpinnerButtonViewStyle { 61 | var buttonStyle = SpinnerButtonViewStyle() 62 | buttonStyle.width = 280 63 | buttonStyle.height = 60 64 | buttonStyle.cornerRadius = 5 65 | buttonStyle.backgroundColor = Color(hex: Colors.skyBlue.rawValue) 66 | buttonStyle.spinningButtonBackgroundColor = Color(hex: Colors.skyBlue.rawValue) 67 | return buttonStyle 68 | } 69 | 70 | var body: some View { 71 | VStack(spacing: 30) { 72 | 73 | /// Line Spin Fade Spinner Button 74 | SpinnerButton(buttonAction: { 75 | /// Action to perform 76 | 77 | /// Stop animation by toggling value of state variable 78 | /// Added delay of 2 seconds 79 | DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { 80 | isLineSpinFadeButtonAnimating.toggle() 81 | } 82 | }, isAnimating: $isLineSpinFadeButtonAnimating, buttonStyle: buttonStyleWithBasicDesign, animationType: SpinnerButtonAnimationStyle.lineSpinFade(count: 8, width: 0)) { 83 | /// Add content in button 84 | HStack { 85 | Image(systemName: "pencil") 86 | .renderingMode(.template) 87 | Text("Line Spin Fade") 88 | .fontWeight(.bold) 89 | } 90 | .foregroundColor(.white) 91 | } 92 | 93 | /// Ball Spin Chase Spinner Button 94 | SpinnerButton(buttonAction: { 95 | /// Action to perform 96 | 97 | /// Stop animation by toggling value of state variable 98 | /// Added delay of 2 seconds 99 | DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { 100 | isBallSpinChaseButtonAnimating.toggle() 101 | } 102 | }, isAnimating: $isBallSpinChaseButtonAnimating, buttonStyle: buttonStyleWithChangedBackground, animationType: .ballRotateFade(count: 5, size: 7)) { 103 | /// Add content in button 104 | HStack { 105 | Text("Ball Spin Chase") 106 | .fontWeight(.bold) 107 | } 108 | .foregroundColor(.white) 109 | } 110 | 111 | /// Custom Spin Chase Spinner Button 112 | SpinnerButton(buttonAction: { 113 | /// Action to perform 114 | 115 | /// Stop animation by toggling value of state variable 116 | /// Added delay of 2 seconds 117 | DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { 118 | isCustomShapeSpinChaseButtonAnimating.toggle() 119 | } 120 | }, isAnimating: $isCustomShapeSpinChaseButtonAnimating, buttonStyle: buttonStyleWithLesserWidth, animationType: SpinnerButtonAnimationStyle.ballRotateFade(count: 3, content: AnyView(Text("🔥").fixedSize()))) { 121 | /// Add content in button 122 | HStack { 123 | Text("Custom Spin Chase") 124 | .fontWeight(.bold) 125 | } 126 | .foregroundColor(.white) 127 | } 128 | 129 | /// Arcs Rotate Chase Spinner Button 130 | SpinnerButton(buttonAction: { 131 | /// Action to perform 132 | 133 | /// Stop animation by toggling value of state variable 134 | /// Added delay of 2 seconds 135 | DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { 136 | isArcRotateFadeButtonAnimating.toggle() 137 | } 138 | }, isAnimating: $isArcRotateFadeButtonAnimating, buttonStyle: buttonStyleWithLinearGradient, animationType: SpinnerButtonAnimationStyle.arcsRotateChase(count: 3, width: 2, spacing: 2)) { 139 | /// Add content in button 140 | HStack { 141 | Text("Arcs Rotate Chase") 142 | .fontWeight(.bold) 143 | } 144 | .foregroundColor(.white) 145 | } 146 | 147 | /// Ball Rotate Fade Spinner Button 148 | SpinnerButton(buttonAction: { 149 | /// Action to perform 150 | 151 | /// Stop animation by toggling value of state variable 152 | /// Added delay of 2 seconds 153 | DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { 154 | isBallRotateFadeButtonAnimating.toggle() 155 | } 156 | }, isAnimating: $isBallRotateFadeButtonAnimating, buttonStyle: buttonStyleWithBorderAndShadow, animationType: SpinnerButtonAnimationStyle.ballSpinChase(count: 7, size: 7)) { 157 | /// Add content in button 158 | ZStack { 159 | Text("Ball Rotate Fade") 160 | .fontWeight(.bold) 161 | } 162 | .foregroundColor(.white) 163 | } 164 | 165 | } 166 | /// Disable view if any button is animating 167 | .disabled(isLineSpinFadeButtonAnimating == true || isBallRotateFadeButtonAnimating == true || isArcRotateFadeButtonAnimating == true || isBallSpinChaseButtonAnimating == true || isCustomShapeSpinChaseButtonAnimating == true) 168 | } 169 | } 170 | 171 | struct ContentView_Previews: PreviewProvider { 172 | static var previews: some View { 173 | ContentView() 174 | } 175 | } 176 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo/HelperClass/Color+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Color+Extension.swift 3 | // SSSwiftUISpinnerButton 4 | // 5 | // Created by Chaitali Lad on 30/06/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | extension Color { 11 | 12 | /// Convert hex to Color 13 | /// - Parameter hex: Hex Code of Color 14 | init(hex: String) { 15 | let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) 16 | var int: UInt64 = 0 17 | Scanner(string: hex).scanHexInt64(&int) 18 | let a, r, g, b: UInt64 19 | switch hex.count { 20 | case 3: // RGB (12-bit) 21 | (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) 22 | case 6: // RGB (24-bit) 23 | (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) 24 | case 8: // ARGB (32-bit) 25 | (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) 26 | default: 27 | (a, r, g, b) = (1, 1, 1, 0) 28 | } 29 | self.init( 30 | .sRGB, 31 | red: Double(r) / 255, 32 | green: Double(g) / 255, 33 | blue: Double(b) / 255, 34 | opacity: Double(a) / 255 35 | ) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo/HelperClass/Enumerations.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Enumerations.swift 3 | // SSSwiftUISpinnerButton 4 | // 5 | // Created by Chaitali Lad on 30/06/21. 6 | // 7 | 8 | import Foundation 9 | 10 | enum Colors: String { 11 | case blue = "#3FC1C9" 12 | case pink = "#ff68ab" 13 | case darkGreen = "#2c7150" 14 | case lightGreen = "#23d0b1" 15 | case lightBlue = "#3fb0f3" 16 | case skyBlue = "66d1f8" 17 | case darkBlue = "3a67cc" 18 | } 19 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | 28 | UIApplicationSupportsIndirectInputEvents 29 | 30 | UILaunchScreen 31 | 32 | UIRequiredDeviceCapabilities 33 | 34 | armv7 35 | 36 | UISupportedInterfaceOrientations 37 | 38 | UIInterfaceOrientationPortrait 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UISupportedInterfaceOrientations~ipad 43 | 44 | UIInterfaceOrientationPortrait 45 | UIInterfaceOrientationPortraitUpsideDown 46 | UIInterfaceOrientationLandscapeLeft 47 | UIInterfaceOrientationLandscapeRight 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Example/SSSwiftUISpinnerButtonDemo/SSSwiftUISpinnerButtonDemoApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SSSwiftUISpinnerButtonDemoApp.swift 3 | // SSSwiftUISpinnerButton 4 | // 5 | // Created by Nilisha Gupta on 12/02/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct SSSwiftUISpinnerButtonDemoApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | ContentView() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Simform Solutions 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.3 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "SSSwiftUISpinnerButton", 8 | platforms: [ 9 | .iOS(.v13), 10 | .macOS(.v10_15) 11 | ], 12 | products: [ 13 | // Products define the executables and libraries a package produces, and make them visible to other packages. 14 | .library( 15 | name: "SSSwiftUISpinnerButton", 16 | targets: ["SSSwiftUISpinnerButton"]), 17 | ], 18 | dependencies: [ 19 | // Dependencies declare other packages that this package depends on. 20 | // .package(url: /* package url */, from: "1.0.0"), 21 | ], 22 | targets: [ 23 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 24 | // Targets can depend on other targets in this package, and on products in packages this package depends on. 25 | .target( 26 | name: "SSSwiftUISpinnerButton", 27 | dependencies: []) 28 | ], 29 | swiftLanguageVersions: [.v5] 30 | ) 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # SSSwiftUISpinnerButton 4 | 5 | 6 | SSSwiftUISpinnerButton is an open-source library in SwiftUI to add different spinning animation to button. 7 | 8 | [![Platform][platform-image]][platform-url] 9 | [![swiftUI](https://img.shields.io/badge/-swiftUI-blue)](https://developer.apple.com/documentation/swiftui) 10 | [![Swift Version][swift-image]][swift-url] 11 | [![License][license-image]][license-url] 12 | [![PRs Welcome][PR-image]][PR-url] 13 | 14 | ![Alt text](https://github.com/mobile-simformsolutions/SSSwiftUISpinnerButton/blob/main/SSSwiftUISpinnerButton.gif?raw=true) 15 | 16 | # Features! 17 | - Various spinner animation styles 18 | - Rounded button on spinning animation 19 | 20 | # Requirements 21 | - iOS 13.0+ 22 | - Xcode 11+ 23 | 24 | # Installation 25 | #### CocoaPods 26 | 27 | - You can use CocoaPods to install `SSSwiftUISpinnerButton` by adding it to your Podfile: 28 | 29 | use_frameworks! 30 | pod 'SSSwiftUISpinnerButton' 31 | 32 | - Import SSSwiftUISpinnerButton in your file: 33 | 34 | import SSSwiftUISpinnerButton 35 | 36 | **Manually** 37 | - Download and drop **SSSwiftUISpinnerButton/Sources** folder in your project. 38 | - Congratulations! 39 | 40 | #### Swift Package Manager 41 | - When using Xcode 11 or later, you can install `SSSwiftUISpinnerButton` by going to your Project settings > `Swift Packages` and add the repository by providing the GitHub URL. Alternatively, you can go to `File` > `Swift Packages` > `Add Package Dependencies...` 42 | 43 | dependencies: [ 44 | .package(url: "https://github.com/mobile-simformsolutions/SSSwiftUISpinnerButton.git", from: "1.0.0") 45 | ] 46 | 47 | # Usage Examples 48 | 49 | **Add Spinner Button** 50 | 51 | - Add state variable to manage spinner button start and stop animation 52 | 53 | @State var isSpinnerButtonAnimating: Bool = false 54 | 55 | - Add Spinner button: 56 | 57 | SpinnerButton(buttonAction: { 58 | // Your button action code here 59 | }, isAnimating: $isSpinnerButtonAnimating, builder: { 60 | // Add any view or content in button if required 61 | HStack { 62 | Text("Save") 63 | .foregroundColor(.white) 64 | } 65 | } 66 | ) 67 | 68 | **Start Animation** 69 | - Animation will start as soon as you will tap on the button (`isSpinnerButtonAnimating` state variable will be set true). 70 | 71 | **Stop Animation** 72 | - To stop the spinner button animation, simply toggle the state variable `isSpinnerButtonAnimating` value. 73 | 74 | isSpinnerButtonAnimating.toggle() 75 | 76 | **Spinner button animation style** 77 | - You can select from different animation styles 78 | - Every animation style has properties such as count, size, etc which can be modified. 79 | 80 | SpinnerButton(buttonAction: { 81 | /// Action to perform 82 | }, isAnimating: $isSpinnerButtonAnimating, 83 | animationType: SpinnerButtonAnimationStyle.lineSpinFade(count: 8, width: 0)) { 84 | /// Add content in button 85 | } 86 | **Spinner button customisation** 87 | - You can modify view of the spinner button using `SpinnerButtonViewStyle` 88 | - Initialise variable with type `SpinnerButtonViewStyle` to design button: 89 | 90 | private var buttonStyleWithBasicDesign: SpinnerButtonViewStyle = SpinnerButtonViewStyle( 91 | width: 300, 92 | height: 50, 93 | cornerRadius: 5, 94 | backgroundColor: .black, 95 | spinningButtonBackgroundColor: .black, 96 | spinningStrokeColor: .white 97 | ) 98 | 99 | - Assign it to `buttonstyle`: 100 | 101 | SpinnerButton(buttonAction: { 102 | /// Action to perform 103 | }, isAnimating: $isSpinnerButtonAnimating, 104 | buttonStyle: buttonStyleWithBasicDesign, 105 | animationType: SpinnerButtonAnimationStyle.lineSpinFade(count: 8, width: 0)) { 106 | /// Add content in button 107 | } 108 | 109 | # Swift Library: 110 | - Check out our Swift Library for Spinner Button - [SSSpinnerButton](https://github.com/SimformSolutionsPvtLtd/SSSpinnerButton) 111 | 112 | # Meta 113 | - Distributed under the MIT license. See LICENSE for more information. 114 | 115 | # Inspired By: 116 | - Spinner animations inspired from [iActivityIndicator](https://github.com/MojtabaHs/iActivityIndicator) 117 | 118 | [swift-image]:https://img.shields.io/badge/swift-5.0-orange.svg 119 | [swift-url]: https://swift.org/ 120 | [license-image]: https://img.shields.io/badge/License-MIT-blue.svg 121 | [license-url]: LICENSE 122 | [platform-image]:https://img.shields.io/cocoapods/p/LFAlertController.svg?style=flat 123 | [platform-url]:https://github.com/mobile-simformsolutions/SSSwiftUISpinnerButton 124 | [PR-image]:https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square 125 | [PR-url]:http://makeapullrequest.com 126 | -------------------------------------------------------------------------------- /SSSwiftUISpinnerButton.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSSwiftUISpinnerButton/e2b8ccd95a1f638ec2ba36cbcead6ac57c6d6255/SSSwiftUISpinnerButton.gif -------------------------------------------------------------------------------- /SSSwiftUISpinnerButton.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod spec lint SSSwiftUISpinnerButton.podspec' to ensure this is a 3 | # valid spec and to remove all comments including this before submitting the spec. 4 | # 5 | # To learn more about Podspec attributes see https://guides.cocoapods.org/syntax/podspec.html 6 | # To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/ 7 | # 8 | 9 | Pod::Spec.new do |spec| 10 | 11 | spec.name = "SSSwiftUISpinnerButton" 12 | spec.version = "1.0.0" 13 | spec.summary = "Button with different spinner animation styles." 14 | spec.description = "SpinnerButton is a custom button with different spinner animation styles." 15 | spec.homepage = "https://github.com/mobile-simformsolutions/SSSwiftUISpinnerButton" 16 | spec.license = { :type => "MIT", :file => "LICENSE" } 17 | spec.author = { "Chaitali Lad" => "chaitali.l@simformsolutions.com" } 18 | spec.platform = :ios 19 | spec.ios.deployment_target = "13.0" 20 | spec.swift_versions = '5.0' 21 | spec.source = { :git => "https://github.com/mobile-simformsolutions/SSSwiftUISpinnerButton.git", :tag => "#{spec.version}" } 22 | spec.source_files = "Sources/**/*" 23 | #spec.documentation_url = 'docs/index.html' 24 | 25 | end -------------------------------------------------------------------------------- /Sources/SSSwiftUISpinnerButton/SpinnerButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SpinnerButton.swift 3 | // SSSwiftUISpinnerButton 4 | // 5 | // Created by Chaitali Lad on 28/06/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | public struct SpinnerButton: View { 11 | 12 | // MARK: Binding Variables 13 | /// State of button animation 14 | @Binding var isButtonAnimating: Bool 15 | 16 | // MARK: Variables 17 | 18 | /// To change design of button view 19 | private var buttonStyle: SpinnerButtonViewStyle 20 | 21 | /// To add any view or content in button 22 | private let content: Content 23 | 24 | /// Add action to be performed after button is tapped 25 | private var buttonAction: (() -> ()) 26 | 27 | /// Select button spinning animation type: arcsRotateChase, ballSpinChase, ballRotateFade or lineSpinFade 28 | private var animationType: SpinnerButtonAnimationStyle? 29 | 30 | // MARK: Init Method 31 | 32 | /// Add spinner button with custom design and animation style 33 | /// - Parameters: 34 | /// - buttonAction: Add action to be performed after button is tapped 35 | /// - isAnimating: Binding to determine if button is animating or not 36 | /// - buttonStyle: Change design of button view 37 | /// - animationType: Select button spinning animation type 38 | /// - builder: Add any view or content in button 39 | public init(buttonAction: @escaping () -> Void, isAnimating: Binding, buttonStyle: SpinnerButtonViewStyle? = nil, animationType: SpinnerButtonAnimationStyle? = nil, @ViewBuilder builder: () -> Content) { 40 | content = builder() 41 | self._isButtonAnimating = isAnimating 42 | self.buttonStyle = buttonStyle ?? SpinnerButtonViewStyle() 43 | self.animationType = animationType 44 | self.buttonAction = buttonAction 45 | } 46 | 47 | public var body: some View { 48 | /// Add Button 49 | Button(action: { 50 | /// Perform action on tap of button 51 | /// Toggle `isButtonAnimating` to change the state 52 | if !isButtonAnimating { 53 | buttonAction() 54 | } 55 | isButtonAnimating = true 56 | }) { 57 | /// Add content in button view 58 | ZStack { 59 | /// Customise content view based on button style (before and after animation) 60 | /// Add rectangle in ZStack and add styling customisation 61 | Rectangle() 62 | /// Fill rectandle with given linear gradient 63 | /// or 64 | /// Add linear gradient with background and loading background color 65 | .fill( 66 | buttonStyle.gradient ?? LinearGradient( 67 | gradient: Gradient( 68 | colors: [(isButtonAnimating ? buttonStyle.spinningButtonBackgroundColor:buttonStyle.backgroundColor)] 69 | ), 70 | startPoint: .leading, 71 | endPoint: .trailing 72 | ) 73 | ) 74 | /// Add given corner radius to rectangle when button is not animating 75 | .cornerRadius( 76 | isButtonAnimating ? (buttonStyle.height/2):buttonStyle.cornerRadius 77 | ) 78 | /// Add `overlay` to give border or shadow to button 79 | /// Add Rounded Rectangle View 80 | /// `Stroke`: Add given custom border and border width 81 | /// `Shadow`: Addgiven custom shadow 82 | /// `CornerRadius`: Add given corner radius when button is not animating (For overlay to clip borders) 83 | .overlay(RoundedRectangle(cornerRadius: isButtonAnimating ? buttonStyle.height/2:buttonStyle.cornerRadius) 84 | .stroke(buttonStyle.borderColor, lineWidth: buttonStyle.borderWidth) 85 | .shadow(color: buttonStyle.shadowColor, radius: buttonStyle.shadowRadius, x: buttonStyle.shadowOffset.x, y: buttonStyle.shadowOffset.y)) 86 | /// Add animation 87 | .animation(.easeInOut) 88 | 89 | if isButtonAnimating { 90 | /// On animating, add spinning animation to view 91 | SpinnerButtonAnimationView(animationStyle: animationType ?? .arcsRotateChase()) 92 | .frame(width: buttonStyle.height / 2, height: buttonStyle.height / 2, alignment: .center) 93 | .foregroundColor(buttonStyle.spinningStrokeColor) 94 | } else { 95 | /// On stopping animation, show animation in user-added content 96 | VStack { 97 | /// Add user added content 98 | content 99 | .animation(.easeInOut) 100 | } 101 | .cornerRadius(isButtonAnimating ? buttonStyle.height/2:buttonStyle.cornerRadius) 102 | } 103 | } 104 | } 105 | /// Add custom frame size 106 | .frame(width: isButtonAnimating ? buttonStyle.height:buttonStyle.width, height: buttonStyle.height) 107 | .buttonStyle(StaticButtonStyle()) 108 | /// Disable view while animating 109 | .disabled(isButtonAnimating == true) 110 | } 111 | } 112 | 113 | private struct StaticButtonStyle: ButtonStyle { 114 | func makeBody(configuration: Configuration) -> some View { 115 | configuration.label 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /Sources/SSSwiftUISpinnerButton/SpinnerButtonAnimationStyle/ArcsRotateChaseAnimation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArcsRotateChaseAnimation.swift 3 | // SSSwiftUISpinnerButton 4 | // 5 | // Created by Chaitali Lad on 28/06/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | public struct ArcsRotateChaseAnimation: View { 11 | 12 | // MARK: Binding Variables 13 | /// State of button animation 14 | @Binding private var isAnimating: Bool 15 | 16 | // MARK: Public Variables 17 | /// Change the number of animating arc 18 | public let count: UInt 19 | 20 | /// Change the width of animating arc 21 | public let width: CGFloat 22 | 23 | /// Change the spacing between animating arcs 24 | public let spacing: CGFloat 25 | 26 | // MARK: Init Method 27 | /// - Parameters: 28 | /// - isAnimating: Binding to determine if button is animating or not 29 | /// - count: Change number of animating arc 30 | /// - width: Change width of animating arc 31 | /// - spacing: Add spacing between animating arcs 32 | public init(isAnimating: Binding, count: UInt = 3, width: CGFloat = 2, spacing: CGFloat = 1) { 33 | self._isAnimating = isAnimating 34 | self.count = count 35 | self.width = width 36 | self.spacing = spacing 37 | } 38 | 39 | public var body: some View { 40 | GeometryReader { geometry in 41 | ForEach(0.. some View { 55 | Group { () -> Path in 56 | var path = Path() 57 | path.addArc(center: CGPoint(x: geometrySize.width/2, y: geometrySize.height/2), 58 | radius: geometrySize.width/2 - width/2 - CGFloat(index) * (width + spacing), 59 | startAngle: .degrees(0), 60 | endAngle: .degrees(Double(Int.random(in: 180...300))), 61 | clockwise: true) 62 | return path.strokedPath(.init(lineWidth: width)) 63 | } 64 | .frame(width: geometrySize.width, height: geometrySize.height) 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Sources/SSSwiftUISpinnerButton/SpinnerButtonAnimationStyle/BallRotateFadeAnimation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BallRotateFadeAnimation.swift 3 | // SSSwiftUISpinnerButton 4 | // 5 | // Created by Chaitali Lad on 28/06/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | public struct BallRotateFadeAnimation: View { 11 | 12 | // MARK: Binding Variables 13 | /// State of button animation 14 | @Binding private var isAnimating: Bool 15 | 16 | // MARK: Public Variables 17 | /// Change the number of animating shapes 18 | public let count: UInt 19 | 20 | /// Change the shape from ball to any given view 21 | public let content: AnyView 22 | 23 | // MARK: Init Methods 24 | /// - Parameters: 25 | /// - isAnimating: Binding to determine if button is animating or not 26 | /// - count: Change the number of animating shapes 27 | /// - size: Change the size of animating shapes 28 | /// - content: Change the shape from ball to any given view 29 | public init(isAnimating: Binding, count: UInt = 6, size: CGFloat = 8, content: () -> Content) { 30 | self._isAnimating = isAnimating 31 | self.count = count 32 | self.content = AnyView(content().frame(width: size, height: size)) 33 | } 34 | 35 | /// - Parameters: 36 | /// - isAnimating: Binding to determine if button is animating or not 37 | /// - count: Change the number of animating balls 38 | /// - size: Change the size of animating balls 39 | public init(isAnimating: Binding, count: UInt = 6, size: CGFloat = 8) { 40 | self.init(isAnimating: isAnimating, count: count) { 41 | Circle().frame(width: size, height: size) 42 | } 43 | } 44 | 45 | public var body: some View { 46 | GeometryReader { geometry in 47 | ForEach(0.. CGFloat { 62 | CGFloat(index+1) / CGFloat(count) 63 | } 64 | 65 | private func item(forIndex index: Int, in geometrySize: CGSize) -> some View { 66 | content 67 | .scaleEffect(isAnimating ? animatingScale(forIndex: index) : 1 ) 68 | .offset(y: geometrySize.width/10 - geometrySize.height/2) 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /Sources/SSSwiftUISpinnerButton/SpinnerButtonAnimationStyle/BallSpinChaseAnimation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BallSpinChaseAnimation.swift 3 | // SSSwiftUISpinnerButton 4 | // 5 | // Created by Chaitali Lad on 28/06/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | public struct BallSpinChaseAnimation: View { 11 | 12 | // MARK: Binding Variables 13 | /// State of button animation 14 | @Binding private var isAnimating: Bool 15 | 16 | // MARK: Public Variables 17 | /// Change the number of animating ball 18 | public let count: UInt 19 | 20 | /// Change the size of animating ball 21 | public let size: CGFloat 22 | 23 | // MARK: Init Method 24 | /// - Parameters: 25 | /// - isAnimating: Binding to determine if button is animating or not 26 | /// - count: Change the number of animating ball 27 | /// - size: Change the size of animating ball 28 | public init(isAnimating: Binding, count: UInt = 8, size: CGFloat = 16) { 29 | self._isAnimating = isAnimating 30 | self.count = count 31 | self.size = size 32 | } 33 | 34 | public var body: some View { 35 | GeometryReader { geometry in 36 | ForEach(0.. some View { 46 | let angle = 2 * CGFloat.pi / CGFloat(count) * CGFloat(index) 47 | let x = (geometrySize.width/2 - size/2) * cos(angle) 48 | let y = (geometrySize.height/2 - size/2) * sin(angle) 49 | return Circle() 50 | .frame(width: size, height: size) 51 | .scaleEffect(isAnimating ? 0.5 : 1) 52 | .opacity(isAnimating ? 0.25 : 1) 53 | .animation( 54 | Animation 55 | .default 56 | .repeatCount(isAnimating ? .max : 1, autoreverses: true) 57 | .delay(Double(index) / Double(count) / 2) 58 | ) 59 | .offset(x: x, y: y) 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Sources/SSSwiftUISpinnerButton/SpinnerButtonAnimationStyle/LineSpinFadeAnimation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LineSpinFadeAnimation.swift 3 | // SSSwiftUISpinnerButton 4 | // 5 | // Created by Chaitali Lad on 28/06/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | public struct LineSpinFadeAnimation: View { 11 | 12 | // MARK: Binding Variables 13 | /// State of button animation 14 | @Binding private var isAnimating: Bool 15 | 16 | // MARK: Public Variables 17 | /// Change the number of animating line 18 | public let count: UInt 19 | 20 | /// Change the width of animating line 21 | public let width: CGFloat 22 | 23 | // MARK: Init Method 24 | /// - Parameters: 25 | /// - isAnimating: Binding to determine if button is animating or not 26 | /// - count: Change the number of animating line 27 | /// - width: Change the width of animating line 28 | public init(isAnimating: Binding, count: UInt = 8, width: CGFloat = -1) { 29 | self._isAnimating = isAnimating 30 | self.count = count 31 | self.width = width 32 | } 33 | 34 | public var body: some View { 35 | GeometryReader { geometry in 36 | ForEach(0.. some View { 51 | let height: CGFloat = (geometrySize.height / 3.2).rounded() 52 | let width: CGFloat = (self.width <= 0 ? height/2 : self.width).rounded() 53 | let angle = 2 * CGFloat.pi / CGFloat(count) * CGFloat(index) 54 | let x = (geometrySize.width/2 - height/2) * cos(angle) 55 | let y = (geometrySize.height/2 - height/2) * sin(angle) 56 | return 57 | Capsule(style: .continuous) 58 | .frame(width: width, height: height) 59 | .rotationEffect(Angle(radians: Double(angle + CGFloat.pi/2))) 60 | .offset(x: x, y: y) 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Sources/SSSwiftUISpinnerButton/SpinnerButtonAnimationView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SpinnerButtonAnimationView.swift 3 | // SSSwiftUISpinnerButton 4 | // 5 | // Created by Chaitali Lad on 28/06/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | /// Spinner Button Animation Style 11 | public enum SpinnerButtonAnimationStyle { 12 | case arcsRotateChase(count: UInt = 3, width: CGFloat = 2, spacing: CGFloat = 1) 13 | case ballSpinChase(count: UInt = 8, size: CGFloat = 16) 14 | case ballRotateFade(count: UInt = 6, size: CGFloat = 10, content: AnyView = AnyView(Circle())) 15 | case lineSpinFade(count: UInt = 8, width: CGFloat = 0) 16 | } 17 | 18 | /// Spinner Button Animation View 19 | public struct SpinnerButtonAnimationView: View { 20 | 21 | // MARK: State Variables 22 | /// State of button animation 23 | @State var isAnimating: Bool = false 24 | 25 | // MARK: Variables 26 | /// Spinner animation style: arcsRotateChase, ballSpinChase, ballRotateFade or lineSpinFade 27 | private let animationStyle: SpinnerButtonAnimationStyle 28 | 29 | public var body: some View { 30 | Group { 31 | switch animationStyle { 32 | case let .arcsRotateChase(count, width, spacing): 33 | ArcsRotateChaseAnimation( 34 | isAnimating: $isAnimating, 35 | count: count, 36 | width: width, 37 | spacing: spacing 38 | ) 39 | case let .ballSpinChase(count, size): 40 | BallSpinChaseAnimation( 41 | isAnimating: $isAnimating, 42 | count: count, 43 | size: size 44 | ) 45 | case let .ballRotateFade(count, size, content): 46 | BallRotateFadeAnimation( 47 | isAnimating: $isAnimating, 48 | count: count, 49 | size: size, 50 | content: { content.frame(width: size, height: size) } 51 | ) 52 | case let .lineSpinFade(count, width): 53 | LineSpinFadeAnimation(isAnimating: $isAnimating, 54 | count: count, 55 | width: width) 56 | } 57 | } 58 | .onAppear { isAnimating = true } 59 | .onDisappear { isAnimating = false } 60 | .aspectRatio(contentMode: .fit) 61 | } 62 | 63 | // MARK: Init Method 64 | /// Add animation view in button based on selected animation style 65 | /// - Parameter animationStyle: Select button spinning animation style 66 | public init(animationStyle: SpinnerButtonAnimationStyle = .arcsRotateChase()) { 67 | self.animationStyle = animationStyle 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /Sources/SSSwiftUISpinnerButton/SpinnerButtonViewStyle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SpinnerButtonViewStyle.swift 3 | // SSSwiftUISpinnerButton 4 | // 5 | // Created by Chaitali Lad on 28/06/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | public struct SpinnerButtonViewStyle { 11 | 12 | // MARK: Variables 13 | 14 | /// Width of button - default width is set to 300 15 | public var width: CGFloat = 300 16 | 17 | /// height of button - default height is set to 50 18 | public var height: CGFloat = 50 19 | 20 | /// Corner radius of button - default cornerRadius is set to 0 21 | public var cornerRadius: CGFloat = 0 22 | 23 | /// Background color of button - default backgroundColor is set to primary 24 | public var backgroundColor: Color = .primary 25 | 26 | /// Background color of button when button is animating / spinning - default spinningButtonBackgroundColor is set to primary 27 | public var spinningButtonBackgroundColor: Color = .primary 28 | 29 | /// Spinning stroke color of button - default spinningStrokeColor is set to white 30 | public var spinningStrokeColor: Color = Color.white 31 | 32 | /// Border color of button - default borderColor is set to clear 33 | public var borderColor: Color = Color.clear 34 | 35 | /// Border width of button - default borderWidth is set to 0 36 | public var borderWidth: CGFloat = 0 37 | 38 | /// Gradient of button 39 | public var gradient: LinearGradient? 40 | 41 | /// Shadow color of button - default shadowColor is set to clear 42 | public var shadowColor: Color = Color.clear 43 | 44 | /// Shadow radius of button - default shadowRadius is set to 0 45 | public var shadowRadius: CGFloat = 0 46 | 47 | /// Shadow offset of button - default shadowOffset is set to zero 48 | public var shadowOffset: CGPoint = CGPoint.zero 49 | 50 | // MARK: Init Methods 51 | /// Initialise to design button view 52 | public init() { 53 | 54 | } 55 | 56 | // MARK: Init method to add basic customisation to button 57 | /// Initialise to add basic custom design to button view 58 | /// - Parameters: 59 | /// - width: Width of button 60 | /// - height: Height of button 61 | /// - cornerRadius: Corner radius of button 62 | /// - backgroundColor: Background color of button 63 | /// - spinningButtonBackgroundColor: Background color of button while button is animating / spinning 64 | /// - spinningStrokeColor: Spinning Stroke Color of button 65 | public init(width: CGFloat? = nil, height: CGFloat? = nil, cornerRadius: CGFloat? = nil, backgroundColor: Color? = nil, spinningButtonBackgroundColor: Color? = nil, spinningStrokeColor: Color? = nil) { 66 | self.width = width ?? 300 67 | self.height = height ?? 50 68 | self.cornerRadius = cornerRadius ?? 0 69 | self.backgroundColor = backgroundColor ?? Color.primary 70 | self.spinningButtonBackgroundColor = spinningButtonBackgroundColor ?? self.backgroundColor 71 | self.spinningStrokeColor = spinningStrokeColor ?? .white 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /Tests/LinuxMain.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | import SSSwiftUISpinnerButtonTests 4 | 5 | var tests = [XCTestCaseEntry]() 6 | tests += SSSwiftUISpinnerButtonTests.allTests() 7 | XCTMain(tests) 8 | -------------------------------------------------------------------------------- /Tests/SSSwiftUISpinnerButtonTests/SSSwiftUISpinnerButtonTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import SSSwiftUISpinnerButton 3 | 4 | final class SSSwiftUISpinnerButtonTests: XCTestCase { 5 | func testExample() { 6 | // This is an example of a functional test case. 7 | // Use XCTAssert and related functions to verify your tests produce the correct 8 | // results. 9 | XCTAssertEqual(SSSwiftUISpinnerButton().text, "Hello, World!") 10 | } 11 | 12 | static var allTests = [ 13 | ("testExample", testExample), 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /Tests/SSSwiftUISpinnerButtonTests/XCTestManifests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | #if !canImport(ObjectiveC) 4 | public func allTests() -> [XCTestCaseEntry] { 5 | return [ 6 | testCase(SSSwiftUISpinnerButtonTests.allTests), 7 | ] 8 | } 9 | #endif 10 | -------------------------------------------------------------------------------- /simformBanner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSSwiftUISpinnerButton/e2b8ccd95a1f638ec2ba36cbcead6ac57c6d6255/simformBanner.png --------------------------------------------------------------------------------