├── .gitignore ├── .travis.yml ├── Example ├── MTCircularSlider.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── MTCircularSlider-Example.xcscheme ├── MTCircularSlider.xcworkspace │ └── contents.xcworkspacedata ├── MTCircularSlider │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── LaunchScreen.xib │ │ └── Main.storyboard │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ └── ViewController.swift ├── MTCircularSlider_Example copy-Info.plist ├── Podfile ├── Podfile.lock ├── Pods │ ├── Local Podspecs │ │ └── MTCircularSlider.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ └── Target Support Files │ │ ├── MTCircularSlider │ │ ├── MTCircularSlider-Info.plist │ │ ├── MTCircularSlider-dummy.m │ │ ├── MTCircularSlider-prefix.pch │ │ ├── MTCircularSlider-umbrella.h │ │ ├── MTCircularSlider.modulemap │ │ └── MTCircularSlider.xcconfig │ │ ├── Pods-MTCircularSlider_Example │ │ ├── Pods-MTCircularSlider_Example-Info.plist │ │ ├── Pods-MTCircularSlider_Example-acknowledgements.markdown │ │ ├── Pods-MTCircularSlider_Example-acknowledgements.plist │ │ ├── Pods-MTCircularSlider_Example-dummy.m │ │ ├── Pods-MTCircularSlider_Example-frameworks.sh │ │ ├── Pods-MTCircularSlider_Example-umbrella.h │ │ ├── Pods-MTCircularSlider_Example.debug.xcconfig │ │ ├── Pods-MTCircularSlider_Example.modulemap │ │ └── Pods-MTCircularSlider_Example.release.xcconfig │ │ └── Pods-MTCircularSlider_Tests │ │ ├── Pods-MTCircularSlider_Tests-Info.plist │ │ ├── Pods-MTCircularSlider_Tests-acknowledgements.markdown │ │ ├── Pods-MTCircularSlider_Tests-acknowledgements.plist │ │ ├── Pods-MTCircularSlider_Tests-dummy.m │ │ ├── Pods-MTCircularSlider_Tests-frameworks.sh │ │ ├── Pods-MTCircularSlider_Tests-umbrella.h │ │ ├── Pods-MTCircularSlider_Tests.debug.xcconfig │ │ ├── Pods-MTCircularSlider_Tests.modulemap │ │ └── Pods-MTCircularSlider_Tests.release.xcconfig └── Tests │ ├── Info.plist │ └── Tests.swift ├── LICENSE ├── MTCircularSlider.podspec ├── MTCircularSlider ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ └── MTCircularSlider.swift ├── README.md ├── _Pods.xcodeproj └── install_swiftlint.sh /.gitignore: -------------------------------------------------------------------------------- 1 | <<<<<<< HEAD 2 | # OS X 3 | .DS_Store 4 | 5 | # Xcode 6 | ======= 7 | # Xcode 8 | .DS_Store 9 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 10 | build/ 11 | *.pbxuser 12 | !default.pbxuser 13 | *.mode1v3 14 | !default.mode1v3 15 | *.mode2v3 16 | !default.mode2v3 17 | *.perspectivev3 18 | !default.perspectivev3 19 | <<<<<<< HEAD 20 | xcuserdata/ 21 | *.xccheckout 22 | profile 23 | *.moved-aside 24 | DerivedData 25 | *.hmap 26 | *.ipa 27 | 28 | # Bundler 29 | .bundle 30 | 31 | Carthage 32 | # We recommend against adding the Pods directory to your .gitignore. However 33 | # you should judge for yourself, the pros and cons are mentioned at: 34 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 35 | # 36 | # Note: if you ignore the Pods directory, make sure to uncomment 37 | # `pod install` in .travis.yml 38 | # 39 | # Pods/ 40 | ======= 41 | *.xcworkspace 42 | !default.xcworkspace 43 | xcuserdata 44 | profile 45 | *.moved-aside 46 | DerivedData 47 | .idea/ 48 | 49 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 50 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * http://www.objc.io/issue-6/travis-ci.html 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode10.2 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | before_install: 10 | - gem install cocoapods --pre # Since Travis is not always on latest version 11 | - pod install --project-directory=Example 12 | install: 13 | - ./install_swiftlint.sh 14 | script: 15 | - set -o pipefail && xcodebuild test -workspace Example/MTCircularSlider.xcworkspace -scheme MTCircularSlider-Example -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO -destination "platform=iOS Simulator,OS=12.2,name=iPhone 8" | xcpretty 16 | - pod lib lint --allow-warnings 17 | - swiftlint 18 | 19 | -------------------------------------------------------------------------------- /Example/MTCircularSlider.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 2198899968C95DA976B7F57E /* Pods_MTCircularSlider_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EBAB04BF3881AFF2D2944BD /* Pods_MTCircularSlider_Tests.framework */; }; 11 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 12 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 13 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 14 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; 15 | A09787A81CFD021500763DC0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A09787A71CFCFB7500763DC0 /* Main.storyboard */; }; 16 | A09787A91CFD021E00763DC0 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 17 | B3584944B0998E13CCCC0730 /* Pods_MTCircularSlider_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 400856E6B4BF4BC6B13FD0E8 /* Pods_MTCircularSlider_Example.framework */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = 607FACC81AFB9204008FA782 /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = 607FACCF1AFB9204008FA782; 26 | remoteInfo = MTCircularSlider; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 075A69AE3FF1597E483BDF47 /* MTCircularSlider.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = MTCircularSlider.podspec; path = ../MTCircularSlider.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 32 | 1EBAB04BF3881AFF2D2944BD /* Pods_MTCircularSlider_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MTCircularSlider_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | 400856E6B4BF4BC6B13FD0E8 /* Pods_MTCircularSlider_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MTCircularSlider_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | 607FACD01AFB9204008FA782 /* MTCircularSlider_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MTCircularSlider_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 36 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 38 | 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 39 | 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 40 | 607FACE51AFB9204008FA782 /* MTCircularSlider_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MTCircularSlider_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 42 | 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; 43 | A09787A61CFCFB7500763DC0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 44 | A0E04A721CFF4FF50092ACB3 /* MTCircularSlider_Example copy-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "MTCircularSlider_Example copy-Info.plist"; path = "/Users/eran/Projects/UIComponents/MTCircularSlider/Example/MTCircularSlider_Example copy-Info.plist"; sourceTree = ""; }; 45 | A33F2BBE6B1F7EF9243599FC /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 46 | A7E5120C93CCB013F759054F /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 47 | C122259A8E09B22C554F7FAF /* Pods-MTCircularSlider_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MTCircularSlider_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example.debug.xcconfig"; sourceTree = ""; }; 48 | D7821F2283CA5C4866AD16F2 /* Pods-MTCircularSlider_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MTCircularSlider_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example.release.xcconfig"; sourceTree = ""; }; 49 | DBBC182FB2E793E0520DEFF9 /* Pods-MTCircularSlider_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MTCircularSlider_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests.debug.xcconfig"; sourceTree = ""; }; 50 | F13CE104445C4735C437E611 /* Pods-MTCircularSlider_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MTCircularSlider_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests.release.xcconfig"; sourceTree = ""; }; 51 | /* End PBXFileReference section */ 52 | 53 | /* Begin PBXFrameworksBuildPhase section */ 54 | 607FACCD1AFB9204008FA782 /* Frameworks */ = { 55 | isa = PBXFrameworksBuildPhase; 56 | buildActionMask = 2147483647; 57 | files = ( 58 | B3584944B0998E13CCCC0730 /* Pods_MTCircularSlider_Example.framework in Frameworks */, 59 | ); 60 | runOnlyForDeploymentPostprocessing = 0; 61 | }; 62 | 607FACE21AFB9204008FA782 /* Frameworks */ = { 63 | isa = PBXFrameworksBuildPhase; 64 | buildActionMask = 2147483647; 65 | files = ( 66 | 2198899968C95DA976B7F57E /* Pods_MTCircularSlider_Tests.framework in Frameworks */, 67 | ); 68 | runOnlyForDeploymentPostprocessing = 0; 69 | }; 70 | /* End PBXFrameworksBuildPhase section */ 71 | 72 | /* Begin PBXGroup section */ 73 | 607FACC71AFB9204008FA782 = { 74 | isa = PBXGroup; 75 | children = ( 76 | 607FACF51AFB993E008FA782 /* Podspec Metadata */, 77 | 607FACD21AFB9204008FA782 /* Example for MTCircularSlider */, 78 | 607FACE81AFB9204008FA782 /* Tests */, 79 | 607FACD11AFB9204008FA782 /* Products */, 80 | AB16C7A3C7127045A7BB9910 /* Pods */, 81 | 7B560371AD322217EFBBB427 /* Frameworks */, 82 | A0E04A721CFF4FF50092ACB3 /* MTCircularSlider_Example copy-Info.plist */, 83 | ); 84 | sourceTree = ""; 85 | }; 86 | 607FACD11AFB9204008FA782 /* Products */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 607FACD01AFB9204008FA782 /* MTCircularSlider_Example.app */, 90 | 607FACE51AFB9204008FA782 /* MTCircularSlider_Tests.xctest */, 91 | ); 92 | name = Products; 93 | sourceTree = ""; 94 | }; 95 | 607FACD21AFB9204008FA782 /* Example for MTCircularSlider */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | 607FACD71AFB9204008FA782 /* ViewController.swift */, 99 | 607FACDC1AFB9204008FA782 /* Images.xcassets */, 100 | 607FACD31AFB9204008FA782 /* Supporting Files */, 101 | A09787A71CFCFB7500763DC0 /* Main.storyboard */, 102 | ); 103 | name = "Example for MTCircularSlider"; 104 | path = MTCircularSlider; 105 | sourceTree = ""; 106 | }; 107 | 607FACD31AFB9204008FA782 /* Supporting Files */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */, 111 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, 112 | 607FACD41AFB9204008FA782 /* Info.plist */, 113 | ); 114 | name = "Supporting Files"; 115 | sourceTree = ""; 116 | }; 117 | 607FACE81AFB9204008FA782 /* Tests */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | 607FACEB1AFB9204008FA782 /* Tests.swift */, 121 | 607FACE91AFB9204008FA782 /* Supporting Files */, 122 | ); 123 | path = Tests; 124 | sourceTree = ""; 125 | }; 126 | 607FACE91AFB9204008FA782 /* Supporting Files */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 607FACEA1AFB9204008FA782 /* Info.plist */, 130 | ); 131 | name = "Supporting Files"; 132 | sourceTree = ""; 133 | }; 134 | 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 075A69AE3FF1597E483BDF47 /* MTCircularSlider.podspec */, 138 | A33F2BBE6B1F7EF9243599FC /* README.md */, 139 | A7E5120C93CCB013F759054F /* LICENSE */, 140 | ); 141 | name = "Podspec Metadata"; 142 | sourceTree = ""; 143 | }; 144 | 7B560371AD322217EFBBB427 /* Frameworks */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | 400856E6B4BF4BC6B13FD0E8 /* Pods_MTCircularSlider_Example.framework */, 148 | 1EBAB04BF3881AFF2D2944BD /* Pods_MTCircularSlider_Tests.framework */, 149 | ); 150 | name = Frameworks; 151 | sourceTree = ""; 152 | }; 153 | AB16C7A3C7127045A7BB9910 /* Pods */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | C122259A8E09B22C554F7FAF /* Pods-MTCircularSlider_Example.debug.xcconfig */, 157 | D7821F2283CA5C4866AD16F2 /* Pods-MTCircularSlider_Example.release.xcconfig */, 158 | DBBC182FB2E793E0520DEFF9 /* Pods-MTCircularSlider_Tests.debug.xcconfig */, 159 | F13CE104445C4735C437E611 /* Pods-MTCircularSlider_Tests.release.xcconfig */, 160 | ); 161 | name = Pods; 162 | sourceTree = ""; 163 | }; 164 | /* End PBXGroup section */ 165 | 166 | /* Begin PBXNativeTarget section */ 167 | 607FACCF1AFB9204008FA782 /* MTCircularSlider_Example */ = { 168 | isa = PBXNativeTarget; 169 | buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "MTCircularSlider_Example" */; 170 | buildPhases = ( 171 | F02D09FC806AB74E29B0EDD2 /* [CP] Check Pods Manifest.lock */, 172 | 607FACCC1AFB9204008FA782 /* Sources */, 173 | 607FACCD1AFB9204008FA782 /* Frameworks */, 174 | 607FACCE1AFB9204008FA782 /* Resources */, 175 | 67FC2037838F9D18969639A7 /* [CP] Embed Pods Frameworks */, 176 | A0797FCB21567A710027FC56 /* ShellScript */, 177 | ); 178 | buildRules = ( 179 | ); 180 | dependencies = ( 181 | ); 182 | name = MTCircularSlider_Example; 183 | productName = MTCircularSlider; 184 | productReference = 607FACD01AFB9204008FA782 /* MTCircularSlider_Example.app */; 185 | productType = "com.apple.product-type.application"; 186 | }; 187 | 607FACE41AFB9204008FA782 /* MTCircularSlider_Tests */ = { 188 | isa = PBXNativeTarget; 189 | buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "MTCircularSlider_Tests" */; 190 | buildPhases = ( 191 | 684089974648D39FE0BA420E /* [CP] Check Pods Manifest.lock */, 192 | 607FACE11AFB9204008FA782 /* Sources */, 193 | 607FACE21AFB9204008FA782 /* Frameworks */, 194 | 607FACE31AFB9204008FA782 /* Resources */, 195 | C36E65F02B2FC62D9DA3D05A /* [CP] Embed Pods Frameworks */, 196 | ); 197 | buildRules = ( 198 | ); 199 | dependencies = ( 200 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */, 201 | ); 202 | name = MTCircularSlider_Tests; 203 | productName = Tests; 204 | productReference = 607FACE51AFB9204008FA782 /* MTCircularSlider_Tests.xctest */; 205 | productType = "com.apple.product-type.bundle.unit-test"; 206 | }; 207 | /* End PBXNativeTarget section */ 208 | 209 | /* Begin PBXProject section */ 210 | 607FACC81AFB9204008FA782 /* Project object */ = { 211 | isa = PBXProject; 212 | attributes = { 213 | LastSwiftUpdateCheck = 0720; 214 | LastUpgradeCheck = 1020; 215 | ORGANIZATIONNAME = CocoaPods; 216 | TargetAttributes = { 217 | 607FACCF1AFB9204008FA782 = { 218 | CreatedOnToolsVersion = 6.3.1; 219 | DevelopmentTeam = EranBoudjnah; 220 | LastSwiftMigration = 1020; 221 | }; 222 | 607FACE41AFB9204008FA782 = { 223 | CreatedOnToolsVersion = 6.3.1; 224 | DevelopmentTeam = EranBoudjnah; 225 | LastSwiftMigration = 1020; 226 | }; 227 | }; 228 | }; 229 | buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "MTCircularSlider" */; 230 | compatibilityVersion = "Xcode 3.2"; 231 | developmentRegion = en; 232 | hasScannedForEncodings = 0; 233 | knownRegions = ( 234 | en, 235 | Base, 236 | ); 237 | mainGroup = 607FACC71AFB9204008FA782; 238 | productRefGroup = 607FACD11AFB9204008FA782 /* Products */; 239 | projectDirPath = ""; 240 | projectRoot = ""; 241 | targets = ( 242 | 607FACCF1AFB9204008FA782 /* MTCircularSlider_Example */, 243 | 607FACE41AFB9204008FA782 /* MTCircularSlider_Tests */, 244 | ); 245 | }; 246 | /* End PBXProject section */ 247 | 248 | /* Begin PBXResourcesBuildPhase section */ 249 | 607FACCE1AFB9204008FA782 /* Resources */ = { 250 | isa = PBXResourcesBuildPhase; 251 | buildActionMask = 2147483647; 252 | files = ( 253 | A09787A81CFD021500763DC0 /* Main.storyboard in Resources */, 254 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, 255 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, 256 | ); 257 | runOnlyForDeploymentPostprocessing = 0; 258 | }; 259 | 607FACE31AFB9204008FA782 /* Resources */ = { 260 | isa = PBXResourcesBuildPhase; 261 | buildActionMask = 2147483647; 262 | files = ( 263 | ); 264 | runOnlyForDeploymentPostprocessing = 0; 265 | }; 266 | /* End PBXResourcesBuildPhase section */ 267 | 268 | /* Begin PBXShellScriptBuildPhase section */ 269 | 67FC2037838F9D18969639A7 /* [CP] Embed Pods Frameworks */ = { 270 | isa = PBXShellScriptBuildPhase; 271 | buildActionMask = 2147483647; 272 | files = ( 273 | ); 274 | inputPaths = ( 275 | "${PODS_ROOT}/Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example-frameworks.sh", 276 | "${BUILT_PRODUCTS_DIR}/MTCircularSlider/MTCircularSlider.framework", 277 | ); 278 | name = "[CP] Embed Pods Frameworks"; 279 | outputPaths = ( 280 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTCircularSlider.framework", 281 | ); 282 | runOnlyForDeploymentPostprocessing = 0; 283 | shellPath = /bin/sh; 284 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example-frameworks.sh\"\n"; 285 | showEnvVarsInLog = 0; 286 | }; 287 | 684089974648D39FE0BA420E /* [CP] Check Pods Manifest.lock */ = { 288 | isa = PBXShellScriptBuildPhase; 289 | buildActionMask = 2147483647; 290 | files = ( 291 | ); 292 | inputPaths = ( 293 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 294 | "${PODS_ROOT}/Manifest.lock", 295 | ); 296 | name = "[CP] Check Pods Manifest.lock"; 297 | outputPaths = ( 298 | "$(DERIVED_FILE_DIR)/Pods-MTCircularSlider_Tests-checkManifestLockResult.txt", 299 | ); 300 | runOnlyForDeploymentPostprocessing = 0; 301 | shellPath = /bin/sh; 302 | 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"; 303 | showEnvVarsInLog = 0; 304 | }; 305 | A0797FCB21567A710027FC56 /* ShellScript */ = { 306 | isa = PBXShellScriptBuildPhase; 307 | buildActionMask = 2147483647; 308 | files = ( 309 | ); 310 | inputFileListPaths = ( 311 | ); 312 | inputPaths = ( 313 | ); 314 | outputFileListPaths = ( 315 | ); 316 | outputPaths = ( 317 | ); 318 | runOnlyForDeploymentPostprocessing = 0; 319 | shellPath = /bin/sh; 320 | shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; 321 | }; 322 | C36E65F02B2FC62D9DA3D05A /* [CP] Embed Pods Frameworks */ = { 323 | isa = PBXShellScriptBuildPhase; 324 | buildActionMask = 2147483647; 325 | files = ( 326 | ); 327 | inputPaths = ( 328 | "${PODS_ROOT}/Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests-frameworks.sh", 329 | "${BUILT_PRODUCTS_DIR}/MTCircularSlider/MTCircularSlider.framework", 330 | ); 331 | name = "[CP] Embed Pods Frameworks"; 332 | outputPaths = ( 333 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTCircularSlider.framework", 334 | ); 335 | runOnlyForDeploymentPostprocessing = 0; 336 | shellPath = /bin/sh; 337 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests-frameworks.sh\"\n"; 338 | showEnvVarsInLog = 0; 339 | }; 340 | F02D09FC806AB74E29B0EDD2 /* [CP] Check Pods Manifest.lock */ = { 341 | isa = PBXShellScriptBuildPhase; 342 | buildActionMask = 2147483647; 343 | files = ( 344 | ); 345 | inputPaths = ( 346 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 347 | "${PODS_ROOT}/Manifest.lock", 348 | ); 349 | name = "[CP] Check Pods Manifest.lock"; 350 | outputPaths = ( 351 | "$(DERIVED_FILE_DIR)/Pods-MTCircularSlider_Example-checkManifestLockResult.txt", 352 | ); 353 | runOnlyForDeploymentPostprocessing = 0; 354 | shellPath = /bin/sh; 355 | 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"; 356 | showEnvVarsInLog = 0; 357 | }; 358 | /* End PBXShellScriptBuildPhase section */ 359 | 360 | /* Begin PBXSourcesBuildPhase section */ 361 | 607FACCC1AFB9204008FA782 /* Sources */ = { 362 | isa = PBXSourcesBuildPhase; 363 | buildActionMask = 2147483647; 364 | files = ( 365 | A09787A91CFD021E00763DC0 /* ViewController.swift in Sources */, 366 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, 367 | ); 368 | runOnlyForDeploymentPostprocessing = 0; 369 | }; 370 | 607FACE11AFB9204008FA782 /* Sources */ = { 371 | isa = PBXSourcesBuildPhase; 372 | buildActionMask = 2147483647; 373 | files = ( 374 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, 375 | ); 376 | runOnlyForDeploymentPostprocessing = 0; 377 | }; 378 | /* End PBXSourcesBuildPhase section */ 379 | 380 | /* Begin PBXTargetDependency section */ 381 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { 382 | isa = PBXTargetDependency; 383 | target = 607FACCF1AFB9204008FA782 /* MTCircularSlider_Example */; 384 | targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; 385 | }; 386 | /* End PBXTargetDependency section */ 387 | 388 | /* Begin PBXVariantGroup section */ 389 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { 390 | isa = PBXVariantGroup; 391 | children = ( 392 | 607FACDF1AFB9204008FA782 /* Base */, 393 | ); 394 | name = LaunchScreen.xib; 395 | sourceTree = ""; 396 | }; 397 | A09787A71CFCFB7500763DC0 /* Main.storyboard */ = { 398 | isa = PBXVariantGroup; 399 | children = ( 400 | A09787A61CFCFB7500763DC0 /* Base */, 401 | ); 402 | name = Main.storyboard; 403 | sourceTree = ""; 404 | }; 405 | /* End PBXVariantGroup section */ 406 | 407 | /* Begin XCBuildConfiguration section */ 408 | 607FACED1AFB9204008FA782 /* Debug */ = { 409 | isa = XCBuildConfiguration; 410 | buildSettings = { 411 | ALWAYS_SEARCH_USER_PATHS = NO; 412 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 413 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 414 | CLANG_CXX_LIBRARY = "libc++"; 415 | CLANG_ENABLE_MODULES = YES; 416 | CLANG_ENABLE_OBJC_ARC = YES; 417 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 418 | CLANG_WARN_BOOL_CONVERSION = YES; 419 | CLANG_WARN_COMMA = YES; 420 | CLANG_WARN_CONSTANT_CONVERSION = YES; 421 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 422 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 423 | CLANG_WARN_EMPTY_BODY = YES; 424 | CLANG_WARN_ENUM_CONVERSION = YES; 425 | CLANG_WARN_INFINITE_RECURSION = YES; 426 | CLANG_WARN_INT_CONVERSION = YES; 427 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 428 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 429 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 430 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 431 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 432 | CLANG_WARN_STRICT_PROTOTYPES = YES; 433 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 434 | CLANG_WARN_UNREACHABLE_CODE = YES; 435 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 436 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 437 | COPY_PHASE_STRIP = NO; 438 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 439 | DEVELOPMENT_TEAM = EranBoudjnah; 440 | ENABLE_STRICT_OBJC_MSGSEND = YES; 441 | ENABLE_TESTABILITY = YES; 442 | GCC_C_LANGUAGE_STANDARD = gnu99; 443 | GCC_DYNAMIC_NO_PIC = NO; 444 | GCC_NO_COMMON_BLOCKS = YES; 445 | GCC_OPTIMIZATION_LEVEL = 0; 446 | GCC_PREPROCESSOR_DEFINITIONS = ( 447 | "DEBUG=1", 448 | "$(inherited)", 449 | ); 450 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 451 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 452 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 453 | GCC_WARN_UNDECLARED_SELECTOR = YES; 454 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 455 | GCC_WARN_UNUSED_FUNCTION = YES; 456 | GCC_WARN_UNUSED_VARIABLE = YES; 457 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 458 | MTL_ENABLE_DEBUG_INFO = YES; 459 | ONLY_ACTIVE_ARCH = YES; 460 | SDKROOT = iphoneos; 461 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 462 | SWIFT_VERSION = 4.0; 463 | }; 464 | name = Debug; 465 | }; 466 | 607FACEE1AFB9204008FA782 /* Release */ = { 467 | isa = XCBuildConfiguration; 468 | buildSettings = { 469 | ALWAYS_SEARCH_USER_PATHS = NO; 470 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 471 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 472 | CLANG_CXX_LIBRARY = "libc++"; 473 | CLANG_ENABLE_MODULES = YES; 474 | CLANG_ENABLE_OBJC_ARC = YES; 475 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 476 | CLANG_WARN_BOOL_CONVERSION = YES; 477 | CLANG_WARN_COMMA = YES; 478 | CLANG_WARN_CONSTANT_CONVERSION = YES; 479 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 480 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 481 | CLANG_WARN_EMPTY_BODY = YES; 482 | CLANG_WARN_ENUM_CONVERSION = YES; 483 | CLANG_WARN_INFINITE_RECURSION = YES; 484 | CLANG_WARN_INT_CONVERSION = YES; 485 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 486 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 487 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 488 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 489 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 490 | CLANG_WARN_STRICT_PROTOTYPES = YES; 491 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 492 | CLANG_WARN_UNREACHABLE_CODE = YES; 493 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 494 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 495 | COPY_PHASE_STRIP = NO; 496 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 497 | DEVELOPMENT_TEAM = EranBoudjnah; 498 | ENABLE_NS_ASSERTIONS = NO; 499 | ENABLE_STRICT_OBJC_MSGSEND = YES; 500 | GCC_C_LANGUAGE_STANDARD = gnu99; 501 | GCC_NO_COMMON_BLOCKS = YES; 502 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 503 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 504 | GCC_WARN_UNDECLARED_SELECTOR = YES; 505 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 506 | GCC_WARN_UNUSED_FUNCTION = YES; 507 | GCC_WARN_UNUSED_VARIABLE = YES; 508 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 509 | MTL_ENABLE_DEBUG_INFO = NO; 510 | SDKROOT = iphoneos; 511 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 512 | SWIFT_VERSION = 4.0; 513 | VALIDATE_PRODUCT = YES; 514 | }; 515 | name = Release; 516 | }; 517 | 607FACF01AFB9204008FA782 /* Debug */ = { 518 | isa = XCBuildConfiguration; 519 | baseConfigurationReference = C122259A8E09B22C554F7FAF /* Pods-MTCircularSlider_Example.debug.xcconfig */; 520 | buildSettings = { 521 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 522 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 523 | INFOPLIST_FILE = MTCircularSlider/Info.plist; 524 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 525 | MODULE_NAME = ExampleApp; 526 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 527 | PRODUCT_NAME = "$(TARGET_NAME)"; 528 | SWIFT_VERSION = 5.0; 529 | TARGETED_DEVICE_FAMILY = "1,2"; 530 | }; 531 | name = Debug; 532 | }; 533 | 607FACF11AFB9204008FA782 /* Release */ = { 534 | isa = XCBuildConfiguration; 535 | baseConfigurationReference = D7821F2283CA5C4866AD16F2 /* Pods-MTCircularSlider_Example.release.xcconfig */; 536 | buildSettings = { 537 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 538 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 539 | INFOPLIST_FILE = MTCircularSlider/Info.plist; 540 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 541 | MODULE_NAME = ExampleApp; 542 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 543 | PRODUCT_NAME = "$(TARGET_NAME)"; 544 | SWIFT_VERSION = 5.0; 545 | TARGETED_DEVICE_FAMILY = "1,2"; 546 | }; 547 | name = Release; 548 | }; 549 | 607FACF31AFB9204008FA782 /* Debug */ = { 550 | isa = XCBuildConfiguration; 551 | baseConfigurationReference = DBBC182FB2E793E0520DEFF9 /* Pods-MTCircularSlider_Tests.debug.xcconfig */; 552 | buildSettings = { 553 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 554 | DEVELOPMENT_TEAM = EranBoudjnah; 555 | GCC_PREPROCESSOR_DEFINITIONS = ( 556 | "DEBUG=1", 557 | "$(inherited)", 558 | ); 559 | INFOPLIST_FILE = Tests/Info.plist; 560 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 561 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 562 | PRODUCT_NAME = "$(TARGET_NAME)"; 563 | SWIFT_VERSION = 5.0; 564 | }; 565 | name = Debug; 566 | }; 567 | 607FACF41AFB9204008FA782 /* Release */ = { 568 | isa = XCBuildConfiguration; 569 | baseConfigurationReference = F13CE104445C4735C437E611 /* Pods-MTCircularSlider_Tests.release.xcconfig */; 570 | buildSettings = { 571 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 572 | DEVELOPMENT_TEAM = EranBoudjnah; 573 | INFOPLIST_FILE = Tests/Info.plist; 574 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 575 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 576 | PRODUCT_NAME = "$(TARGET_NAME)"; 577 | SWIFT_VERSION = 5.0; 578 | }; 579 | name = Release; 580 | }; 581 | /* End XCBuildConfiguration section */ 582 | 583 | /* Begin XCConfigurationList section */ 584 | 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "MTCircularSlider" */ = { 585 | isa = XCConfigurationList; 586 | buildConfigurations = ( 587 | 607FACED1AFB9204008FA782 /* Debug */, 588 | 607FACEE1AFB9204008FA782 /* Release */, 589 | ); 590 | defaultConfigurationIsVisible = 0; 591 | defaultConfigurationName = Release; 592 | }; 593 | 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "MTCircularSlider_Example" */ = { 594 | isa = XCConfigurationList; 595 | buildConfigurations = ( 596 | 607FACF01AFB9204008FA782 /* Debug */, 597 | 607FACF11AFB9204008FA782 /* Release */, 598 | ); 599 | defaultConfigurationIsVisible = 0; 600 | defaultConfigurationName = Release; 601 | }; 602 | 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "MTCircularSlider_Tests" */ = { 603 | isa = XCConfigurationList; 604 | buildConfigurations = ( 605 | 607FACF31AFB9204008FA782 /* Debug */, 606 | 607FACF41AFB9204008FA782 /* Release */, 607 | ); 608 | defaultConfigurationIsVisible = 0; 609 | defaultConfigurationName = Release; 610 | }; 611 | /* End XCConfigurationList section */ 612 | }; 613 | rootObject = 607FACC81AFB9204008FA782 /* Project object */; 614 | } 615 | -------------------------------------------------------------------------------- /Example/MTCircularSlider.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/MTCircularSlider.xcodeproj/xcshareddata/xcschemes/MTCircularSlider-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 68 | 78 | 80 | 86 | 87 | 88 | 89 | 90 | 91 | 97 | 99 | 105 | 106 | 107 | 108 | 110 | 111 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /Example/MTCircularSlider.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/MTCircularSlider/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // MTCircularSlider 4 | // 5 | // Created by Eran Boudjnah on 05/30/2016. 6 | // Copyright (c) 2016 Eran Boudjnah. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | var window: UIWindow? 14 | 15 | func application(_ application: UIApplication, 16 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 | return true 18 | } 19 | 20 | func applicationWillResignActive(_ application: UIApplication) { 21 | } 22 | 23 | func applicationDidEnterBackground(_ application: UIApplication) { 24 | } 25 | 26 | func applicationWillEnterForeground(_ application: UIApplication) { 27 | } 28 | 29 | func applicationDidBecomeActive(_ application: UIApplication) { 30 | } 31 | 32 | func applicationWillTerminate(_ application: UIApplication) { 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Example/MTCircularSlider/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 21 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /Example/MTCircularSlider/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | -------------------------------------------------------------------------------- /Example/MTCircularSlider/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "size" : "1024x1024", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } -------------------------------------------------------------------------------- /Example/MTCircularSlider/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 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Example/MTCircularSlider/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // UIControls 4 | // 5 | // Created by Eran Boudjnah on 27/05/2016. 6 | // Copyright © 2016 Eran Boudjnah. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MTCircularSlider 11 | 12 | class ViewController: UIViewController { 13 | @IBOutlet weak var progressView: MTCircularSlider! 14 | @IBOutlet weak var valueLabel: UILabel! 15 | @IBOutlet weak var knobWithLabelView: MTCircularSlider! 16 | @IBOutlet weak var knobView1: MTCircularSlider! 17 | @IBOutlet weak var knobView2: MTCircularSlider! 18 | 19 | fileprivate var timer: Timer! 20 | fileprivate var direction: CGFloat = 0.01 21 | 22 | override func viewDidLoad() { 23 | super.viewDidLoad() 24 | 25 | timer = Timer.scheduledTimer(timeInterval: 0.03, 26 | target: self, 27 | selector: #selector(update), 28 | userInfo: nil, 29 | repeats: true) 30 | 31 | setValueLabelText() 32 | 33 | initCustomKnobs() 34 | } 35 | 36 | override func viewDidDisappear(_ animated: Bool) { 37 | super.viewDidDisappear(animated) 38 | 39 | timer.invalidate() 40 | } 41 | 42 | @IBAction func onSlideChange(_ sender: MTCircularSlider) { 43 | setValueLabelText() 44 | } 45 | 46 | @objc func update(timer: Timer) { 47 | progressView.value += direction 48 | knobView1.value = progressView.value 49 | if progressView.value <= progressView.valueMinimum || 50 | progressView.value >= progressView.valueMaximum { 51 | direction = -direction 52 | } 53 | } 54 | 55 | fileprivate func setValueLabelText() { 56 | valueLabel.text = String(Int(knobWithLabelView.value)) 57 | } 58 | 59 | fileprivate func initCustomKnobs() { 60 | knobView1.applyAttributes([ 61 | /* Track */ 62 | Attributes.minTrackTint(.lightGray), 63 | Attributes.maxTrackTint(.darkGray), 64 | Attributes.trackWidth(4), 65 | Attributes.trackShadowRadius(0), 66 | Attributes.trackShadowDepth(0), 67 | Attributes.trackMinAngle(180), 68 | Attributes.trackMaxAngle(360), 69 | 70 | /* Thumb */ 71 | Attributes.hasThumb(false) 72 | ]) 73 | 74 | knobView1.valueMaximum = progressView.valueMaximum 75 | 76 | knobView2.applyAttributes([ 77 | /* Track */ 78 | Attributes.minTrackTint(.lightGray), 79 | Attributes.maxTrackTint(.lightGray), 80 | Attributes.trackWidth(12), 81 | Attributes.trackShadowRadius(0), 82 | Attributes.trackShadowDepth(0), 83 | Attributes.trackMinAngle(180), 84 | Attributes.trackMaxAngle(270), 85 | 86 | /* Thumb */ 87 | Attributes.hasThumb(true), 88 | Attributes.thumbTint(.darkGray), 89 | Attributes.thumbRadius(8), 90 | Attributes.thumbShadowRadius(0), 91 | Attributes.thumbShadowDepth(0) 92 | ]) 93 | 94 | knobView1.valueMaximum = progressView.valueMaximum 95 | 96 | // knobWithLabelView.addedTouchArea = 50 // any value you want 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Example/MTCircularSlider_Example copy-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 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | def shared_pods 4 | pod 'MTCircularSlider', :path => '../' 5 | end 6 | 7 | target 'MTCircularSlider_Example' do 8 | shared_pods 9 | 10 | target 'MTCircularSlider_Tests' do 11 | inherit! :search_paths 12 | 13 | shared_pods 14 | end 15 | end 16 | 17 | post_install do |installer| 18 | installer.pods_project.targets.each do |target| 19 | target.build_configurations.each do |config| 20 | config.build_settings['SWIFT_VERSION'] = '4.1' 21 | end 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - MTCircularSlider (1.1.0) 3 | 4 | DEPENDENCIES: 5 | - MTCircularSlider (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | MTCircularSlider: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | MTCircularSlider: 9b8fff1d3f7675b1c0dfa9b78d48cae9971c63a4 13 | 14 | PODFILE CHECKSUM: 5cac7dc6c261f21805f60fc9cacdfadbe09c27ae 15 | 16 | COCOAPODS: 1.8.4 17 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/MTCircularSlider.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "MTCircularSlider", 3 | "version": "1.1.0", 4 | "summary": "A circular slider control.", 5 | "description": "A feature-rich circular slider control. You can tweak colors, shadows, angles and windings.\nThis widget tries to conform to UISlider both in naming and default style.", 6 | "homepage": "https://github.com/EranBoudjnah/MTCircularSlider", 7 | "screenshots": "https://raw.githubusercontent.com/EranBoudjnah/MTCircularSlider/screenshots/screenshots/Simulator%20Screen%20Shot%2016%20Sep%202018.gif", 8 | "license": { 9 | "type": "MIT", 10 | "file": "LICENSE" 11 | }, 12 | "authors": { 13 | "Eran Boudjnah": "eranbou@gmail.com" 14 | }, 15 | "source": { 16 | "git": "https://github.com/EranBoudjnah/MTCircularSlider.git", 17 | "tag": "1.1.0" 18 | }, 19 | "social_media_url": "https://www.linkedin.com/in/eranboudjnah/", 20 | "platforms": { 21 | "ios": "12.2" 22 | }, 23 | "swift_versions": "5.0", 24 | "source_files": "MTCircularSlider/Classes/**/*", 25 | "swift_version": "5.0" 26 | } 27 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - MTCircularSlider (1.1.0) 3 | 4 | DEPENDENCIES: 5 | - MTCircularSlider (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | MTCircularSlider: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | MTCircularSlider: 9b8fff1d3f7675b1c0dfa9b78d48cae9971c63a4 13 | 14 | PODFILE CHECKSUM: 5cac7dc6c261f21805f60fc9cacdfadbe09c27ae 15 | 16 | COCOAPODS: 1.8.4 17 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0206888F47CF596F32217F403F9CE74A /* Pods-MTCircularSlider_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3116DFCBA5D2B72AC60F9CE00C5BC716 /* Pods-MTCircularSlider_Tests-dummy.m */; }; 11 | 18845B79B9BA73E37ACA2032140ACFDB /* MTCircularSlider-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5543922219F9082940891102A16C00C2 /* MTCircularSlider-dummy.m */; }; 12 | 1E4601C17EA0F713C0F077814948CA8B /* Pods-MTCircularSlider_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A384C6F7DE4491AF3415DAA5B6DF2B9 /* Pods-MTCircularSlider_Example-dummy.m */; }; 13 | 601BD1536834868FD4464962718DEA66 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; 14 | 971241F789DCDF8ACA58A530A9AB749A /* Pods-MTCircularSlider_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E177967562819B0BE83F8F7AEF8802E /* Pods-MTCircularSlider_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | AFA2BCA8493D52ACFB349BA7864F8352 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; 16 | D808848C84F8A773B81EF7F7AEAC67BA /* MTCircularSlider-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BD31DC638F836BFA294EA455E2388DD /* MTCircularSlider-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | F9920E41DF0E2764312992B0D3B2A446 /* Pods-MTCircularSlider_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B96C2441AD5F5CED8D0EA2B3B7A17E4 /* Pods-MTCircularSlider_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18 | F9AD2A8BA9ED0683C12B055B8EBD1FA3 /* MTCircularSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54B5BA46048C4E0EFF78545FB26CE34B /* MTCircularSlider.swift */; }; 19 | FDC8A9969929174E9E96AD3A7215CE83 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXContainerItemProxy section */ 23 | E0E4A3DBA7ECF2E1B0965C72A848FA4B /* PBXContainerItemProxy */ = { 24 | isa = PBXContainerItemProxy; 25 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 26 | proxyType = 1; 27 | remoteGlobalIDString = E13134D5F16D1271EBBC7963632A7F6D; 28 | remoteInfo = MTCircularSlider; 29 | }; 30 | EB2737615E3CA894978FD0D1DFE7A0F2 /* PBXContainerItemProxy */ = { 31 | isa = PBXContainerItemProxy; 32 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 33 | proxyType = 1; 34 | remoteGlobalIDString = 92509A1C2AAC8A822E4F11400D04503E; 35 | remoteInfo = "Pods-MTCircularSlider_Example"; 36 | }; 37 | F602FEFC14C7FC89BF559ED662CEEB34 /* PBXContainerItemProxy */ = { 38 | isa = PBXContainerItemProxy; 39 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 40 | proxyType = 1; 41 | remoteGlobalIDString = E13134D5F16D1271EBBC7963632A7F6D; 42 | remoteInfo = MTCircularSlider; 43 | }; 44 | /* End PBXContainerItemProxy section */ 45 | 46 | /* Begin PBXFileReference section */ 47 | 16D0D5AD269A62DD5463E0E89D853679 /* Pods-MTCircularSlider_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MTCircularSlider_Example.debug.xcconfig"; sourceTree = ""; }; 48 | 1A4B5960E77E5A460D222937D4820EBE /* Pods-MTCircularSlider_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MTCircularSlider_Example-acknowledgements.plist"; sourceTree = ""; }; 49 | 1B96C2441AD5F5CED8D0EA2B3B7A17E4 /* Pods-MTCircularSlider_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-MTCircularSlider_Tests-umbrella.h"; sourceTree = ""; }; 50 | 1E177967562819B0BE83F8F7AEF8802E /* Pods-MTCircularSlider_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-MTCircularSlider_Example-umbrella.h"; sourceTree = ""; }; 51 | 2133EA7DFBC74FC201F0F53FB37077D2 /* Pods-MTCircularSlider_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-MTCircularSlider_Example-frameworks.sh"; sourceTree = ""; }; 52 | 222C840AABF64B351C86E59ABC385708 /* Pods-MTCircularSlider_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MTCircularSlider_Example.release.xcconfig"; sourceTree = ""; }; 53 | 2F2085D691CE7FD3B1595CC2572FE054 /* Pods-MTCircularSlider_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MTCircularSlider_Tests.release.xcconfig"; sourceTree = ""; }; 54 | 3116DFCBA5D2B72AC60F9CE00C5BC716 /* Pods-MTCircularSlider_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-MTCircularSlider_Tests-dummy.m"; sourceTree = ""; }; 55 | 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 56 | 34F1E0CCD22DAD351A5EC2D075CBD070 /* Pods_MTCircularSlider_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MTCircularSlider_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | 3BD31DC638F836BFA294EA455E2388DD /* MTCircularSlider-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MTCircularSlider-umbrella.h"; sourceTree = ""; }; 58 | 4A384C6F7DE4491AF3415DAA5B6DF2B9 /* Pods-MTCircularSlider_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-MTCircularSlider_Example-dummy.m"; sourceTree = ""; }; 59 | 54B5BA46048C4E0EFF78545FB26CE34B /* MTCircularSlider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MTCircularSlider.swift; path = MTCircularSlider/Classes/MTCircularSlider.swift; sourceTree = ""; }; 60 | 5543922219F9082940891102A16C00C2 /* MTCircularSlider-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MTCircularSlider-dummy.m"; sourceTree = ""; }; 61 | 5C2AD9619A0924B575EC76D5E6C15D9A /* Pods-MTCircularSlider_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MTCircularSlider_Tests.debug.xcconfig"; sourceTree = ""; }; 62 | 61BEFC8E779C66FBC6D18ECC733F1FC2 /* MTCircularSlider.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MTCircularSlider.modulemap; sourceTree = ""; }; 63 | 6BFE605E5F92776A98BA73B50536D505 /* Pods-MTCircularSlider_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-MTCircularSlider_Tests-frameworks.sh"; sourceTree = ""; }; 64 | 7AF0635096109F69AB5E2D2D0A2B95AE /* MTCircularSlider.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MTCircularSlider.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | 858EE1411FDC06B4BEBF26868EB089C6 /* MTCircularSlider.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MTCircularSlider.xcconfig; sourceTree = ""; }; 66 | 9340F112D26806DFA962FBD96D68435C /* Pods-MTCircularSlider_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-MTCircularSlider_Example-acknowledgements.markdown"; sourceTree = ""; }; 67 | 991361880C13B183DFBE61DFAB3C97EC /* Pods-MTCircularSlider_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-MTCircularSlider_Example.modulemap"; sourceTree = ""; }; 68 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 69 | A4CC456D3F91D53490B56E9628F5BF7A /* Pods-MTCircularSlider_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-MTCircularSlider_Tests-acknowledgements.markdown"; sourceTree = ""; }; 70 | AD05665E7676AC48AB066AB59F5D62C1 /* MTCircularSlider-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MTCircularSlider-Info.plist"; sourceTree = ""; }; 71 | B12E2EC8A7B94A5F67A3AC6EC3A2AC60 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 72 | B95929772C52741F5DD29C05D290BE9F /* MTCircularSlider-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MTCircularSlider-prefix.pch"; sourceTree = ""; }; 73 | BABDE7A791BF7D6A8632E582A1CFADD7 /* Pods-MTCircularSlider_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-MTCircularSlider_Tests.modulemap"; sourceTree = ""; }; 74 | EA0E5A5B7436C106A125EBD7E97C5EF1 /* MTCircularSlider.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = MTCircularSlider.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 75 | F12D66124E225671203DA397D1EB179A /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 76 | F24DA261A7EF1D8F01D0D2BF3076270F /* Pods-MTCircularSlider_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MTCircularSlider_Example-Info.plist"; sourceTree = ""; }; 77 | F3C66CC4AD6ACA1C845247189BF42062 /* Pods-MTCircularSlider_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MTCircularSlider_Tests-Info.plist"; sourceTree = ""; }; 78 | F4302D9F1D6D9C2A65A3876B45550DDE /* Pods_MTCircularSlider_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MTCircularSlider_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 79 | FDADD1DC61B2B734B67EDB5393C33573 /* Pods-MTCircularSlider_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MTCircularSlider_Tests-acknowledgements.plist"; sourceTree = ""; }; 80 | /* End PBXFileReference section */ 81 | 82 | /* Begin PBXFrameworksBuildPhase section */ 83 | 38BDCD8CEBE138DD2A43F7F415CF03DF /* Frameworks */ = { 84 | isa = PBXFrameworksBuildPhase; 85 | buildActionMask = 2147483647; 86 | files = ( 87 | AFA2BCA8493D52ACFB349BA7864F8352 /* Foundation.framework in Frameworks */, 88 | ); 89 | runOnlyForDeploymentPostprocessing = 0; 90 | }; 91 | 6D7FF9A08F06B5128E6551236A25A714 /* Frameworks */ = { 92 | isa = PBXFrameworksBuildPhase; 93 | buildActionMask = 2147483647; 94 | files = ( 95 | FDC8A9969929174E9E96AD3A7215CE83 /* Foundation.framework in Frameworks */, 96 | ); 97 | runOnlyForDeploymentPostprocessing = 0; 98 | }; 99 | 8F512A33D69C77EFF826408CAB3DBE02 /* Frameworks */ = { 100 | isa = PBXFrameworksBuildPhase; 101 | buildActionMask = 2147483647; 102 | files = ( 103 | 601BD1536834868FD4464962718DEA66 /* Foundation.framework in Frameworks */, 104 | ); 105 | runOnlyForDeploymentPostprocessing = 0; 106 | }; 107 | /* End PBXFrameworksBuildPhase section */ 108 | 109 | /* Begin PBXGroup section */ 110 | 06E804025F035705597539E3EEBA42B3 /* Pod */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | F12D66124E225671203DA397D1EB179A /* LICENSE */, 114 | EA0E5A5B7436C106A125EBD7E97C5EF1 /* MTCircularSlider.podspec */, 115 | B12E2EC8A7B94A5F67A3AC6EC3A2AC60 /* README.md */, 116 | ); 117 | name = Pod; 118 | sourceTree = ""; 119 | }; 120 | 0C44F3CFF4FEF2878B2F97B634270C18 /* Support Files */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | 61BEFC8E779C66FBC6D18ECC733F1FC2 /* MTCircularSlider.modulemap */, 124 | 858EE1411FDC06B4BEBF26868EB089C6 /* MTCircularSlider.xcconfig */, 125 | 5543922219F9082940891102A16C00C2 /* MTCircularSlider-dummy.m */, 126 | AD05665E7676AC48AB066AB59F5D62C1 /* MTCircularSlider-Info.plist */, 127 | B95929772C52741F5DD29C05D290BE9F /* MTCircularSlider-prefix.pch */, 128 | 3BD31DC638F836BFA294EA455E2388DD /* MTCircularSlider-umbrella.h */, 129 | ); 130 | name = "Support Files"; 131 | path = "Example/Pods/Target Support Files/MTCircularSlider"; 132 | sourceTree = ""; 133 | }; 134 | 69700A2819E1FC9751E3947AD98D2078 /* Targets Support Files */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | B3CBA540E8D480F76500A85C013A92E6 /* Pods-MTCircularSlider_Example */, 138 | 6F8C6B3469C3B4FEACA86F1D64F44251 /* Pods-MTCircularSlider_Tests */, 139 | ); 140 | name = "Targets Support Files"; 141 | sourceTree = ""; 142 | }; 143 | 6BB776EC5BFBCA57502A6C165FD13AF0 /* MTCircularSlider */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | 54B5BA46048C4E0EFF78545FB26CE34B /* MTCircularSlider.swift */, 147 | 06E804025F035705597539E3EEBA42B3 /* Pod */, 148 | 0C44F3CFF4FEF2878B2F97B634270C18 /* Support Files */, 149 | ); 150 | name = MTCircularSlider; 151 | path = ../..; 152 | sourceTree = ""; 153 | }; 154 | 6F8C6B3469C3B4FEACA86F1D64F44251 /* Pods-MTCircularSlider_Tests */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | BABDE7A791BF7D6A8632E582A1CFADD7 /* Pods-MTCircularSlider_Tests.modulemap */, 158 | A4CC456D3F91D53490B56E9628F5BF7A /* Pods-MTCircularSlider_Tests-acknowledgements.markdown */, 159 | FDADD1DC61B2B734B67EDB5393C33573 /* Pods-MTCircularSlider_Tests-acknowledgements.plist */, 160 | 3116DFCBA5D2B72AC60F9CE00C5BC716 /* Pods-MTCircularSlider_Tests-dummy.m */, 161 | 6BFE605E5F92776A98BA73B50536D505 /* Pods-MTCircularSlider_Tests-frameworks.sh */, 162 | F3C66CC4AD6ACA1C845247189BF42062 /* Pods-MTCircularSlider_Tests-Info.plist */, 163 | 1B96C2441AD5F5CED8D0EA2B3B7A17E4 /* Pods-MTCircularSlider_Tests-umbrella.h */, 164 | 5C2AD9619A0924B575EC76D5E6C15D9A /* Pods-MTCircularSlider_Tests.debug.xcconfig */, 165 | 2F2085D691CE7FD3B1595CC2572FE054 /* Pods-MTCircularSlider_Tests.release.xcconfig */, 166 | ); 167 | name = "Pods-MTCircularSlider_Tests"; 168 | path = "Target Support Files/Pods-MTCircularSlider_Tests"; 169 | sourceTree = ""; 170 | }; 171 | 8A12956DC84D8FF06A2C0547433810B5 /* Development Pods */ = { 172 | isa = PBXGroup; 173 | children = ( 174 | 6BB776EC5BFBCA57502A6C165FD13AF0 /* MTCircularSlider */, 175 | ); 176 | name = "Development Pods"; 177 | sourceTree = ""; 178 | }; 179 | A24D4F1CD3CF63D181FAD7C8FD44328E /* Products */ = { 180 | isa = PBXGroup; 181 | children = ( 182 | 7AF0635096109F69AB5E2D2D0A2B95AE /* MTCircularSlider.framework */, 183 | 34F1E0CCD22DAD351A5EC2D075CBD070 /* Pods_MTCircularSlider_Example.framework */, 184 | F4302D9F1D6D9C2A65A3876B45550DDE /* Pods_MTCircularSlider_Tests.framework */, 185 | ); 186 | name = Products; 187 | sourceTree = ""; 188 | }; 189 | B3CBA540E8D480F76500A85C013A92E6 /* Pods-MTCircularSlider_Example */ = { 190 | isa = PBXGroup; 191 | children = ( 192 | 991361880C13B183DFBE61DFAB3C97EC /* Pods-MTCircularSlider_Example.modulemap */, 193 | 9340F112D26806DFA962FBD96D68435C /* Pods-MTCircularSlider_Example-acknowledgements.markdown */, 194 | 1A4B5960E77E5A460D222937D4820EBE /* Pods-MTCircularSlider_Example-acknowledgements.plist */, 195 | 4A384C6F7DE4491AF3415DAA5B6DF2B9 /* Pods-MTCircularSlider_Example-dummy.m */, 196 | 2133EA7DFBC74FC201F0F53FB37077D2 /* Pods-MTCircularSlider_Example-frameworks.sh */, 197 | F24DA261A7EF1D8F01D0D2BF3076270F /* Pods-MTCircularSlider_Example-Info.plist */, 198 | 1E177967562819B0BE83F8F7AEF8802E /* Pods-MTCircularSlider_Example-umbrella.h */, 199 | 16D0D5AD269A62DD5463E0E89D853679 /* Pods-MTCircularSlider_Example.debug.xcconfig */, 200 | 222C840AABF64B351C86E59ABC385708 /* Pods-MTCircularSlider_Example.release.xcconfig */, 201 | ); 202 | name = "Pods-MTCircularSlider_Example"; 203 | path = "Target Support Files/Pods-MTCircularSlider_Example"; 204 | sourceTree = ""; 205 | }; 206 | C0834CEBB1379A84116EF29F93051C60 /* iOS */ = { 207 | isa = PBXGroup; 208 | children = ( 209 | 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */, 210 | ); 211 | name = iOS; 212 | sourceTree = ""; 213 | }; 214 | CF1408CF629C7361332E53B88F7BD30C = { 215 | isa = PBXGroup; 216 | children = ( 217 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 218 | 8A12956DC84D8FF06A2C0547433810B5 /* Development Pods */, 219 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, 220 | A24D4F1CD3CF63D181FAD7C8FD44328E /* Products */, 221 | 69700A2819E1FC9751E3947AD98D2078 /* Targets Support Files */, 222 | ); 223 | sourceTree = ""; 224 | }; 225 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { 226 | isa = PBXGroup; 227 | children = ( 228 | C0834CEBB1379A84116EF29F93051C60 /* iOS */, 229 | ); 230 | name = Frameworks; 231 | sourceTree = ""; 232 | }; 233 | /* End PBXGroup section */ 234 | 235 | /* Begin PBXHeadersBuildPhase section */ 236 | 3C9FFD7944E323FBB160C3B18EC5BF13 /* Headers */ = { 237 | isa = PBXHeadersBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | F9920E41DF0E2764312992B0D3B2A446 /* Pods-MTCircularSlider_Tests-umbrella.h in Headers */, 241 | ); 242 | runOnlyForDeploymentPostprocessing = 0; 243 | }; 244 | 43DF5ECAEDDC4A40609B6C0FA2AEEA6D /* Headers */ = { 245 | isa = PBXHeadersBuildPhase; 246 | buildActionMask = 2147483647; 247 | files = ( 248 | 971241F789DCDF8ACA58A530A9AB749A /* Pods-MTCircularSlider_Example-umbrella.h in Headers */, 249 | ); 250 | runOnlyForDeploymentPostprocessing = 0; 251 | }; 252 | DCCDD795B4F2E136DA24E00134749475 /* Headers */ = { 253 | isa = PBXHeadersBuildPhase; 254 | buildActionMask = 2147483647; 255 | files = ( 256 | D808848C84F8A773B81EF7F7AEAC67BA /* MTCircularSlider-umbrella.h in Headers */, 257 | ); 258 | runOnlyForDeploymentPostprocessing = 0; 259 | }; 260 | /* End PBXHeadersBuildPhase section */ 261 | 262 | /* Begin PBXNativeTarget section */ 263 | 2B328D660AB29CCD3E847276EDF2E2F9 /* Pods-MTCircularSlider_Tests */ = { 264 | isa = PBXNativeTarget; 265 | buildConfigurationList = 557977045DEA6A08DB1E59A421C66D31 /* Build configuration list for PBXNativeTarget "Pods-MTCircularSlider_Tests" */; 266 | buildPhases = ( 267 | 3C9FFD7944E323FBB160C3B18EC5BF13 /* Headers */, 268 | D00FCD1DDCE9183AA74E51ED8C605F5D /* Sources */, 269 | 8F512A33D69C77EFF826408CAB3DBE02 /* Frameworks */, 270 | DD34CD258E9831143BFE03CB1CEB8D53 /* Resources */, 271 | ); 272 | buildRules = ( 273 | ); 274 | dependencies = ( 275 | 7EA4F02A67F061A9F31A7E238D2F4C7E /* PBXTargetDependency */, 276 | F5C79F0B8D6C26A36A660FC0F1A04856 /* PBXTargetDependency */, 277 | ); 278 | name = "Pods-MTCircularSlider_Tests"; 279 | productName = "Pods-MTCircularSlider_Tests"; 280 | productReference = F4302D9F1D6D9C2A65A3876B45550DDE /* Pods_MTCircularSlider_Tests.framework */; 281 | productType = "com.apple.product-type.framework"; 282 | }; 283 | 92509A1C2AAC8A822E4F11400D04503E /* Pods-MTCircularSlider_Example */ = { 284 | isa = PBXNativeTarget; 285 | buildConfigurationList = 258DE2B55E081FE8D243E36A5C7E252E /* Build configuration list for PBXNativeTarget "Pods-MTCircularSlider_Example" */; 286 | buildPhases = ( 287 | 43DF5ECAEDDC4A40609B6C0FA2AEEA6D /* Headers */, 288 | DDA4FF2FF73FA243963C9E32AEE1F780 /* Sources */, 289 | 6D7FF9A08F06B5128E6551236A25A714 /* Frameworks */, 290 | 75FB44F4D27D9B929F5798E11DE2618F /* Resources */, 291 | ); 292 | buildRules = ( 293 | ); 294 | dependencies = ( 295 | 188F877F9A3FE87DF6348EF24C39DD25 /* PBXTargetDependency */, 296 | ); 297 | name = "Pods-MTCircularSlider_Example"; 298 | productName = "Pods-MTCircularSlider_Example"; 299 | productReference = 34F1E0CCD22DAD351A5EC2D075CBD070 /* Pods_MTCircularSlider_Example.framework */; 300 | productType = "com.apple.product-type.framework"; 301 | }; 302 | E13134D5F16D1271EBBC7963632A7F6D /* MTCircularSlider */ = { 303 | isa = PBXNativeTarget; 304 | buildConfigurationList = 76B542AC723A0B4288815CCC17A3016C /* Build configuration list for PBXNativeTarget "MTCircularSlider" */; 305 | buildPhases = ( 306 | DCCDD795B4F2E136DA24E00134749475 /* Headers */, 307 | D4ED516AA6759B2394BD8DA38CFB3740 /* Sources */, 308 | 38BDCD8CEBE138DD2A43F7F415CF03DF /* Frameworks */, 309 | 1378A4BDE05BE917C8A366D391FC9363 /* Resources */, 310 | ); 311 | buildRules = ( 312 | ); 313 | dependencies = ( 314 | ); 315 | name = MTCircularSlider; 316 | productName = MTCircularSlider; 317 | productReference = 7AF0635096109F69AB5E2D2D0A2B95AE /* MTCircularSlider.framework */; 318 | productType = "com.apple.product-type.framework"; 319 | }; 320 | /* End PBXNativeTarget section */ 321 | 322 | /* Begin PBXProject section */ 323 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 324 | isa = PBXProject; 325 | attributes = { 326 | LastSwiftUpdateCheck = 1100; 327 | LastUpgradeCheck = 1100; 328 | }; 329 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 330 | compatibilityVersion = "Xcode 3.2"; 331 | developmentRegion = en; 332 | hasScannedForEncodings = 0; 333 | knownRegions = ( 334 | en, 335 | Base, 336 | ); 337 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 338 | productRefGroup = A24D4F1CD3CF63D181FAD7C8FD44328E /* Products */; 339 | projectDirPath = ""; 340 | projectRoot = ""; 341 | targets = ( 342 | E13134D5F16D1271EBBC7963632A7F6D /* MTCircularSlider */, 343 | 92509A1C2AAC8A822E4F11400D04503E /* Pods-MTCircularSlider_Example */, 344 | 2B328D660AB29CCD3E847276EDF2E2F9 /* Pods-MTCircularSlider_Tests */, 345 | ); 346 | }; 347 | /* End PBXProject section */ 348 | 349 | /* Begin PBXResourcesBuildPhase section */ 350 | 1378A4BDE05BE917C8A366D391FC9363 /* Resources */ = { 351 | isa = PBXResourcesBuildPhase; 352 | buildActionMask = 2147483647; 353 | files = ( 354 | ); 355 | runOnlyForDeploymentPostprocessing = 0; 356 | }; 357 | 75FB44F4D27D9B929F5798E11DE2618F /* Resources */ = { 358 | isa = PBXResourcesBuildPhase; 359 | buildActionMask = 2147483647; 360 | files = ( 361 | ); 362 | runOnlyForDeploymentPostprocessing = 0; 363 | }; 364 | DD34CD258E9831143BFE03CB1CEB8D53 /* Resources */ = { 365 | isa = PBXResourcesBuildPhase; 366 | buildActionMask = 2147483647; 367 | files = ( 368 | ); 369 | runOnlyForDeploymentPostprocessing = 0; 370 | }; 371 | /* End PBXResourcesBuildPhase section */ 372 | 373 | /* Begin PBXSourcesBuildPhase section */ 374 | D00FCD1DDCE9183AA74E51ED8C605F5D /* Sources */ = { 375 | isa = PBXSourcesBuildPhase; 376 | buildActionMask = 2147483647; 377 | files = ( 378 | 0206888F47CF596F32217F403F9CE74A /* Pods-MTCircularSlider_Tests-dummy.m in Sources */, 379 | ); 380 | runOnlyForDeploymentPostprocessing = 0; 381 | }; 382 | D4ED516AA6759B2394BD8DA38CFB3740 /* Sources */ = { 383 | isa = PBXSourcesBuildPhase; 384 | buildActionMask = 2147483647; 385 | files = ( 386 | 18845B79B9BA73E37ACA2032140ACFDB /* MTCircularSlider-dummy.m in Sources */, 387 | F9AD2A8BA9ED0683C12B055B8EBD1FA3 /* MTCircularSlider.swift in Sources */, 388 | ); 389 | runOnlyForDeploymentPostprocessing = 0; 390 | }; 391 | DDA4FF2FF73FA243963C9E32AEE1F780 /* Sources */ = { 392 | isa = PBXSourcesBuildPhase; 393 | buildActionMask = 2147483647; 394 | files = ( 395 | 1E4601C17EA0F713C0F077814948CA8B /* Pods-MTCircularSlider_Example-dummy.m in Sources */, 396 | ); 397 | runOnlyForDeploymentPostprocessing = 0; 398 | }; 399 | /* End PBXSourcesBuildPhase section */ 400 | 401 | /* Begin PBXTargetDependency section */ 402 | 188F877F9A3FE87DF6348EF24C39DD25 /* PBXTargetDependency */ = { 403 | isa = PBXTargetDependency; 404 | name = MTCircularSlider; 405 | target = E13134D5F16D1271EBBC7963632A7F6D /* MTCircularSlider */; 406 | targetProxy = F602FEFC14C7FC89BF559ED662CEEB34 /* PBXContainerItemProxy */; 407 | }; 408 | 7EA4F02A67F061A9F31A7E238D2F4C7E /* PBXTargetDependency */ = { 409 | isa = PBXTargetDependency; 410 | name = MTCircularSlider; 411 | target = E13134D5F16D1271EBBC7963632A7F6D /* MTCircularSlider */; 412 | targetProxy = E0E4A3DBA7ECF2E1B0965C72A848FA4B /* PBXContainerItemProxy */; 413 | }; 414 | F5C79F0B8D6C26A36A660FC0F1A04856 /* PBXTargetDependency */ = { 415 | isa = PBXTargetDependency; 416 | name = "Pods-MTCircularSlider_Example"; 417 | target = 92509A1C2AAC8A822E4F11400D04503E /* Pods-MTCircularSlider_Example */; 418 | targetProxy = EB2737615E3CA894978FD0D1DFE7A0F2 /* PBXContainerItemProxy */; 419 | }; 420 | /* End PBXTargetDependency section */ 421 | 422 | /* Begin XCBuildConfiguration section */ 423 | 07354152F77C4684D68C0F0B0E8B70D0 /* Release */ = { 424 | isa = XCBuildConfiguration; 425 | baseConfigurationReference = 2F2085D691CE7FD3B1595CC2572FE054 /* Pods-MTCircularSlider_Tests.release.xcconfig */; 426 | buildSettings = { 427 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 428 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 429 | CLANG_ENABLE_OBJC_WEAK = NO; 430 | CODE_SIGN_IDENTITY = ""; 431 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 432 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 433 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 434 | CURRENT_PROJECT_VERSION = 1; 435 | DEFINES_MODULE = YES; 436 | DYLIB_COMPATIBILITY_VERSION = 1; 437 | DYLIB_CURRENT_VERSION = 1; 438 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 439 | INFOPLIST_FILE = "Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests-Info.plist"; 440 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 441 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 442 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 443 | MACH_O_TYPE = staticlib; 444 | MODULEMAP_FILE = "Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests.modulemap"; 445 | OTHER_LDFLAGS = ""; 446 | OTHER_LIBTOOLFLAGS = ""; 447 | PODS_ROOT = "$(SRCROOT)"; 448 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 449 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 450 | SDKROOT = iphoneos; 451 | SKIP_INSTALL = YES; 452 | SWIFT_VERSION = 4.1; 453 | TARGETED_DEVICE_FAMILY = "1,2"; 454 | VALIDATE_PRODUCT = YES; 455 | VERSIONING_SYSTEM = "apple-generic"; 456 | VERSION_INFO_PREFIX = ""; 457 | }; 458 | name = Release; 459 | }; 460 | 204B8AEA4AE90A551A1768B355C2F9F0 /* Debug */ = { 461 | isa = XCBuildConfiguration; 462 | buildSettings = { 463 | ALWAYS_SEARCH_USER_PATHS = NO; 464 | CLANG_ANALYZER_NONNULL = YES; 465 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 466 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 467 | CLANG_CXX_LIBRARY = "libc++"; 468 | CLANG_ENABLE_MODULES = YES; 469 | CLANG_ENABLE_OBJC_ARC = YES; 470 | CLANG_ENABLE_OBJC_WEAK = YES; 471 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 472 | CLANG_WARN_BOOL_CONVERSION = YES; 473 | CLANG_WARN_COMMA = YES; 474 | CLANG_WARN_CONSTANT_CONVERSION = YES; 475 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 476 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 477 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 478 | CLANG_WARN_EMPTY_BODY = YES; 479 | CLANG_WARN_ENUM_CONVERSION = YES; 480 | CLANG_WARN_INFINITE_RECURSION = YES; 481 | CLANG_WARN_INT_CONVERSION = YES; 482 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 483 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 484 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 485 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 486 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 487 | CLANG_WARN_STRICT_PROTOTYPES = YES; 488 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 489 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 490 | CLANG_WARN_UNREACHABLE_CODE = YES; 491 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 492 | COPY_PHASE_STRIP = NO; 493 | DEBUG_INFORMATION_FORMAT = dwarf; 494 | ENABLE_STRICT_OBJC_MSGSEND = YES; 495 | ENABLE_TESTABILITY = YES; 496 | GCC_C_LANGUAGE_STANDARD = gnu11; 497 | GCC_DYNAMIC_NO_PIC = NO; 498 | GCC_NO_COMMON_BLOCKS = YES; 499 | GCC_OPTIMIZATION_LEVEL = 0; 500 | GCC_PREPROCESSOR_DEFINITIONS = ( 501 | "POD_CONFIGURATION_DEBUG=1", 502 | "DEBUG=1", 503 | "$(inherited)", 504 | ); 505 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 506 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 507 | GCC_WARN_UNDECLARED_SELECTOR = YES; 508 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 509 | GCC_WARN_UNUSED_FUNCTION = YES; 510 | GCC_WARN_UNUSED_VARIABLE = YES; 511 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 512 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 513 | MTL_FAST_MATH = YES; 514 | ONLY_ACTIVE_ARCH = YES; 515 | PRODUCT_NAME = "$(TARGET_NAME)"; 516 | STRIP_INSTALLED_PRODUCT = NO; 517 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 518 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 519 | SWIFT_VERSION = 5.0; 520 | SYMROOT = "${SRCROOT}/../build"; 521 | }; 522 | name = Debug; 523 | }; 524 | 3427AA25FEFDB77EB031FC18624193CB /* Debug */ = { 525 | isa = XCBuildConfiguration; 526 | baseConfigurationReference = 5C2AD9619A0924B575EC76D5E6C15D9A /* Pods-MTCircularSlider_Tests.debug.xcconfig */; 527 | buildSettings = { 528 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 529 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 530 | CLANG_ENABLE_OBJC_WEAK = NO; 531 | CODE_SIGN_IDENTITY = ""; 532 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 533 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 534 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 535 | CURRENT_PROJECT_VERSION = 1; 536 | DEFINES_MODULE = YES; 537 | DYLIB_COMPATIBILITY_VERSION = 1; 538 | DYLIB_CURRENT_VERSION = 1; 539 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 540 | INFOPLIST_FILE = "Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests-Info.plist"; 541 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 542 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 543 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 544 | MACH_O_TYPE = staticlib; 545 | MODULEMAP_FILE = "Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests.modulemap"; 546 | OTHER_LDFLAGS = ""; 547 | OTHER_LIBTOOLFLAGS = ""; 548 | PODS_ROOT = "$(SRCROOT)"; 549 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 550 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 551 | SDKROOT = iphoneos; 552 | SKIP_INSTALL = YES; 553 | SWIFT_VERSION = 4.1; 554 | TARGETED_DEVICE_FAMILY = "1,2"; 555 | VERSIONING_SYSTEM = "apple-generic"; 556 | VERSION_INFO_PREFIX = ""; 557 | }; 558 | name = Debug; 559 | }; 560 | 3CCC6195EDBEE5DA2A49DF962113BE16 /* Release */ = { 561 | isa = XCBuildConfiguration; 562 | buildSettings = { 563 | ALWAYS_SEARCH_USER_PATHS = NO; 564 | CLANG_ANALYZER_NONNULL = YES; 565 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 566 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 567 | CLANG_CXX_LIBRARY = "libc++"; 568 | CLANG_ENABLE_MODULES = YES; 569 | CLANG_ENABLE_OBJC_ARC = YES; 570 | CLANG_ENABLE_OBJC_WEAK = YES; 571 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 572 | CLANG_WARN_BOOL_CONVERSION = YES; 573 | CLANG_WARN_COMMA = YES; 574 | CLANG_WARN_CONSTANT_CONVERSION = YES; 575 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 576 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 577 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 578 | CLANG_WARN_EMPTY_BODY = YES; 579 | CLANG_WARN_ENUM_CONVERSION = YES; 580 | CLANG_WARN_INFINITE_RECURSION = YES; 581 | CLANG_WARN_INT_CONVERSION = YES; 582 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 583 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 584 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 585 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 586 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 587 | CLANG_WARN_STRICT_PROTOTYPES = YES; 588 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 589 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 590 | CLANG_WARN_UNREACHABLE_CODE = YES; 591 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 592 | COPY_PHASE_STRIP = NO; 593 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 594 | ENABLE_NS_ASSERTIONS = NO; 595 | ENABLE_STRICT_OBJC_MSGSEND = YES; 596 | GCC_C_LANGUAGE_STANDARD = gnu11; 597 | GCC_NO_COMMON_BLOCKS = YES; 598 | GCC_PREPROCESSOR_DEFINITIONS = ( 599 | "POD_CONFIGURATION_RELEASE=1", 600 | "$(inherited)", 601 | ); 602 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 603 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 604 | GCC_WARN_UNDECLARED_SELECTOR = YES; 605 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 606 | GCC_WARN_UNUSED_FUNCTION = YES; 607 | GCC_WARN_UNUSED_VARIABLE = YES; 608 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 609 | MTL_ENABLE_DEBUG_INFO = NO; 610 | MTL_FAST_MATH = YES; 611 | PRODUCT_NAME = "$(TARGET_NAME)"; 612 | STRIP_INSTALLED_PRODUCT = NO; 613 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 614 | SWIFT_VERSION = 5.0; 615 | SYMROOT = "${SRCROOT}/../build"; 616 | }; 617 | name = Release; 618 | }; 619 | 7E3A6D9EC85A3823A6B40A67F5B29860 /* Release */ = { 620 | isa = XCBuildConfiguration; 621 | baseConfigurationReference = 858EE1411FDC06B4BEBF26868EB089C6 /* MTCircularSlider.xcconfig */; 622 | buildSettings = { 623 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 624 | CLANG_ENABLE_OBJC_WEAK = NO; 625 | CODE_SIGN_IDENTITY = ""; 626 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 627 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 628 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 629 | CURRENT_PROJECT_VERSION = 1; 630 | DEFINES_MODULE = YES; 631 | DYLIB_COMPATIBILITY_VERSION = 1; 632 | DYLIB_CURRENT_VERSION = 1; 633 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 634 | GCC_PREFIX_HEADER = "Target Support Files/MTCircularSlider/MTCircularSlider-prefix.pch"; 635 | INFOPLIST_FILE = "Target Support Files/MTCircularSlider/MTCircularSlider-Info.plist"; 636 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 637 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 638 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 639 | MODULEMAP_FILE = "Target Support Files/MTCircularSlider/MTCircularSlider.modulemap"; 640 | PRODUCT_MODULE_NAME = MTCircularSlider; 641 | PRODUCT_NAME = MTCircularSlider; 642 | SDKROOT = iphoneos; 643 | SKIP_INSTALL = YES; 644 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 645 | SWIFT_VERSION = 4.1; 646 | TARGETED_DEVICE_FAMILY = "1,2"; 647 | VALIDATE_PRODUCT = YES; 648 | VERSIONING_SYSTEM = "apple-generic"; 649 | VERSION_INFO_PREFIX = ""; 650 | }; 651 | name = Release; 652 | }; 653 | E3ADA803E97D367BB69C8E5AD1EAD6B1 /* Release */ = { 654 | isa = XCBuildConfiguration; 655 | baseConfigurationReference = 222C840AABF64B351C86E59ABC385708 /* Pods-MTCircularSlider_Example.release.xcconfig */; 656 | buildSettings = { 657 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 658 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 659 | CLANG_ENABLE_OBJC_WEAK = NO; 660 | CODE_SIGN_IDENTITY = ""; 661 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 662 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 663 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 664 | CURRENT_PROJECT_VERSION = 1; 665 | DEFINES_MODULE = YES; 666 | DYLIB_COMPATIBILITY_VERSION = 1; 667 | DYLIB_CURRENT_VERSION = 1; 668 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 669 | INFOPLIST_FILE = "Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example-Info.plist"; 670 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 671 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 672 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 673 | MACH_O_TYPE = staticlib; 674 | MODULEMAP_FILE = "Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example.modulemap"; 675 | OTHER_LDFLAGS = ""; 676 | OTHER_LIBTOOLFLAGS = ""; 677 | PODS_ROOT = "$(SRCROOT)"; 678 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 679 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 680 | SDKROOT = iphoneos; 681 | SKIP_INSTALL = YES; 682 | SWIFT_VERSION = 4.1; 683 | TARGETED_DEVICE_FAMILY = "1,2"; 684 | VALIDATE_PRODUCT = YES; 685 | VERSIONING_SYSTEM = "apple-generic"; 686 | VERSION_INFO_PREFIX = ""; 687 | }; 688 | name = Release; 689 | }; 690 | F4C9A2E500E5A1E2C69CBAA9EC701DFD /* Debug */ = { 691 | isa = XCBuildConfiguration; 692 | baseConfigurationReference = 858EE1411FDC06B4BEBF26868EB089C6 /* MTCircularSlider.xcconfig */; 693 | buildSettings = { 694 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 695 | CLANG_ENABLE_OBJC_WEAK = NO; 696 | CODE_SIGN_IDENTITY = ""; 697 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 698 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 699 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 700 | CURRENT_PROJECT_VERSION = 1; 701 | DEFINES_MODULE = YES; 702 | DYLIB_COMPATIBILITY_VERSION = 1; 703 | DYLIB_CURRENT_VERSION = 1; 704 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 705 | GCC_PREFIX_HEADER = "Target Support Files/MTCircularSlider/MTCircularSlider-prefix.pch"; 706 | INFOPLIST_FILE = "Target Support Files/MTCircularSlider/MTCircularSlider-Info.plist"; 707 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 708 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 709 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 710 | MODULEMAP_FILE = "Target Support Files/MTCircularSlider/MTCircularSlider.modulemap"; 711 | PRODUCT_MODULE_NAME = MTCircularSlider; 712 | PRODUCT_NAME = MTCircularSlider; 713 | SDKROOT = iphoneos; 714 | SKIP_INSTALL = YES; 715 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 716 | SWIFT_VERSION = 4.1; 717 | TARGETED_DEVICE_FAMILY = "1,2"; 718 | VERSIONING_SYSTEM = "apple-generic"; 719 | VERSION_INFO_PREFIX = ""; 720 | }; 721 | name = Debug; 722 | }; 723 | F602DE6C96AD3C7FF3840C194CB8C63A /* Debug */ = { 724 | isa = XCBuildConfiguration; 725 | baseConfigurationReference = 16D0D5AD269A62DD5463E0E89D853679 /* Pods-MTCircularSlider_Example.debug.xcconfig */; 726 | buildSettings = { 727 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 728 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 729 | CLANG_ENABLE_OBJC_WEAK = NO; 730 | CODE_SIGN_IDENTITY = ""; 731 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 732 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 733 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 734 | CURRENT_PROJECT_VERSION = 1; 735 | DEFINES_MODULE = YES; 736 | DYLIB_COMPATIBILITY_VERSION = 1; 737 | DYLIB_CURRENT_VERSION = 1; 738 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 739 | INFOPLIST_FILE = "Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example-Info.plist"; 740 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 741 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 742 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 743 | MACH_O_TYPE = staticlib; 744 | MODULEMAP_FILE = "Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example.modulemap"; 745 | OTHER_LDFLAGS = ""; 746 | OTHER_LIBTOOLFLAGS = ""; 747 | PODS_ROOT = "$(SRCROOT)"; 748 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 749 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 750 | SDKROOT = iphoneos; 751 | SKIP_INSTALL = YES; 752 | SWIFT_VERSION = 4.1; 753 | TARGETED_DEVICE_FAMILY = "1,2"; 754 | VERSIONING_SYSTEM = "apple-generic"; 755 | VERSION_INFO_PREFIX = ""; 756 | }; 757 | name = Debug; 758 | }; 759 | /* End XCBuildConfiguration section */ 760 | 761 | /* Begin XCConfigurationList section */ 762 | 258DE2B55E081FE8D243E36A5C7E252E /* Build configuration list for PBXNativeTarget "Pods-MTCircularSlider_Example" */ = { 763 | isa = XCConfigurationList; 764 | buildConfigurations = ( 765 | F602DE6C96AD3C7FF3840C194CB8C63A /* Debug */, 766 | E3ADA803E97D367BB69C8E5AD1EAD6B1 /* Release */, 767 | ); 768 | defaultConfigurationIsVisible = 0; 769 | defaultConfigurationName = Release; 770 | }; 771 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 772 | isa = XCConfigurationList; 773 | buildConfigurations = ( 774 | 204B8AEA4AE90A551A1768B355C2F9F0 /* Debug */, 775 | 3CCC6195EDBEE5DA2A49DF962113BE16 /* Release */, 776 | ); 777 | defaultConfigurationIsVisible = 0; 778 | defaultConfigurationName = Release; 779 | }; 780 | 557977045DEA6A08DB1E59A421C66D31 /* Build configuration list for PBXNativeTarget "Pods-MTCircularSlider_Tests" */ = { 781 | isa = XCConfigurationList; 782 | buildConfigurations = ( 783 | 3427AA25FEFDB77EB031FC18624193CB /* Debug */, 784 | 07354152F77C4684D68C0F0B0E8B70D0 /* Release */, 785 | ); 786 | defaultConfigurationIsVisible = 0; 787 | defaultConfigurationName = Release; 788 | }; 789 | 76B542AC723A0B4288815CCC17A3016C /* Build configuration list for PBXNativeTarget "MTCircularSlider" */ = { 790 | isa = XCConfigurationList; 791 | buildConfigurations = ( 792 | F4C9A2E500E5A1E2C69CBAA9EC701DFD /* Debug */, 793 | 7E3A6D9EC85A3823A6B40A67F5B29860 /* Release */, 794 | ); 795 | defaultConfigurationIsVisible = 0; 796 | defaultConfigurationName = Release; 797 | }; 798 | /* End XCConfigurationList section */ 799 | }; 800 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 801 | } 802 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/MTCircularSlider/MTCircularSlider-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.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/MTCircularSlider/MTCircularSlider-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_MTCircularSlider : NSObject 3 | @end 4 | @implementation PodsDummy_MTCircularSlider 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/MTCircularSlider/MTCircularSlider-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/MTCircularSlider/MTCircularSlider-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 MTCircularSliderVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char MTCircularSliderVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/MTCircularSlider/MTCircularSlider.modulemap: -------------------------------------------------------------------------------- 1 | framework module MTCircularSlider { 2 | umbrella header "MTCircularSlider-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/MTCircularSlider/MTCircularSlider.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MTCircularSlider 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 11 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example-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-MTCircularSlider_Example/Pods-MTCircularSlider_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## MTCircularSlider 5 | 6 | <<<<<<< HEAD 7 | Copyright (c) 2016 Eran Boudjnah 8 | ======= 9 | The MIT License (MIT) 10 | 11 | Copyright (c) 2016 EranBoudjnah 12 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 13 | 14 | Permission is hereby granted, free of charge, to any person obtaining a copy 15 | of this software and associated documentation files (the "Software"), to deal 16 | in the Software without restriction, including without limitation the rights 17 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 18 | copies of the Software, and to permit persons to whom the Software is 19 | furnished to do so, subject to the following conditions: 20 | 21 | <<<<<<< HEAD 22 | The above copyright notice and this permission notice shall be included in 23 | all copies or substantial portions of the Software. 24 | ======= 25 | The above copyright notice and this permission notice shall be included in all 26 | copies or substantial portions of the Software. 27 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | <<<<<<< HEAD 35 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 36 | THE SOFTWARE. 37 | ======= 38 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 39 | SOFTWARE. 40 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 41 | 42 | Generated by CocoaPods - https://cocoapods.org 43 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example-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 | <<<<<<< HEAD 18 | Copyright (c) 2016 Eran Boudjnah <eranbou@gmail.com> 19 | ======= 20 | The MIT License (MIT) 21 | 22 | Copyright (c) 2016 EranBoudjnah 23 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 24 | 25 | Permission is hereby granted, free of charge, to any person obtaining a copy 26 | of this software and associated documentation files (the "Software"), to deal 27 | in the Software without restriction, including without limitation the rights 28 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 29 | copies of the Software, and to permit persons to whom the Software is 30 | furnished to do so, subject to the following conditions: 31 | 32 | <<<<<<< HEAD 33 | The above copyright notice and this permission notice shall be included in 34 | all copies or substantial portions of the Software. 35 | ======= 36 | The above copyright notice and this permission notice shall be included in all 37 | copies or substantial portions of the Software. 38 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 39 | 40 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 41 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 42 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 43 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 44 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 45 | <<<<<<< HEAD 46 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 47 | THE SOFTWARE. 48 | ======= 49 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 50 | SOFTWARE. 51 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 52 | 53 | License 54 | MIT 55 | Title 56 | MTCircularSlider 57 | Type 58 | PSGroupSpecifier 59 | 60 | 61 | FooterText 62 | Generated by CocoaPods - https://cocoapods.org 63 | Title 64 | 65 | Type 66 | PSGroupSpecifier 67 | 68 | 69 | StringsTable 70 | Acknowledgements 71 | Title 72 | Acknowledgements 73 | 74 | 75 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_MTCircularSlider_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_MTCircularSlider_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example-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 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | if [ -r "$source" ]; then 88 | # Copy the dSYM into a the targets temp dir. 89 | 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}\"" 90 | 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}" 91 | 92 | local basename 93 | basename="$(basename -s .framework.dSYM "$source")" 94 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 95 | 96 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 97 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 98 | strip_invalid_archs "$binary" 99 | fi 100 | 101 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 102 | # Move the stripped file into its final destination. 103 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 104 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 105 | else 106 | # 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. 107 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 108 | fi 109 | fi 110 | } 111 | 112 | # Copies the bcsymbolmap files of a vendored framework 113 | install_bcsymbolmap() { 114 | local bcsymbolmap_path="$1" 115 | local destination="${BUILT_PRODUCTS_DIR}" 116 | 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}"" 117 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 118 | } 119 | 120 | # Signs a framework with the provided identity 121 | code_sign_if_enabled() { 122 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 123 | # Use the current code_sign_identity 124 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 125 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 126 | 127 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 128 | code_sign_cmd="$code_sign_cmd &" 129 | fi 130 | echo "$code_sign_cmd" 131 | eval "$code_sign_cmd" 132 | fi 133 | } 134 | 135 | # Strip invalid architectures 136 | strip_invalid_archs() { 137 | binary="$1" 138 | # Get architectures for current target binary 139 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 140 | # Intersect them with the architectures we are building for 141 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 142 | # If there are no archs supported by this binary then warn the user 143 | if [[ -z "$intersected_archs" ]]; then 144 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 145 | STRIP_BINARY_RETVAL=0 146 | return 147 | fi 148 | stripped="" 149 | for arch in $binary_archs; do 150 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 151 | # Strip non-valid architectures in-place 152 | lipo -remove "$arch" -output "$binary" "$binary" 153 | stripped="$stripped $arch" 154 | fi 155 | done 156 | if [[ "$stripped" ]]; then 157 | echo "Stripped $binary of architectures:$stripped" 158 | fi 159 | STRIP_BINARY_RETVAL=1 160 | } 161 | 162 | 163 | if [[ "$CONFIGURATION" == "Debug" ]]; then 164 | install_framework "${BUILT_PRODUCTS_DIR}/MTCircularSlider/MTCircularSlider.framework" 165 | fi 166 | if [[ "$CONFIGURATION" == "Release" ]]; then 167 | install_framework "${BUILT_PRODUCTS_DIR}/MTCircularSlider/MTCircularSlider.framework" 168 | fi 169 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 170 | wait 171 | fi 172 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example-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_MTCircularSlider_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_MTCircularSlider_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MTCircularSlider" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MTCircularSlider/MTCircularSlider.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "MTCircularSlider" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_MTCircularSlider_Example { 2 | umbrella header "Pods-MTCircularSlider_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Example/Pods-MTCircularSlider_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MTCircularSlider" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MTCircularSlider/MTCircularSlider.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "MTCircularSlider" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests-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-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## MTCircularSlider 5 | 6 | <<<<<<< HEAD 7 | Copyright (c) 2016 Eran Boudjnah 8 | ======= 9 | The MIT License (MIT) 10 | 11 | Copyright (c) 2016 EranBoudjnah 12 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 13 | 14 | Permission is hereby granted, free of charge, to any person obtaining a copy 15 | of this software and associated documentation files (the "Software"), to deal 16 | in the Software without restriction, including without limitation the rights 17 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 18 | copies of the Software, and to permit persons to whom the Software is 19 | furnished to do so, subject to the following conditions: 20 | 21 | <<<<<<< HEAD 22 | The above copyright notice and this permission notice shall be included in 23 | all copies or substantial portions of the Software. 24 | ======= 25 | The above copyright notice and this permission notice shall be included in all 26 | copies or substantial portions of the Software. 27 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | <<<<<<< HEAD 35 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 36 | THE SOFTWARE. 37 | ======= 38 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 39 | SOFTWARE. 40 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 41 | 42 | Generated by CocoaPods - https://cocoapods.org 43 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests-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 | <<<<<<< HEAD 18 | Copyright (c) 2016 Eran Boudjnah <eranbou@gmail.com> 19 | ======= 20 | The MIT License (MIT) 21 | 22 | Copyright (c) 2016 EranBoudjnah 23 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 24 | 25 | Permission is hereby granted, free of charge, to any person obtaining a copy 26 | of this software and associated documentation files (the "Software"), to deal 27 | in the Software without restriction, including without limitation the rights 28 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 29 | copies of the Software, and to permit persons to whom the Software is 30 | furnished to do so, subject to the following conditions: 31 | 32 | <<<<<<< HEAD 33 | The above copyright notice and this permission notice shall be included in 34 | all copies or substantial portions of the Software. 35 | ======= 36 | The above copyright notice and this permission notice shall be included in all 37 | copies or substantial portions of the Software. 38 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 39 | 40 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 41 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 42 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 43 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 44 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 45 | <<<<<<< HEAD 46 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 47 | THE SOFTWARE. 48 | ======= 49 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 50 | SOFTWARE. 51 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 52 | 53 | License 54 | MIT 55 | Title 56 | MTCircularSlider 57 | Type 58 | PSGroupSpecifier 59 | 60 | 61 | FooterText 62 | Generated by CocoaPods - https://cocoapods.org 63 | Title 64 | 65 | Type 66 | PSGroupSpecifier 67 | 68 | 69 | StringsTable 70 | Acknowledgements 71 | Title 72 | Acknowledgements 73 | 74 | 75 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_MTCircularSlider_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_MTCircularSlider_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests-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 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | if [ -r "$source" ]; then 88 | # Copy the dSYM into a the targets temp dir. 89 | 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}\"" 90 | 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}" 91 | 92 | local basename 93 | basename="$(basename -s .framework.dSYM "$source")" 94 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 95 | 96 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 97 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 98 | strip_invalid_archs "$binary" 99 | fi 100 | 101 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 102 | # Move the stripped file into its final destination. 103 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 104 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 105 | else 106 | # 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. 107 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 108 | fi 109 | fi 110 | } 111 | 112 | # Copies the bcsymbolmap files of a vendored framework 113 | install_bcsymbolmap() { 114 | local bcsymbolmap_path="$1" 115 | local destination="${BUILT_PRODUCTS_DIR}" 116 | 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}"" 117 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 118 | } 119 | 120 | # Signs a framework with the provided identity 121 | code_sign_if_enabled() { 122 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 123 | # Use the current code_sign_identity 124 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 125 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 126 | 127 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 128 | code_sign_cmd="$code_sign_cmd &" 129 | fi 130 | echo "$code_sign_cmd" 131 | eval "$code_sign_cmd" 132 | fi 133 | } 134 | 135 | # Strip invalid architectures 136 | strip_invalid_archs() { 137 | binary="$1" 138 | # Get architectures for current target binary 139 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 140 | # Intersect them with the architectures we are building for 141 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 142 | # If there are no archs supported by this binary then warn the user 143 | if [[ -z "$intersected_archs" ]]; then 144 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 145 | STRIP_BINARY_RETVAL=0 146 | return 147 | fi 148 | stripped="" 149 | for arch in $binary_archs; do 150 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 151 | # Strip non-valid architectures in-place 152 | lipo -remove "$arch" -output "$binary" "$binary" 153 | stripped="$stripped $arch" 154 | fi 155 | done 156 | if [[ "$stripped" ]]; then 157 | echo "Stripped $binary of architectures:$stripped" 158 | fi 159 | STRIP_BINARY_RETVAL=1 160 | } 161 | 162 | 163 | if [[ "$CONFIGURATION" == "Debug" ]]; then 164 | install_framework "${BUILT_PRODUCTS_DIR}/MTCircularSlider/MTCircularSlider.framework" 165 | fi 166 | if [[ "$CONFIGURATION" == "Release" ]]; then 167 | install_framework "${BUILT_PRODUCTS_DIR}/MTCircularSlider/MTCircularSlider.framework" 168 | fi 169 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 170 | wait 171 | fi 172 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests-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_MTCircularSlider_TestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_MTCircularSlider_TestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MTCircularSlider" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MTCircularSlider/MTCircularSlider.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "MTCircularSlider" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_MTCircularSlider_Tests { 2 | umbrella header "Pods-MTCircularSlider_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MTCircularSlider_Tests/Pods-MTCircularSlider_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MTCircularSlider" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MTCircularSlider/MTCircularSlider.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "MTCircularSlider" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Tests/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 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Tests/Tests.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import XCTest 3 | 4 | @testable import MTCircularSlider 5 | 6 | class Tests: XCTestCase { 7 | var slider: MTCircularSlider? 8 | 9 | override func setUp() { 10 | super.setUp() 11 | 12 | slider = MTCircularSlider(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 100, height: 100))) 13 | } 14 | 15 | override func tearDown() { 16 | slider = nil 17 | 18 | super.tearDown() 19 | } 20 | 21 | func testDefaultValueAndLimits() { 22 | let slider = self.slider! 23 | XCTAssertEqual(slider.value, 0.5) 24 | XCTAssertEqual(slider.valueMinimum, 0) 25 | XCTAssertEqual(slider.valueMaximum, 1) 26 | } 27 | 28 | func testValueManipulation() { 29 | let slider = self.slider! 30 | slider.valueMinimum = -100 31 | XCTAssertEqual(slider.valueMinimum, -100) 32 | slider.valueMaximum = 100 33 | XCTAssertEqual(slider.valueMaximum, 100) 34 | slider.value = 0 35 | XCTAssertEqual(slider.value, 0) 36 | slider.value = -110 37 | XCTAssertEqual(slider.value, -100) 38 | slider.valueMinimum = -90 39 | XCTAssertEqual(slider.valueMinimum, -90) 40 | XCTAssertEqual(slider.value, -90) 41 | 42 | slider.value = 110 43 | XCTAssertEqual(slider.value, 100) 44 | 45 | slider.valueMaximum = 90 46 | XCTAssertEqual(slider.valueMaximum, 90) 47 | XCTAssertEqual(slider.value, 90) 48 | } 49 | 50 | func testAttributeSetting() { 51 | let slider = self.slider! 52 | 53 | /* Track */ 54 | XCTAssertEqual(slider.minTrackTint, UIColor(red: 0.0, green: 0.478, blue: 1.0, alpha: 1.0)) 55 | XCTAssertEqual(slider.maxTrackTint, UIColor(red: 0.71, green: 0.71, blue: 0.71, alpha: 1.0)) 56 | XCTAssertEqual(slider.trackWidth, 2) 57 | XCTAssertEqual(slider.trackShadowRadius, 0) 58 | XCTAssertEqual(slider.trackShadowDepth, 0) 59 | XCTAssertEqual(slider.trackMinAngle, 0) 60 | XCTAssertEqual(slider.trackMaxAngle, 360) 61 | XCTAssertEqual(slider.areTrackCapsRound, false) 62 | 63 | /* Thumb */ 64 | XCTAssertEqual(slider.hasThumb, true) 65 | XCTAssertEqual(slider.thumbTint, .white) 66 | XCTAssertEqual(slider.thumbRadius, 14) 67 | XCTAssertEqual(slider.thumbShadowRadius, 2) 68 | XCTAssertEqual(slider.thumbShadowDepth, 3) 69 | 70 | let newAttributes: [Attributes] = [ 71 | /* Track */ 72 | Attributes.minTrackTint(.black), 73 | Attributes.maxTrackTint(.red), 74 | Attributes.trackWidth(10), 75 | Attributes.trackShadowRadius(5), 76 | Attributes.trackShadowDepth(4), 77 | Attributes.trackMinAngle(90), 78 | Attributes.trackMaxAngle(270), 79 | Attributes.areTrackCapsRound(true), 80 | 81 | /* Thumb */ 82 | Attributes.hasThumb(false), 83 | Attributes.thumbTint(UIColor.green), 84 | Attributes.thumbRadius(8), 85 | Attributes.thumbShadowRadius(0), 86 | Attributes.thumbShadowDepth(4) 87 | ] 88 | 89 | slider.applyAttributes(newAttributes) 90 | 91 | /* Track */ 92 | XCTAssertEqual(slider.minTrackTint, UIColor.black) 93 | XCTAssertEqual(slider.maxTrackTint, UIColor.red) 94 | XCTAssertEqual(slider.trackWidth, 10) 95 | XCTAssertEqual(slider.trackShadowRadius, 5) 96 | XCTAssertEqual(slider.trackShadowDepth, 4) 97 | XCTAssertEqual(slider.trackMinAngle, 90) 98 | XCTAssertEqual(slider.trackMaxAngle, 270) 99 | XCTAssertEqual(slider.areTrackCapsRound, true) 100 | 101 | /* Thumb */ 102 | XCTAssertEqual(slider.hasThumb, false) 103 | XCTAssertEqual(slider.thumbTint, UIColor.green) 104 | XCTAssertEqual(slider.thumbRadius, 8) 105 | XCTAssertEqual(slider.thumbShadowRadius, 0) 106 | XCTAssertEqual(slider.thumbShadowDepth, 4) 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | <<<<<<< HEAD 2 | Copyright (c) 2016 Eran Boudjnah 3 | ======= 4 | The MIT License (MIT) 5 | 6 | Copyright (c) 2016 EranBoudjnah 7 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy 10 | of this software and associated documentation files (the "Software"), to deal 11 | in the Software without restriction, including without limitation the rights 12 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | copies of the Software, and to permit persons to whom the Software is 14 | furnished to do so, subject to the following conditions: 15 | 16 | <<<<<<< HEAD 17 | The above copyright notice and this permission notice shall be included in 18 | all copies or substantial portions of the Software. 19 | ======= 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 23 | 24 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 25 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 26 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 27 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 28 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 29 | <<<<<<< HEAD 30 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 31 | THE SOFTWARE. 32 | ======= 33 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 34 | SOFTWARE. 35 | >>>>>>> 1c4acaba914c1bcb2c9abf6ae49ca07b1dea1f02 36 | -------------------------------------------------------------------------------- /MTCircularSlider.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint MTCircularSlider.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'MTCircularSlider' 11 | s.version = '1.2.1' 12 | s.summary = 'A circular slider control.' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | A feature-rich circular slider control. You can tweak colors, shadows, angles and windings. 22 | This widget tries to conform to UISlider both in naming and default style. 23 | DESC 24 | 25 | s.homepage = 'https://github.com/EranBoudjnah/MTCircularSlider' 26 | s.screenshots = 'https://user-images.githubusercontent.com/24318356/106140467-7e209880-6177-11eb-932a-3541f05273e9.gifhttps://user-images.githubusercontent.com/24318356/106140467-7e209880-6177-11eb-932a-3541f05273e9.gif' 27 | s.license = { :type => 'MIT', :file => 'LICENSE' } 28 | s.author = { 'Eran Boudjnah' => 'eranbou@gmail.com' } 29 | s.source = { :git => 'https://github.com/EranBoudjnah/MTCircularSlider.git', :tag => s.version.to_s } 30 | s.social_media_url = 'https://www.linkedin.com/in/eranboudjnah/' 31 | 32 | s.ios.deployment_target = '12.0' 33 | s.swift_versions = '5.0' 34 | 35 | s.source_files = 'MTCircularSlider/Classes/**/*' 36 | 37 | # s.resource_bundles = { 38 | # 'MTCircularSlider' => ['MTCircularSlider/Assets/*.png'] 39 | # } 40 | 41 | # s.public_header_files = 'Pod/Classes/**/*.h' 42 | # s.frameworks = 'UIKit', 'MapKit' 43 | # s.dependency 'AFNetworking', '~> 2.3' 44 | end 45 | -------------------------------------------------------------------------------- /MTCircularSlider/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EranBoudjnah/MTCircularSlider/c16eb37b524f82912add90240ca1903cc448f44e/MTCircularSlider/Assets/.gitkeep -------------------------------------------------------------------------------- /MTCircularSlider/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EranBoudjnah/MTCircularSlider/c16eb37b524f82912add90240ca1903cc448f44e/MTCircularSlider/Classes/.gitkeep -------------------------------------------------------------------------------- /MTCircularSlider/Classes/MTCircularSlider.swift: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2016 Eran Boudjnah 3 | * 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy 5 | * of this software and associated documentation files (the "Software"), to deal 6 | * in the Software without restriction, including without limitation the rights 7 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | * copies of the Software, and to permit persons to whom the Software is 9 | * furnished to do so, subject to the following conditions: 10 | * 11 | * The above copyright notice and this permission notice shall be included in 12 | * all copies or substantial portions of the Software. 13 | * 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | * THE SOFTWARE. 21 | */ 22 | 23 | import UIKit 24 | 25 | public enum MTCircularSliderError: Error { 26 | case windingsSetToPartialSlider 27 | } 28 | 29 | // MARK: - Attributes for configuring a MTKnobView. 30 | public enum Attributes { 31 | // MARK: Track style 32 | case minTrackTint(UIColor) 33 | case maxTrackTint(UIColor) 34 | case trackWidth(CGFloat) 35 | case trackShadowRadius(CGFloat) 36 | case trackShadowDepth(CGFloat) 37 | case trackMinAngle(CGFloat) 38 | case trackMaxAngle(CGFloat) 39 | case areTrackCapsRound(Bool) 40 | case maxWinds(CGFloat) 41 | 42 | // MARK: Thumb style 43 | case hasThumb(Bool) 44 | case thumbTint(UIColor) 45 | case thumbRadius(CGFloat) 46 | case thumbShadowRadius(CGFloat) 47 | case thumbShadowDepth(CGFloat) 48 | case thumbBorderWidth(CGFloat) 49 | case thumbBorderColor(UIColor) 50 | 51 | // MARK: View properties 52 | case touchPadding(CGFloat) 53 | } 54 | 55 | @IBDesignable 56 | open class MTCircularSlider: UIControl { 57 | @IBInspectable 58 | var minTrackTint: UIColor = UIColor(red: 0.0, green: 0.478, blue: 1.0, alpha: 1.0) 59 | 60 | @IBInspectable 61 | var maxTrackTint: UIColor = UIColor(red: 0.71, green: 0.71, blue: 0.71, alpha: 1.0) 62 | 63 | @IBInspectable 64 | var trackWidth: CGFloat = 2.0 { didSet { setNeedsDisplay() } } 65 | 66 | @IBInspectable 67 | var trackShadowRadius: CGFloat = 0.0 { didSet { setNeedsDisplay() } } 68 | 69 | @IBInspectable 70 | var trackShadowDepth: CGFloat = 0.0 { didSet { setNeedsDisplay() } } 71 | 72 | @IBInspectable 73 | var trackMinAngle: CGFloat = 0.0 { 74 | didSet { 75 | do { 76 | try noWindingIfNotFullCircle() 77 | } catch MTCircularSliderError.windingsSetToPartialSlider { 78 | print("Error: Cannot set maxWinds to values other than 1 if MTCircularSlider doesn't close a full circle. " + 79 | "Try changing trackMinAngle or trackMaxAngle.") 80 | } catch { 81 | print("Error: Unknown error") 82 | } 83 | setNeedsDisplay() 84 | } 85 | } 86 | 87 | @IBInspectable 88 | var trackMaxAngle: CGFloat = 360.0 { 89 | didSet { 90 | do { 91 | try noWindingIfNotFullCircle() 92 | } catch MTCircularSliderError.windingsSetToPartialSlider { 93 | print("Error: Cannot set maxWinds to values other than 1 if MTCircularSlider doesn't close a full circle. " + 94 | "Try changing trackMinAngle or trackMaxAngle.") 95 | } catch { 96 | print("Error: Unknown error") 97 | } 98 | setNeedsDisplay() 99 | } 100 | } 101 | 102 | @IBInspectable 103 | var areTrackCapsRound: Bool = false { didSet { setNeedsDisplay() } } 104 | 105 | @IBInspectable 106 | var hasThumb: Bool = true { didSet { setNeedsDisplay() } } 107 | 108 | @IBInspectable 109 | var thumbTint: UIColor = UIColor.white 110 | 111 | @IBInspectable 112 | var thumbRadius: CGFloat = 14 { didSet { setNeedsDisplay() } } 113 | 114 | @IBInspectable 115 | var thumbShadowRadius: CGFloat = 2 { didSet { setNeedsDisplay() } } 116 | 117 | @IBInspectable 118 | var thumbShadowDepth: CGFloat = 3 { didSet { setNeedsDisplay() } } 119 | 120 | @IBInspectable 121 | var thumbBorderWidth: CGFloat = 0 { didSet { setNeedsDisplay() } } 122 | 123 | @IBInspectable 124 | var thumbBorderColor: UIColor = UIColor.lightGray 125 | 126 | @IBInspectable 127 | open var value: CGFloat = 0.5 { 128 | didSet { 129 | let cappedVal = cappedValue(value, forWinds: maxWinds) 130 | if value != cappedVal { value = cappedVal } 131 | setNeedsDisplay() 132 | 133 | sendActions(for: .valueChanged) 134 | } 135 | } 136 | 137 | @IBInspectable 138 | open var valueMinimum: CGFloat = 0.0 { 139 | didSet { 140 | value = cappedValue(value) 141 | setNeedsDisplay() 142 | } 143 | } 144 | 145 | @IBInspectable 146 | open var valueMaximum: CGFloat = 1.0 { 147 | didSet { 148 | value = cappedValue(value) 149 | setNeedsDisplay() 150 | } 151 | } 152 | 153 | @IBInspectable 154 | open var maxWinds: CGFloat = 1.0 { 155 | didSet { 156 | do { 157 | try noWindingIfNotFullCircle() 158 | } catch MTCircularSliderError.windingsSetToPartialSlider { 159 | print("Error: Cannot set maxWinds to values other than 1 if MTCircularSlider doesn't close a full circle. " + 160 | "Try changing trackMinAngle or trackMaxAngle.") 161 | } catch { 162 | print("Error: Unknown error") 163 | } 164 | } 165 | } 166 | 167 | @IBInspectable 168 | open var touchPadding: CGFloat = 0.0 169 | 170 | fileprivate var isLeftToRight: Bool { 171 | if #available(iOS 9.0, *) { 172 | return UIView.userInterfaceLayoutDirection(for: self.semanticContentAttribute) == 173 | UIUserInterfaceLayoutDirection.leftToRight 174 | } else { 175 | // Fallback on earlier versions 176 | return true 177 | } 178 | } 179 | 180 | fileprivate var thumbLayer = CAShapeLayer() 181 | 182 | fileprivate var viewCenter: CGPoint { 183 | return convert(center, from: superview) 184 | } 185 | 186 | fileprivate var thumbCenter: CGPoint { 187 | var thumbCenter = viewCenter 188 | let angle = rtlAwareAngleRadians(thumbAngle) 189 | thumbCenter.x += CGFloat(cos(angle)) * controlRadius 190 | thumbCenter.y += CGFloat(sin(angle)) * controlRadius 191 | return thumbCenter 192 | } 193 | 194 | fileprivate var controlRadius: CGFloat { 195 | return min(bounds.width, bounds.height) / 2.0 - controlThickness 196 | } 197 | 198 | fileprivate var controlThickness: CGFloat { 199 | let thumbRadius = (hasThumb) ? self.thumbRadius : 0.0 200 | return max(thumbRadius, trackWidth / 2.0) 201 | } 202 | 203 | fileprivate var innerControlRadius: CGFloat { 204 | return controlRadius - trackWidth * 0.5 205 | } 206 | 207 | fileprivate var outerControlRadius: CGFloat { 208 | return controlRadius + trackWidth * 0.5 209 | } 210 | 211 | fileprivate var thumbAngle: CGFloat { 212 | let normalizedValue = (value - valueMinimum) / valueRange() 213 | let degrees = normalizedValue * (trackMaxAngle - trackMinAngle) + trackMinAngle 214 | // Rotate 180 degrees so that 0 degrees would be on the left and 215 | // convert to radians. 216 | let radians = degreesToRadians(degrees + 180.0) 217 | return CGFloat(radians) 218 | } 219 | 220 | fileprivate var lastPositionForTouch = CGPoint.zero 221 | 222 | fileprivate var pseudoValueForTouch: CGFloat = 0.0 223 | 224 | override 225 | open var center: CGPoint { 226 | didSet { setNeedsDisplay() } 227 | } 228 | 229 | override init(frame: CGRect) { 230 | super.init(frame: frame) 231 | 232 | prepare() 233 | } 234 | 235 | required 236 | public init?(coder aDecoder: NSCoder) { 237 | super.init(coder: aDecoder) 238 | 239 | prepare() 240 | } 241 | 242 | override 243 | open func prepareForInterfaceBuilder() { 244 | prepare() 245 | 246 | // Due to a bug in XCode, the shadow is misplaced in Interface Builder. 247 | thumbShadowDepth = -thumbShadowDepth * 2 248 | thumbShadowRadius *= 2 249 | } 250 | 251 | override 252 | open func draw(_ rect: CGRect) { 253 | let context = UIGraphicsGetCurrentContext() 254 | context?.saveGState() 255 | 256 | clipDrawingPathToTrack() 257 | 258 | drawTrack(context!) 259 | 260 | context?.restoreGState() 261 | 262 | drawProgressOnTrack() 263 | 264 | drawThumb() 265 | } 266 | 267 | override open func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 268 | if (!isUserInteractionEnabled || isHidden) { 269 | return nil; 270 | } 271 | let touchRect = bounds.insetBy(dx: -touchPadding, dy: -touchPadding) 272 | if (touchRect.contains(point)) { 273 | return self; 274 | } 275 | return nil; 276 | } 277 | 278 | fileprivate func rtlAwareAngleRadians(_ radians: CGFloat) -> CGFloat { 279 | return isLeftToRight ? radians : CGFloat(Double.pi) - radians 280 | } 281 | 282 | // swiftlint:disable cyclomatic_complexity 283 | open func applyAttributes(_ attributes: [Attributes]) { 284 | for attribute in attributes { 285 | switch attribute { 286 | // MARK: Track style 287 | case let .minTrackTint(value): 288 | self.minTrackTint = value 289 | case let .maxTrackTint(value): 290 | self.maxTrackTint = value 291 | case let .trackWidth(value): 292 | self.trackWidth = value 293 | case let .trackShadowRadius(value): 294 | self.trackShadowRadius = value 295 | case let .trackShadowDepth(value): 296 | self.trackShadowDepth = value 297 | case let .trackMinAngle(value): 298 | self.trackMinAngle = value 299 | case let .trackMaxAngle(value): 300 | self.trackMaxAngle = value 301 | case let .areTrackCapsRound(value): 302 | self.areTrackCapsRound = value 303 | case let .maxWinds(value): 304 | self.maxWinds = value 305 | 306 | // MARK: Thumb style 307 | case let .hasThumb(value): 308 | self.hasThumb = value 309 | case let .thumbTint(value): 310 | self.thumbTint = value 311 | case let .thumbRadius(value): 312 | self.thumbRadius = value 313 | case let .thumbShadowRadius(value): 314 | self.thumbShadowRadius = value 315 | case let .thumbShadowDepth(value): 316 | self.thumbShadowDepth = value 317 | case let .thumbBorderWidth(value): 318 | self.thumbBorderWidth = value 319 | case let .thumbBorderColor(value): 320 | self.thumbBorderColor = value 321 | 322 | // MARK: View properties 323 | case let .touchPadding(value): 324 | self.touchPadding = value 325 | } 326 | } 327 | 328 | setNeedsDisplay() 329 | } 330 | // swiftlint:enable cyclomatic_complexity 331 | 332 | /** 333 | Returns the current angle of the thumb in radians. 334 | */ 335 | open func getThumbAngle() -> CGFloat { 336 | return thumbAngle 337 | } 338 | 339 | fileprivate func prepare() { 340 | contentMode = .redraw 341 | isOpaque = false 342 | backgroundColor = UIColor.clear 343 | 344 | layer.insertSublayer(thumbLayer, at: 0) 345 | } 346 | 347 | fileprivate func cappedValue(_ value: CGFloat) -> CGFloat { 348 | return cappedValue(value, forWinds: 1.0) 349 | } 350 | 351 | fileprivate func cappedValue(_ value: CGFloat, forWinds: CGFloat) -> CGFloat { 352 | return min(max(valueMinimum, value), valueMaximum + valueRange() * (maxWinds - 1.0)) 353 | } 354 | 355 | // True if the provided location is on the thumb, false otherwise. 356 | fileprivate func locationOnThumb(_ location: CGPoint) -> Bool { 357 | let thumbCenter = self.thumbCenter 358 | return sqrt(pow(location.x - thumbCenter.x, 2) + 359 | pow(location.y - thumbCenter.y, 2)) <= thumbRadius 360 | } 361 | 362 | fileprivate func isClockwise(_ vector1: CGPoint, vector2: CGPoint) -> Bool { 363 | return vector1.y * vector2.x < vector1.x * vector2.y 364 | } 365 | 366 | fileprivate func noWindingIfNotFullCircle() throws { 367 | guard maxWinds == 1 || trackMaxAngle - trackMinAngle == 360 else { 368 | throw MTCircularSliderError.windingsSetToPartialSlider 369 | } 370 | } 371 | 372 | fileprivate func valueRange() -> CGFloat { 373 | return valueMaximum - valueMinimum 374 | } 375 | } 376 | 377 | // MARK: - Trigonometry converters 378 | fileprivate extension MTCircularSlider { 379 | func radiansToDegrees(_ angle: CGFloat) -> CGFloat { 380 | return angle / CGFloat(Double.pi) * 180.0 381 | } 382 | 383 | func degreesToRadians(_ angle: CGFloat) -> CGFloat { 384 | return angle / 180.0 * CGFloat(Double.pi) 385 | } 386 | } 387 | 388 | // MARK: - Touch behaviour 389 | extension MTCircularSlider { 390 | override 391 | open func beginTracking(_ touch: UITouch, 392 | with event: UIEvent?) -> Bool { 393 | if hasThumb { 394 | let location = touch.location(in: self) 395 | 396 | let pseudoValue = calculatePseudoValue(at: location) 397 | // If the touch is on the thumb, start dragging from the thumb. 398 | if locationOnThumb(location) { 399 | lastPositionForTouch = location 400 | pseudoValueForTouch = value 401 | return true 402 | } 403 | 404 | // Check if the touch is out of our bounds. 405 | if cappedValue(pseudoValue) != pseudoValue { 406 | // Not on thumb or track, so abort gesture. 407 | return false 408 | } 409 | 410 | if value > valueMaximum { 411 | // More than one winding, multiple possible values. Abort. 412 | return false 413 | } 414 | value = pseudoValue 415 | lastPositionForTouch = location 416 | } 417 | 418 | return super.beginTracking(touch, with: event) 419 | } 420 | 421 | override 422 | open func continueTracking(_ touch: UITouch, 423 | with event: UIEvent?) -> Bool { 424 | if !hasThumb { 425 | return super.continueTracking(touch, with: event) 426 | } 427 | 428 | let location = touch.location(in: self) 429 | 430 | value = calculatePseudoValue(fromPoint: lastPositionForTouch, toPoint: location) 431 | 432 | lastPositionForTouch = location 433 | 434 | return true 435 | } 436 | 437 | @discardableResult 438 | fileprivate func calculatePseudoValue(at point: CGPoint) -> CGFloat { 439 | let angle = angleAt(point) 440 | let range = valueRange() 441 | let windings = value == valueMinimum ? 1 : 442 | ceil((value - valueMinimum) / range) 443 | 444 | // Normalize the angle, then convert to value scale. 445 | let angleRange = trackMaxAngle - trackMinAngle 446 | let targetValue = 447 | (angle / angleRange + windings - 1.0) * range + valueMinimum 448 | 449 | pseudoValueForTouch = targetValue 450 | 451 | return targetValue 452 | } 453 | 454 | fileprivate func calculatePseudoValue(fromPoint: CGPoint, toPoint: CGPoint) -> CGFloat { 455 | let angle1 = angleAt(fromPoint) 456 | let angle2 = angleAt(toPoint) 457 | var angle = angle2 - angle1 458 | let range = valueRange() 459 | let angleToValue = range / (trackMaxAngle - trackMinAngle) 460 | let clockwise = isClockwise( 461 | CGPoint(x: fromPoint.x - bounds.midX, y: fromPoint.y - bounds.midY), 462 | vector2: CGPoint(x: toPoint.x - fromPoint.x, y: toPoint.y - fromPoint.y) 463 | ) 464 | 465 | if clockwise == isLeftToRight { 466 | while angle < 0 { angle += 360 } 467 | 468 | } else { 469 | while angle > 0 { angle -= 360 } 470 | } 471 | 472 | // Update our value by as much as the last motion defined. 473 | pseudoValueForTouch += angle * angleToValue 474 | 475 | // And make sure we don't count more than winds circles of overflow. 476 | if pseudoValueForTouch > valueMinimum + range * (maxWinds + 1) { 477 | pseudoValueForTouch -= range 478 | } 479 | if pseudoValueForTouch < valueMinimum - range { 480 | pseudoValueForTouch += range 481 | } 482 | 483 | return pseudoValueForTouch 484 | } 485 | 486 | fileprivate func angleAt(_ point: CGPoint) -> CGFloat { 487 | // Calculate the relative angle of the user's touch point starting from 488 | // trackMinAngle. 489 | var angle = (radiansToDegrees(atan2(point.x - bounds.midX, point.y - bounds.midY)) + trackMinAngle) + 180.0 490 | if !isLeftToRight { 491 | angle = 360.0 - angle 492 | } 493 | angle = (90.0 - angle).truncatingRemainder(dividingBy: 360.0) 494 | while angle < 0.0 { angle += 360.0 } 495 | 496 | return angle 497 | } 498 | } 499 | 500 | // MARK: - MTCircularSlider Drawing 501 | fileprivate extension MTCircularSlider { 502 | func clipDrawingPathToTrack() { 503 | let minAngle = degreesToRadians(trackMinAngle + 180.0) 504 | let maxAngle = degreesToRadians(trackMaxAngle + 180.0) 505 | let clipPath = getRingSliceArcPath(ringCenter: viewCenter, 506 | innerRadius: innerControlRadius, outerRadius: outerControlRadius, 507 | startAngle: minAngle, endAngle: maxAngle, 508 | isRounded: self.areTrackCapsRound) 509 | 510 | clipPath.addClip() 511 | } 512 | 513 | func drawProgressOnTrack() { 514 | let minAngle = degreesToRadians(trackMinAngle + 180.0) 515 | let isRounded = self.value != 0 && self.areTrackCapsRound 516 | 517 | let progressPath = 518 | isLeftToRight ? 519 | getRingSliceArcPath(ringCenter: viewCenter, 520 | innerRadius: innerControlRadius, 521 | outerRadius: outerControlRadius, 522 | startAngle: rtlAwareAngleRadians(minAngle), 523 | endAngle: rtlAwareAngleRadians(thumbAngle), 524 | isRounded: isRounded) : 525 | getRingSliceArcPath(ringCenter: viewCenter, 526 | innerRadius: innerControlRadius, 527 | outerRadius: outerControlRadius, 528 | startAngle: rtlAwareAngleRadians(thumbAngle), 529 | endAngle: rtlAwareAngleRadians(minAngle), 530 | isRounded: isRounded) 531 | 532 | minTrackTint.setFill() 533 | progressPath.fill() 534 | } 535 | 536 | func drawTrack(_ context: CGContext) { 537 | let trackPath = getCirclePath(withCenter: viewCenter, 538 | radius: outerControlRadius) 539 | maxTrackTint.setFill() 540 | trackPath.fill() 541 | 542 | if trackShadowDepth > 0 { 543 | setShadow(context, depth: trackShadowDepth, radius: trackShadowRadius) 544 | } 545 | 546 | let trackShadowPath = UIBezierPath(rect: CGRect.infinite) 547 | 548 | trackShadowPath.append( 549 | getCirclePath(withCenter: viewCenter, 550 | radius: CGFloat(outerControlRadius + 0.5)) 551 | ) 552 | 553 | trackShadowPath.close() 554 | 555 | trackShadowPath.append( 556 | getCirclePath(withCenter: viewCenter, 557 | radius: CGFloat(innerControlRadius - 0.5)) 558 | ) 559 | 560 | trackShadowPath.usesEvenOddFillRule = true 561 | 562 | UIColor.black.set() 563 | trackShadowPath.fill() 564 | } 565 | 566 | func drawThumb() { 567 | let thumbPath = getCirclePath(withCenter: thumbCenter, 568 | radius: thumbRadius) 569 | 570 | if hasThumb && thumbHasShadow() { 571 | setThumbLayerPathAndColor(thumbPath) 572 | setupThumbLayerShadow(thumbPath) 573 | 574 | } else { 575 | resetThumbPaths() 576 | 577 | if hasThumb { 578 | thumbTint.setFill() 579 | thumbPath.fill() 580 | } 581 | } 582 | 583 | setThumbStroke() 584 | } 585 | 586 | func getCirclePath(withCenter center: CGPoint, 587 | radius: CGFloat) -> UIBezierPath { 588 | return UIBezierPath(arcCenter: center, 589 | radius: radius, 590 | startAngle: 0, 591 | endAngle: CGFloat(Double.pi * 2.0), 592 | clockwise: true) 593 | } 594 | 595 | private func getRingSliceArcPath(ringCenter: CGPoint, 596 | innerRadius: CGFloat, outerRadius: CGFloat, 597 | startAngle: CGFloat, endAngle: CGFloat, 598 | isRounded: Bool) -> UIBezierPath { 599 | let arcPath = UIBezierPath(arcCenter: ringCenter, 600 | radius: outerRadius, 601 | startAngle: startAngle, 602 | endAngle: endAngle, 603 | clockwise: true) 604 | let ringWidthRadius = (outerRadius - innerRadius) / 2 605 | 606 | let ringEdgeCenterPoint = { 607 | self.edgeCenterPointFrom( 608 | innerRadius: innerRadius, 609 | outerRadius: outerRadius, 610 | angle: $0, 611 | ringCenter: ringCenter 612 | ) 613 | } 614 | 615 | let addRoundEdge = { 616 | arcPath.addArc(withCenter: $0, radius: ringWidthRadius, startAngle: 0, endAngle: .pi * 2, clockwise: true) 617 | } 618 | 619 | if isRounded { 620 | let endCenter = ringEdgeCenterPoint(endAngle) 621 | addRoundEdge(endCenter) 622 | } 623 | 624 | arcPath.addArc(withCenter: viewCenter, 625 | radius: innerRadius, 626 | startAngle: endAngle, 627 | endAngle: startAngle, 628 | clockwise: false) 629 | 630 | if isRounded { 631 | let startCenter = ringEdgeCenterPoint(startAngle) 632 | addRoundEdge(startCenter) 633 | } 634 | 635 | arcPath.close() 636 | 637 | return arcPath 638 | } 639 | 640 | private func edgeCenterPointFrom(innerRadius: CGFloat, outerRadius: CGFloat, 641 | angle: CGFloat, ringCenter: CGPoint) -> CGPoint { 642 | let outStartCenter = pointOnCircle( 643 | radius: outerRadius, 644 | angle: angle, 645 | center: ringCenter 646 | ) 647 | 648 | let inStartCenter = pointOnCircle( 649 | radius: innerRadius, 650 | angle: angle, 651 | center: ringCenter 652 | ) 653 | 654 | return CGPoint( 655 | x: (outStartCenter.x + inStartCenter.x) / 2, 656 | y: (outStartCenter.y + inStartCenter.y) / 2 657 | ) 658 | } 659 | 660 | private func pointOnCircle(radius: CGFloat, angle: CGFloat, center: CGPoint) -> CGPoint { 661 | let calculate: ((CGFloat) -> CGFloat) -> CGFloat = { (radius) * $0(angle) } 662 | let point = CGPoint(x: calculate(cos), y: calculate(sin)) 663 | 664 | return CGPoint(x: center.x + point.x, y: center.y + point.y) 665 | } 666 | private func setShadow(_ context: CGContext, depth: CGFloat, radius: CGFloat) { 667 | context.clip(to: CGRect.infinite) 668 | context.setShadow(offset: CGSize(width: 0, height: depth), blur: radius) 669 | } 670 | 671 | private func thumbHasShadow() -> Bool { 672 | return thumbShadowDepth != 0 || thumbShadowRadius != 0 673 | } 674 | 675 | private func setThumbLayerPathAndColor(_ thumbPath: UIBezierPath) { 676 | thumbLayer.path = thumbPath.cgPath 677 | thumbLayer.fillColor = thumbTint.cgColor 678 | } 679 | 680 | private func setupThumbLayerShadow(_ thumbPath: UIBezierPath) { 681 | thumbLayer.shadowColor = UIColor.black.cgColor 682 | thumbLayer.shadowPath = thumbPath.cgPath 683 | thumbLayer.shadowOffset = CGSize(width: 0, height: thumbShadowDepth) 684 | thumbLayer.shadowOpacity = 0.25 685 | thumbLayer.shadowRadius = thumbShadowRadius 686 | } 687 | 688 | private func resetThumbPaths() { 689 | thumbLayer.path = nil 690 | thumbLayer.shadowPath = nil 691 | } 692 | 693 | private func setThumbStroke() { 694 | thumbLayer.strokeColor = thumbBorderColor.cgColor 695 | thumbLayer.lineWidth = thumbBorderWidth 696 | } 697 | // swiftlint:disable file_length 698 | } 699 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MTCircularSlider 2 | 3 | [![CI Status](http://img.shields.io/travis/EranBoudjnah/MTCircularSlider.svg?style=flat)](https://travis-ci.org/EranBoudjnah/MTCircularSlider) 4 | [![Version](https://img.shields.io/cocoapods/v/MTCircularSlider.svg?style=flat)](http://cocoapods.org/pods/MTCircularSlider) 5 | [![License](https://img.shields.io/cocoapods/l/MTCircularSlider.svg?style=flat)](https://github.com/EranBoudjnah/MTCircularSlider/blob/master/LICENSE) 6 | [![Platform](https://img.shields.io/cocoapods/p/MTCircularSlider.svg?style=flat)](https://developer.apple.com/swift/resources/) 7 | 8 | ## Screenshot 9 | 10 | ![Screenshot from Simulator](https://user-images.githubusercontent.com/24318356/106140467-7e209880-6177-11eb-932a-3541f05273e9.gif) 11 | 12 | ## Usage 13 | 14 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 15 | 16 | ## Requirements 17 | 18 | - iOS 10.0+ 19 | 20 | ## Installation 21 | 22 | ### CocoaPods (iOS 10.0+) 23 | 24 | MTCircularSlider is available through [CocoaPods](http://cocoapods.org). To install 25 | it, simply add the following line to your Podfile: 26 | 27 | ```ruby 28 | pod "MTCircularSlider" 29 | ``` 30 | 31 | ### Manual Installation 32 | 33 | The class file required for MTCircularSlider can be found in the following path: 34 | 35 | ``` 36 | MTCircularSlider/Classes/MTCircularSlider.swift 37 | ``` 38 | 39 | ## Usage 40 | 41 | To run the example project, clone the repo and run pod install from the Example directory first. 42 | 43 | MTCircularSlider implements IBDesignable and IBInspectable, and so can be configure directly from Interface Builder. 44 | 45 | 46 | ### Usage in Code - Simple 47 | 48 | To add a default circular slider, add the following code to your controller: 49 | 50 | ``` 51 | self.slider = MTCircularSlider(frame: self.sliderArea.bounds, options: nil) 52 | self.slider?.addTarget(self, action: Selector("valueChange:"), forControlEvents: .ValueChanged) 53 | self.sliderArea.addSubview(self.slider) 54 | ``` 55 | 56 | ### Usage in Code - Advanced 57 | 58 | To add a custom circular slider, add the following code to your controller: 59 | 60 | ```swift 61 | let attributes = [ 62 | /* Track */ 63 | Attributes.minTrackTint(.lightGray), 64 | Attributes.maxTrackTint(.lightGray), 65 | Attributes.trackWidth(12), 66 | Attributes.trackShadowRadius(0), 67 | Attributes.trackShadowDepth(0), 68 | Attributes.trackMinAngle(180), 69 | Attributes.trackMaxAngle(270), 70 | 71 | /* Thumb */ 72 | Attributes.hasThumb(true), 73 | Attributes.thumbTint(UIColor.darkGrayColor()), 74 | Attributes.thumbRadius(8), 75 | Attributes.thumbShadowRadius(0), 76 | Attributes.thumbShadowDepth(0) 77 | ] 78 | 79 | self.slider = MTCircularSlider(frame: self.sliderArea.bounds, options: nil) 80 | self.slider.configure(attributes) 81 | self.slider?.addTarget(self, action: Selector("valueChange:"), forControlEvents: .ValueChanged) 82 | self.sliderArea.addSubview(self.slider) 83 | ``` 84 | 85 | ## Attributes 86 | 87 | ###### ``minTrackTint(UIColor)`` 88 | 89 | Sets the color of the track up to the thumb. 90 | 91 | ###### ``maxTrackTint(UIColor)`` 92 | 93 | Sets the color of the track from the thumb to the end of the track. 94 | 95 | ###### ``trackWidth(CGFloat)`` 96 | 97 | Sets the width of the track in points. 98 | 99 | Default value: 2 100 | 101 | ###### ``trackShadowRadius(CGFloat)`` 102 | 103 | Sets the radius for the inner shadow on the track. 104 | 105 | ###### ``trackShadowDepth(CGFloat)`` 106 | 107 | Sets the distance of the inner shadow on the track from the track edge. 108 | 109 | ###### ``trackMinAngle(Double)`` 110 | 111 | Sets the minimum angle of the track in degrees. 112 | 113 | Default value: 0 114 | 115 | ###### ``trackMaxAngle(Double)`` 116 | 117 | Sets the maximum angle of the track in degrees. 118 | 119 | Default value: 360 120 | 121 | ###### ``areTrackCapsRound(Bool)`` 122 | 123 | Sets whether the edges of the track around round (true) or flat (false). 124 | 125 | Default value: false 126 | 127 | ###### ``maxWinds(Float)`` 128 | 129 | Sets the maximum number of times a user can wind the control. If set to a value 130 | other than 1, the difference between the minimum and maximum angles must be 131 | exactly 360 degrees. 132 | 133 | Default value: 1 134 | 135 | ###### ``hasThumb(Bool)`` 136 | 137 | Toggles the control between progress and slider modes. Setting hasThumb to true 138 | set the control to slider mode. 139 | 140 | ###### ``thumbTint(UIColor)`` 141 | 142 | Sets the color of the thumb. 143 | 144 | ###### ``thumbRadius(CGFloat)`` 145 | 146 | Sets the radius of the thumb in points. 147 | 148 | ###### ``thumbShadowRadius(CGFloat)`` 149 | 150 | Sets the radius of the shadow the thumb drops. 151 | 152 | ###### ``thumbShadowDepth(CGFloat)`` 153 | 154 | Sets the distance of the shadow the thumb from the thumb. 155 | 156 | ## Functions 157 | 158 | ###### ``getThumbAngle() -> CGFloat`` 159 | 160 | Returns the current angle of the thumb in radians. 161 | 162 | 163 | ## Author 164 | 165 | Eran Boudjnah, eranbou@gmail.com 166 | 167 | ## License 168 | 169 | MTCircularSlider is available under the MIT license. See the LICENSE file for more info. 170 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /install_swiftlint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Installs the SwiftLint package. 4 | # Tries to get the precompiled .pkg file from Github, but if that 5 | # fails just recompiles from source. 6 | # 7 | # Borrowed from https://alexplescan.com/posts/2016/03/03/setting-up-swiftlint-on-travis-ci/ 8 | 9 | set -e 10 | 11 | SWIFTLINT_PKG_PATH="/tmp/SwiftLint.pkg" 12 | SWIFTLINT_PKG_URL="https://github.com/realm/SwiftLint/releases/download/0.27.0/SwiftLint.pkg" 13 | 14 | wget --output-document=$SWIFTLINT_PKG_PATH $SWIFTLINT_PKG_URL 15 | 16 | if [ -f $SWIFTLINT_PKG_PATH ]; then 17 | echo "SwiftLint package exists! Installing it..." 18 | sudo installer -pkg $SWIFTLINT_PKG_PATH -target / 19 | else 20 | echo "SwiftLint package doesn't exist. Compiling from source..." && 21 | git clone https://github.com/realm/SwiftLint.git /tmp/SwiftLint && 22 | cd /tmp/SwiftLint && 23 | git submodule update --init --recursive && 24 | sudo make install 25 | fi 26 | 27 | --------------------------------------------------------------------------------