├── .gitignore ├── .swiftpm └── xcode │ └── package.xcworkspace │ └── contents.xcworkspacedata ├── .travis.yml ├── Example ├── Podfile ├── Podfile.lock ├── Pods │ ├── Headers │ │ ├── Private │ │ │ └── TTRangeSlider │ │ │ │ ├── TTRangeSlider.h │ │ │ │ └── TTRangeSliderDelegate.h │ │ └── Public │ │ │ └── TTRangeSlider │ │ │ ├── TTRangeSlider.h │ │ │ └── TTRangeSliderDelegate.h │ ├── Local Podspecs │ │ └── TTRangeSlider.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── Pods-TTRangeSlider.xcscheme │ │ │ └── Pods.xcscheme │ └── Target Support Files │ │ ├── Pods-TTRangeSlider │ │ ├── Info.plist │ │ ├── Pods-TTRangeSlider-Private.xcconfig │ │ ├── Pods-TTRangeSlider-dummy.m │ │ ├── Pods-TTRangeSlider-prefix.pch │ │ ├── Pods-TTRangeSlider-umbrella.h │ │ ├── Pods-TTRangeSlider.modulemap │ │ └── Pods-TTRangeSlider.xcconfig │ │ └── Pods │ │ ├── Info.plist │ │ ├── Pods-acknowledgements.markdown │ │ ├── Pods-acknowledgements.plist │ │ ├── Pods-dummy.m │ │ ├── Pods-environment.h │ │ ├── Pods-frameworks.sh │ │ ├── Pods-resources.sh │ │ ├── Pods-umbrella.h │ │ ├── Pods.debug.xcconfig │ │ ├── Pods.modulemap │ │ └── Pods.release.xcconfig ├── RangeSliderDemo.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── RangeSliderDemo.xcscheme ├── RangeSliderDemo.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── RangeSliderDemo │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ │ ├── LaunchScreen.xib │ │ └── Main.storyboard │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ ├── ViewController.h │ ├── ViewController.m │ ├── custom-handle.png │ └── main.m ├── RangeSliderDemoTests │ ├── Info.plist │ └── RangeSliderDemoTests.m ├── TTRangeSlider.gif ├── interfacebuilder.png └── screenshot.png ├── LICENSE ├── Package.swift ├── Pod └── Classes │ ├── TTRangeSlider.h │ ├── TTRangeSlider.m │ └── TTRangeSliderDelegate.h ├── README.md └── TTRangeSlider.podspec /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | # We recommend against adding the Pods directory to your .gitignore. However 26 | # you should judge for yourself, the pros and cons are mentioned at: 27 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 28 | # 29 | # Note: if you ignore the Pods directory, make sure to uncomment 30 | # `pod install` in .travis.yml 31 | # 32 | # Pods/ 33 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | osx_image: xcode8.3 3 | script: xcodebuild clean build -workspace Example/RangeSliderDemo.xcworkspace -scheme RangeSliderDemo -destination "platform=iOS Simulator,name=iPhone 7" 4 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | source 'https://github.com/CocoaPods/Specs.git' 2 | use_frameworks! 3 | 4 | pod "TTRangeSlider", :path => "../" 5 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - TTRangeSlider (1.0.2) 3 | 4 | DEPENDENCIES: 5 | - TTRangeSlider (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | TTRangeSlider: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | TTRangeSlider: e41d992cc0047da48884ad507f968db5ab08441b 13 | 14 | COCOAPODS: 0.37.2 15 | -------------------------------------------------------------------------------- /Example/Pods/Headers/Private/TTRangeSlider/TTRangeSlider.h: -------------------------------------------------------------------------------- 1 | ../../../../../Pod/Classes/TTRangeSlider.h -------------------------------------------------------------------------------- /Example/Pods/Headers/Private/TTRangeSlider/TTRangeSliderDelegate.h: -------------------------------------------------------------------------------- 1 | ../../../../../Pod/Classes/TTRangeSliderDelegate.h -------------------------------------------------------------------------------- /Example/Pods/Headers/Public/TTRangeSlider/TTRangeSlider.h: -------------------------------------------------------------------------------- 1 | ../../../../../Pod/Classes/TTRangeSlider.h -------------------------------------------------------------------------------- /Example/Pods/Headers/Public/TTRangeSlider/TTRangeSliderDelegate.h: -------------------------------------------------------------------------------- 1 | ../../../../../Pod/Classes/TTRangeSliderDelegate.h -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/TTRangeSlider.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "TTRangeSlider", 3 | "version": "1.0.2", 4 | "summary": "A slider that allows you to pick a range", 5 | "description": " A slider, similar in style to UISlider, but has two handles instead of one, allowing you to pick a minimum and maximum range.\n", 6 | "homepage": "https://github.com/TomThorpe/TTRangeSlider", 7 | "license": "MIT", 8 | "authors": { 9 | "Tom Thorpe": "code@tomthorpe.co.uk" 10 | }, 11 | "source": { 12 | "git": "https://github.com/TomThorpe/TTRangeSlider.git", 13 | "tag": "1.0.2" 14 | }, 15 | "platforms": { 16 | "ios": "7.0" 17 | }, 18 | "requires_arc": true, 19 | "source_files": "Pod/Classes/**/*" 20 | } 21 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - TTRangeSlider (1.0.2) 3 | 4 | DEPENDENCIES: 5 | - TTRangeSlider (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | TTRangeSlider: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | TTRangeSlider: e41d992cc0047da48884ad507f968db5ab08441b 13 | 14 | COCOAPODS: 0.37.2 15 | -------------------------------------------------------------------------------- /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 | 3CE5C32FD3196B22B5BCB18B /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 32A359667F1B7BF328E9CF08 /* Pods-dummy.m */; }; 11 | 612E77C54E70B435FE4DEAE4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 676F94A96D263F24F828EBE0 /* Foundation.framework */; }; 12 | 619276ED5EB42E594B7C5333 /* TTRangeSlider.h in Headers */ = {isa = PBXBuildFile; fileRef = 65C5B3F357C8AC8ABCD0D05D /* TTRangeSlider.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | 7B6DF4ACD62EF103F1F2DA45 /* TTRangeSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = ADF2B0C2802F20259EFAA25E /* TTRangeSlider.m */; }; 14 | 83551A31C8AFDFBB1826F727 /* Pods-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 18641424B09BEC29E8D17B21 /* Pods-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | A4537FBDB483BEA5292F1DA2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 676F94A96D263F24F828EBE0 /* Foundation.framework */; }; 16 | B08B43B0875BB0C4AEE2C344 /* Pods-TTRangeSlider-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BAD26ADF029F3D9F46F95C7 /* Pods-TTRangeSlider-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | D22C9235A9E83B8E81A27EE5 /* Pods-TTRangeSlider-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 484E2FC24AD552D8299377A5 /* Pods-TTRangeSlider-dummy.m */; }; 18 | D239E090DA3538B14BAA6A88 /* TTRangeSliderDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 71FDDA37DF4EB0E5D63B2210 /* TTRangeSliderDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | FD8149C3EB62FD7BCF6A0E57 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = EFE1E39477C025EBAC8B5406 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 3BE592CFC40868ECA261CCDA; 27 | remoteInfo = "Pods-TTRangeSlider"; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 06539F8C389AF10CF37BEC71 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | 18641424B09BEC29E8D17B21 /* Pods-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-umbrella.h"; sourceTree = ""; }; 34 | 1FE399A948F1F75155C8A69C /* Pods-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-resources.sh"; sourceTree = ""; }; 35 | 32A359667F1B7BF328E9CF08 /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-dummy.m"; sourceTree = ""; }; 36 | 484E2FC24AD552D8299377A5 /* Pods-TTRangeSlider-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TTRangeSlider-dummy.m"; sourceTree = ""; }; 37 | 4882ED10282EC8369439DA7E /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.debug.xcconfig; sourceTree = ""; }; 38 | 5573B0EF31430B040839CEBD /* Pods-TTRangeSlider-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TTRangeSlider-prefix.pch"; sourceTree = ""; }; 39 | 6131A9C3AC35106F46A8AA61 /* TTRangeSlider.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TTRangeSlider.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | 65C5B3F357C8AC8ABCD0D05D /* TTRangeSlider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = TTRangeSlider.h; sourceTree = ""; }; 41 | 676F94A96D263F24F828EBE0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 42 | 6E9DBFADDC60E410F51B9980 /* Pods-TTRangeSlider.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-TTRangeSlider.modulemap"; sourceTree = ""; }; 43 | 71FDDA37DF4EB0E5D63B2210 /* TTRangeSliderDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = TTRangeSliderDelegate.h; sourceTree = ""; }; 44 | 7B51106809E017860B8C27EF /* Pods-TTRangeSlider.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TTRangeSlider.xcconfig"; sourceTree = ""; }; 45 | 9A3D1AF5FCBD0B81C0C5D49D /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 46 | 9BAD26ADF029F3D9F46F95C7 /* Pods-TTRangeSlider-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TTRangeSlider-umbrella.h"; sourceTree = ""; }; 47 | ADF2B0C2802F20259EFAA25E /* TTRangeSlider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = TTRangeSlider.m; sourceTree = ""; }; 48 | B58B6B953A5AD2C2DB72CF31 /* Pods-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-acknowledgements.markdown"; sourceTree = ""; }; 49 | B8852B32327B98031CB75F10 /* Pods-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-frameworks.sh"; sourceTree = ""; }; 50 | C631FB093306AE61062251D2 /* Pods-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-environment.h"; sourceTree = ""; }; 51 | C874F737B728285604C0FACC /* Pods-TTRangeSlider-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TTRangeSlider-Private.xcconfig"; sourceTree = ""; }; 52 | CE4AF56251E80C86613FBED2 /* Pods-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-acknowledgements.plist"; sourceTree = ""; }; 53 | CFAE4EE850B4676DBA664054 /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 54 | D41871E419BD612D6025638E /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.release.xcconfig; sourceTree = ""; }; 55 | DC3363CD8263531D6EB05FCB /* Pods.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Pods.modulemap; sourceTree = ""; }; 56 | DE4FBB89254323BFC7C467E8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 57 | /* End PBXFileReference section */ 58 | 59 | /* Begin PBXFrameworksBuildPhase section */ 60 | 107B33AF7FA2CE836097B448 /* Frameworks */ = { 61 | isa = PBXFrameworksBuildPhase; 62 | buildActionMask = 2147483647; 63 | files = ( 64 | A4537FBDB483BEA5292F1DA2 /* Foundation.framework in Frameworks */, 65 | ); 66 | runOnlyForDeploymentPostprocessing = 0; 67 | }; 68 | 9A88BD95948A18912EED3EB8 /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | 612E77C54E70B435FE4DEAE4 /* Foundation.framework in Frameworks */, 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | /* End PBXFrameworksBuildPhase section */ 77 | 78 | /* Begin PBXGroup section */ 79 | 57621340EAB450764B324CC8 /* TTRangeSlider */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | C7893C9E47DB6358290EDC40 /* Pod */, 83 | 778253B2BBA266CE6FFD0A1C /* Support Files */, 84 | ); 85 | name = TTRangeSlider; 86 | path = ../..; 87 | sourceTree = ""; 88 | }; 89 | 778253B2BBA266CE6FFD0A1C /* Support Files */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 9A3D1AF5FCBD0B81C0C5D49D /* Info.plist */, 93 | 6E9DBFADDC60E410F51B9980 /* Pods-TTRangeSlider.modulemap */, 94 | 7B51106809E017860B8C27EF /* Pods-TTRangeSlider.xcconfig */, 95 | C874F737B728285604C0FACC /* Pods-TTRangeSlider-Private.xcconfig */, 96 | 484E2FC24AD552D8299377A5 /* Pods-TTRangeSlider-dummy.m */, 97 | 5573B0EF31430B040839CEBD /* Pods-TTRangeSlider-prefix.pch */, 98 | 9BAD26ADF029F3D9F46F95C7 /* Pods-TTRangeSlider-umbrella.h */, 99 | ); 100 | name = "Support Files"; 101 | path = "Example/Pods/Target Support Files/Pods-TTRangeSlider"; 102 | sourceTree = ""; 103 | }; 104 | 7BCC60B39C823A014B0F5088 /* iOS */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 676F94A96D263F24F828EBE0 /* Foundation.framework */, 108 | ); 109 | name = iOS; 110 | sourceTree = ""; 111 | }; 112 | 7D97019E441954F9CD2F5A86 /* Development Pods */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 57621340EAB450764B324CC8 /* TTRangeSlider */, 116 | ); 117 | name = "Development Pods"; 118 | sourceTree = ""; 119 | }; 120 | 7F19DEB232022CB0B7122730 /* Frameworks */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | 7BCC60B39C823A014B0F5088 /* iOS */, 124 | ); 125 | name = Frameworks; 126 | sourceTree = ""; 127 | }; 128 | 81FCDFA1E775DC898BE03539 /* Classes */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | 65C5B3F357C8AC8ABCD0D05D /* TTRangeSlider.h */, 132 | ADF2B0C2802F20259EFAA25E /* TTRangeSlider.m */, 133 | 71FDDA37DF4EB0E5D63B2210 /* TTRangeSliderDelegate.h */, 134 | ); 135 | path = Classes; 136 | sourceTree = ""; 137 | }; 138 | 86BD4F51EC6AF08A4E05CD2A /* Targets Support Files */ = { 139 | isa = PBXGroup; 140 | children = ( 141 | 8EFE1D03E378A7F54179F01D /* Pods */, 142 | ); 143 | name = "Targets Support Files"; 144 | sourceTree = ""; 145 | }; 146 | 8EFE1D03E378A7F54179F01D /* Pods */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | DE4FBB89254323BFC7C467E8 /* Info.plist */, 150 | DC3363CD8263531D6EB05FCB /* Pods.modulemap */, 151 | B58B6B953A5AD2C2DB72CF31 /* Pods-acknowledgements.markdown */, 152 | CE4AF56251E80C86613FBED2 /* Pods-acknowledgements.plist */, 153 | 32A359667F1B7BF328E9CF08 /* Pods-dummy.m */, 154 | C631FB093306AE61062251D2 /* Pods-environment.h */, 155 | B8852B32327B98031CB75F10 /* Pods-frameworks.sh */, 156 | 1FE399A948F1F75155C8A69C /* Pods-resources.sh */, 157 | 18641424B09BEC29E8D17B21 /* Pods-umbrella.h */, 158 | 4882ED10282EC8369439DA7E /* Pods.debug.xcconfig */, 159 | D41871E419BD612D6025638E /* Pods.release.xcconfig */, 160 | ); 161 | name = Pods; 162 | path = "Target Support Files/Pods"; 163 | sourceTree = ""; 164 | }; 165 | A5B88EB1D5E767E23FD6C287 = { 166 | isa = PBXGroup; 167 | children = ( 168 | CFAE4EE850B4676DBA664054 /* Podfile */, 169 | 7D97019E441954F9CD2F5A86 /* Development Pods */, 170 | 7F19DEB232022CB0B7122730 /* Frameworks */, 171 | D26011E95A25E47FA0AB4D73 /* Products */, 172 | 86BD4F51EC6AF08A4E05CD2A /* Targets Support Files */, 173 | ); 174 | sourceTree = ""; 175 | }; 176 | C7893C9E47DB6358290EDC40 /* Pod */ = { 177 | isa = PBXGroup; 178 | children = ( 179 | 81FCDFA1E775DC898BE03539 /* Classes */, 180 | ); 181 | path = Pod; 182 | sourceTree = ""; 183 | }; 184 | D26011E95A25E47FA0AB4D73 /* Products */ = { 185 | isa = PBXGroup; 186 | children = ( 187 | 06539F8C389AF10CF37BEC71 /* Pods.framework */, 188 | 6131A9C3AC35106F46A8AA61 /* TTRangeSlider.framework */, 189 | ); 190 | name = Products; 191 | sourceTree = ""; 192 | }; 193 | /* End PBXGroup section */ 194 | 195 | /* Begin PBXHeadersBuildPhase section */ 196 | 8E3B02D72C810C2A836709E5 /* Headers */ = { 197 | isa = PBXHeadersBuildPhase; 198 | buildActionMask = 2147483647; 199 | files = ( 200 | B08B43B0875BB0C4AEE2C344 /* Pods-TTRangeSlider-umbrella.h in Headers */, 201 | 619276ED5EB42E594B7C5333 /* TTRangeSlider.h in Headers */, 202 | D239E090DA3538B14BAA6A88 /* TTRangeSliderDelegate.h in Headers */, 203 | ); 204 | runOnlyForDeploymentPostprocessing = 0; 205 | }; 206 | B35B33EA6497DC6E0E2C63DB /* Headers */ = { 207 | isa = PBXHeadersBuildPhase; 208 | buildActionMask = 2147483647; 209 | files = ( 210 | 83551A31C8AFDFBB1826F727 /* Pods-umbrella.h in Headers */, 211 | ); 212 | runOnlyForDeploymentPostprocessing = 0; 213 | }; 214 | /* End PBXHeadersBuildPhase section */ 215 | 216 | /* Begin PBXNativeTarget section */ 217 | 3BE592CFC40868ECA261CCDA /* Pods-TTRangeSlider */ = { 218 | isa = PBXNativeTarget; 219 | buildConfigurationList = 2D47F809ED066E91A8465955 /* Build configuration list for PBXNativeTarget "Pods-TTRangeSlider" */; 220 | buildPhases = ( 221 | 1F2C90C6B45BF7BB05E7C79D /* Sources */, 222 | 9A88BD95948A18912EED3EB8 /* Frameworks */, 223 | 8E3B02D72C810C2A836709E5 /* Headers */, 224 | ); 225 | buildRules = ( 226 | ); 227 | dependencies = ( 228 | ); 229 | name = "Pods-TTRangeSlider"; 230 | productName = "Pods-TTRangeSlider"; 231 | productReference = 6131A9C3AC35106F46A8AA61 /* TTRangeSlider.framework */; 232 | productType = "com.apple.product-type.framework"; 233 | }; 234 | 5B2C5C65B558CC5C6259D9E8 /* Pods */ = { 235 | isa = PBXNativeTarget; 236 | buildConfigurationList = 2BF5757D54C967C57B61E207 /* Build configuration list for PBXNativeTarget "Pods" */; 237 | buildPhases = ( 238 | 7E8C51552810447524265D67 /* Sources */, 239 | 107B33AF7FA2CE836097B448 /* Frameworks */, 240 | B35B33EA6497DC6E0E2C63DB /* Headers */, 241 | ); 242 | buildRules = ( 243 | ); 244 | dependencies = ( 245 | C29778ADBB6DB364239BDCC5 /* PBXTargetDependency */, 246 | ); 247 | name = Pods; 248 | productName = Pods; 249 | productReference = 06539F8C389AF10CF37BEC71 /* Pods.framework */; 250 | productType = "com.apple.product-type.framework"; 251 | }; 252 | /* End PBXNativeTarget section */ 253 | 254 | /* Begin PBXProject section */ 255 | EFE1E39477C025EBAC8B5406 /* Project object */ = { 256 | isa = PBXProject; 257 | attributes = { 258 | LastUpgradeCheck = 0640; 259 | }; 260 | buildConfigurationList = 2D13EA650B390AE83FF25A36 /* Build configuration list for PBXProject "Pods" */; 261 | compatibilityVersion = "Xcode 3.2"; 262 | developmentRegion = English; 263 | hasScannedForEncodings = 0; 264 | knownRegions = ( 265 | en, 266 | ); 267 | mainGroup = A5B88EB1D5E767E23FD6C287; 268 | productRefGroup = D26011E95A25E47FA0AB4D73 /* Products */; 269 | projectDirPath = ""; 270 | projectRoot = ""; 271 | targets = ( 272 | 5B2C5C65B558CC5C6259D9E8 /* Pods */, 273 | 3BE592CFC40868ECA261CCDA /* Pods-TTRangeSlider */, 274 | ); 275 | }; 276 | /* End PBXProject section */ 277 | 278 | /* Begin PBXSourcesBuildPhase section */ 279 | 1F2C90C6B45BF7BB05E7C79D /* Sources */ = { 280 | isa = PBXSourcesBuildPhase; 281 | buildActionMask = 2147483647; 282 | files = ( 283 | D22C9235A9E83B8E81A27EE5 /* Pods-TTRangeSlider-dummy.m in Sources */, 284 | 7B6DF4ACD62EF103F1F2DA45 /* TTRangeSlider.m in Sources */, 285 | ); 286 | runOnlyForDeploymentPostprocessing = 0; 287 | }; 288 | 7E8C51552810447524265D67 /* Sources */ = { 289 | isa = PBXSourcesBuildPhase; 290 | buildActionMask = 2147483647; 291 | files = ( 292 | 3CE5C32FD3196B22B5BCB18B /* Pods-dummy.m in Sources */, 293 | ); 294 | runOnlyForDeploymentPostprocessing = 0; 295 | }; 296 | /* End PBXSourcesBuildPhase section */ 297 | 298 | /* Begin PBXTargetDependency section */ 299 | C29778ADBB6DB364239BDCC5 /* PBXTargetDependency */ = { 300 | isa = PBXTargetDependency; 301 | name = "Pods-TTRangeSlider"; 302 | target = 3BE592CFC40868ECA261CCDA /* Pods-TTRangeSlider */; 303 | targetProxy = FD8149C3EB62FD7BCF6A0E57 /* PBXContainerItemProxy */; 304 | }; 305 | /* End PBXTargetDependency section */ 306 | 307 | /* Begin XCBuildConfiguration section */ 308 | 05E6BBABECB1A435DA3A5EC9 /* Debug */ = { 309 | isa = XCBuildConfiguration; 310 | baseConfigurationReference = 4882ED10282EC8369439DA7E /* Pods.debug.xcconfig */; 311 | buildSettings = { 312 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 313 | CURRENT_PROJECT_VERSION = 1; 314 | DEFINES_MODULE = YES; 315 | DYLIB_COMPATIBILITY_VERSION = 1; 316 | DYLIB_CURRENT_VERSION = 1; 317 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 318 | ENABLE_STRICT_OBJC_MSGSEND = YES; 319 | INFOPLIST_FILE = "Target Support Files/Pods/Info.plist"; 320 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 321 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 322 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 323 | MODULEMAP_FILE = "Target Support Files/Pods/Pods.modulemap"; 324 | MTL_ENABLE_DEBUG_INFO = YES; 325 | OTHER_LDFLAGS = ""; 326 | OTHER_LIBTOOLFLAGS = ""; 327 | PODS_ROOT = "$(SRCROOT)"; 328 | PRODUCT_NAME = Pods; 329 | SDKROOT = iphoneos; 330 | SKIP_INSTALL = YES; 331 | TARGETED_DEVICE_FAMILY = "1,2"; 332 | VERSIONING_SYSTEM = "apple-generic"; 333 | VERSION_INFO_PREFIX = ""; 334 | }; 335 | name = Debug; 336 | }; 337 | 3B61DFA354CFCE5C28E515AB /* Debug */ = { 338 | isa = XCBuildConfiguration; 339 | buildSettings = { 340 | ALWAYS_SEARCH_USER_PATHS = NO; 341 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 342 | CLANG_CXX_LIBRARY = "libc++"; 343 | CLANG_ENABLE_MODULES = YES; 344 | CLANG_ENABLE_OBJC_ARC = YES; 345 | CLANG_WARN_BOOL_CONVERSION = YES; 346 | CLANG_WARN_CONSTANT_CONVERSION = YES; 347 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 348 | CLANG_WARN_EMPTY_BODY = YES; 349 | CLANG_WARN_ENUM_CONVERSION = YES; 350 | CLANG_WARN_INT_CONVERSION = YES; 351 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 352 | CLANG_WARN_UNREACHABLE_CODE = YES; 353 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 354 | COPY_PHASE_STRIP = NO; 355 | GCC_C_LANGUAGE_STANDARD = gnu99; 356 | GCC_DYNAMIC_NO_PIC = NO; 357 | GCC_OPTIMIZATION_LEVEL = 0; 358 | GCC_PREPROCESSOR_DEFINITIONS = ( 359 | "DEBUG=1", 360 | "$(inherited)", 361 | ); 362 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 363 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 364 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 365 | GCC_WARN_UNDECLARED_SELECTOR = YES; 366 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 367 | GCC_WARN_UNUSED_FUNCTION = YES; 368 | GCC_WARN_UNUSED_VARIABLE = YES; 369 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 370 | ONLY_ACTIVE_ARCH = YES; 371 | STRIP_INSTALLED_PRODUCT = NO; 372 | SYMROOT = "${SRCROOT}/../build"; 373 | }; 374 | name = Debug; 375 | }; 376 | 509D0AC38F9B4E35E1DB0423 /* Release */ = { 377 | isa = XCBuildConfiguration; 378 | baseConfigurationReference = D41871E419BD612D6025638E /* Pods.release.xcconfig */; 379 | buildSettings = { 380 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 381 | CURRENT_PROJECT_VERSION = 1; 382 | DEFINES_MODULE = YES; 383 | DYLIB_COMPATIBILITY_VERSION = 1; 384 | DYLIB_CURRENT_VERSION = 1; 385 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 386 | ENABLE_STRICT_OBJC_MSGSEND = YES; 387 | INFOPLIST_FILE = "Target Support Files/Pods/Info.plist"; 388 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 389 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 390 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 391 | MODULEMAP_FILE = "Target Support Files/Pods/Pods.modulemap"; 392 | MTL_ENABLE_DEBUG_INFO = NO; 393 | OTHER_LDFLAGS = ""; 394 | OTHER_LIBTOOLFLAGS = ""; 395 | PODS_ROOT = "$(SRCROOT)"; 396 | PRODUCT_NAME = Pods; 397 | SDKROOT = iphoneos; 398 | SKIP_INSTALL = YES; 399 | TARGETED_DEVICE_FAMILY = "1,2"; 400 | VERSIONING_SYSTEM = "apple-generic"; 401 | VERSION_INFO_PREFIX = ""; 402 | }; 403 | name = Release; 404 | }; 405 | 81BDAB922D167EC6618FCC0D /* Release */ = { 406 | isa = XCBuildConfiguration; 407 | buildSettings = { 408 | ALWAYS_SEARCH_USER_PATHS = NO; 409 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 410 | CLANG_CXX_LIBRARY = "libc++"; 411 | CLANG_ENABLE_MODULES = YES; 412 | CLANG_ENABLE_OBJC_ARC = YES; 413 | CLANG_WARN_BOOL_CONVERSION = YES; 414 | CLANG_WARN_CONSTANT_CONVERSION = YES; 415 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 416 | CLANG_WARN_EMPTY_BODY = YES; 417 | CLANG_WARN_ENUM_CONVERSION = YES; 418 | CLANG_WARN_INT_CONVERSION = YES; 419 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 420 | CLANG_WARN_UNREACHABLE_CODE = YES; 421 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 422 | COPY_PHASE_STRIP = YES; 423 | ENABLE_NS_ASSERTIONS = NO; 424 | GCC_C_LANGUAGE_STANDARD = gnu99; 425 | GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; 426 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 427 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 428 | GCC_WARN_UNDECLARED_SELECTOR = YES; 429 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 430 | GCC_WARN_UNUSED_FUNCTION = YES; 431 | GCC_WARN_UNUSED_VARIABLE = YES; 432 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 433 | STRIP_INSTALLED_PRODUCT = NO; 434 | SYMROOT = "${SRCROOT}/../build"; 435 | VALIDATE_PRODUCT = YES; 436 | }; 437 | name = Release; 438 | }; 439 | B5A4B89C61F89B983DAFE474 /* Debug */ = { 440 | isa = XCBuildConfiguration; 441 | baseConfigurationReference = C874F737B728285604C0FACC /* Pods-TTRangeSlider-Private.xcconfig */; 442 | buildSettings = { 443 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 444 | CURRENT_PROJECT_VERSION = 1; 445 | DEFINES_MODULE = YES; 446 | DYLIB_COMPATIBILITY_VERSION = 1; 447 | DYLIB_CURRENT_VERSION = 1; 448 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 449 | ENABLE_STRICT_OBJC_MSGSEND = YES; 450 | GCC_PREFIX_HEADER = "Target Support Files/Pods-TTRangeSlider/Pods-TTRangeSlider-prefix.pch"; 451 | INFOPLIST_FILE = "Target Support Files/Pods-TTRangeSlider/Info.plist"; 452 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 453 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 454 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 455 | MODULEMAP_FILE = "Target Support Files/Pods-TTRangeSlider/Pods-TTRangeSlider.modulemap"; 456 | MTL_ENABLE_DEBUG_INFO = YES; 457 | PRODUCT_NAME = TTRangeSlider; 458 | SDKROOT = iphoneos; 459 | SKIP_INSTALL = YES; 460 | TARGETED_DEVICE_FAMILY = "1,2"; 461 | VERSIONING_SYSTEM = "apple-generic"; 462 | VERSION_INFO_PREFIX = ""; 463 | }; 464 | name = Debug; 465 | }; 466 | E6FCA2E7A2BBCEA29E00D893 /* Release */ = { 467 | isa = XCBuildConfiguration; 468 | baseConfigurationReference = C874F737B728285604C0FACC /* Pods-TTRangeSlider-Private.xcconfig */; 469 | buildSettings = { 470 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 471 | CURRENT_PROJECT_VERSION = 1; 472 | DEFINES_MODULE = YES; 473 | DYLIB_COMPATIBILITY_VERSION = 1; 474 | DYLIB_CURRENT_VERSION = 1; 475 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 476 | ENABLE_STRICT_OBJC_MSGSEND = YES; 477 | GCC_PREFIX_HEADER = "Target Support Files/Pods-TTRangeSlider/Pods-TTRangeSlider-prefix.pch"; 478 | INFOPLIST_FILE = "Target Support Files/Pods-TTRangeSlider/Info.plist"; 479 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 480 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 481 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 482 | MODULEMAP_FILE = "Target Support Files/Pods-TTRangeSlider/Pods-TTRangeSlider.modulemap"; 483 | MTL_ENABLE_DEBUG_INFO = NO; 484 | PRODUCT_NAME = TTRangeSlider; 485 | SDKROOT = iphoneos; 486 | SKIP_INSTALL = YES; 487 | TARGETED_DEVICE_FAMILY = "1,2"; 488 | VERSIONING_SYSTEM = "apple-generic"; 489 | VERSION_INFO_PREFIX = ""; 490 | }; 491 | name = Release; 492 | }; 493 | /* End XCBuildConfiguration section */ 494 | 495 | /* Begin XCConfigurationList section */ 496 | 2BF5757D54C967C57B61E207 /* Build configuration list for PBXNativeTarget "Pods" */ = { 497 | isa = XCConfigurationList; 498 | buildConfigurations = ( 499 | 05E6BBABECB1A435DA3A5EC9 /* Debug */, 500 | 509D0AC38F9B4E35E1DB0423 /* Release */, 501 | ); 502 | defaultConfigurationIsVisible = 0; 503 | defaultConfigurationName = Release; 504 | }; 505 | 2D13EA650B390AE83FF25A36 /* Build configuration list for PBXProject "Pods" */ = { 506 | isa = XCConfigurationList; 507 | buildConfigurations = ( 508 | 3B61DFA354CFCE5C28E515AB /* Debug */, 509 | 81BDAB922D167EC6618FCC0D /* Release */, 510 | ); 511 | defaultConfigurationIsVisible = 0; 512 | defaultConfigurationName = Release; 513 | }; 514 | 2D47F809ED066E91A8465955 /* Build configuration list for PBXNativeTarget "Pods-TTRangeSlider" */ = { 515 | isa = XCConfigurationList; 516 | buildConfigurations = ( 517 | B5A4B89C61F89B983DAFE474 /* Debug */, 518 | E6FCA2E7A2BBCEA29E00D893 /* Release */, 519 | ); 520 | defaultConfigurationIsVisible = 0; 521 | defaultConfigurationName = Release; 522 | }; 523 | /* End XCConfigurationList section */ 524 | }; 525 | rootObject = EFE1E39477C025EBAC8B5406 /* Project object */; 526 | } 527 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-TTRangeSlider.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTRangeSlider/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.2 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTRangeSlider/Pods-TTRangeSlider-Private.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods-TTRangeSlider.xcconfig" 2 | CONFIGURATION_BUILD_DIR = $PODS_FRAMEWORK_BUILD_PATH 3 | FRAMEWORK_SEARCH_PATHS = "$PODS_FRAMEWORK_BUILD_PATH" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/TTRangeSlider" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/TTRangeSlider" 6 | OTHER_LDFLAGS = -ObjC 7 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods 8 | PODS_ROOT = ${SRCROOT} 9 | SKIP_INSTALL = YES -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTRangeSlider/Pods-TTRangeSlider-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_TTRangeSlider : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_TTRangeSlider 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTRangeSlider/Pods-TTRangeSlider-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "Pods-environment.h" 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTRangeSlider/Pods-TTRangeSlider-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "TTRangeSliderDelegate.h" 4 | #import "TTRangeSlider.h" 5 | 6 | FOUNDATION_EXPORT double TTRangeSliderVersionNumber; 7 | FOUNDATION_EXPORT const unsigned char TTRangeSliderVersionString[]; 8 | 9 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTRangeSlider/Pods-TTRangeSlider.modulemap: -------------------------------------------------------------------------------- 1 | framework module TTRangeSlider { 2 | umbrella header "Pods-TTRangeSlider-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTRangeSlider/Pods-TTRangeSlider.xcconfig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TomThorpe/TTRangeSlider/2860afbeea8d6467014e271e3dd17e26e70f240f/Example/Pods/Target Support Files/Pods-TTRangeSlider/Pods-TTRangeSlider.xcconfig -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 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/Pods-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## TTRangeSlider 5 | 6 | Copyright (c) 2015 Tom Thorpe 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - http://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods/Pods-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 | Copyright (c) 2015 Tom Thorpe <code@tomthorpe.co.uk> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 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 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | Title 38 | TTRangeSlider 39 | Type 40 | PSGroupSpecifier 41 | 42 | 43 | FooterText 44 | Generated by CocoaPods - http://cocoapods.org 45 | Title 46 | 47 | Type 48 | PSGroupSpecifier 49 | 50 | 51 | StringsTable 52 | Acknowledgements 53 | Title 54 | Acknowledgements 55 | 56 | 57 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods/Pods-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods : NSObject 3 | @end 4 | @implementation PodsDummy_Pods 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods/Pods-environment.h: -------------------------------------------------------------------------------- 1 | 2 | // To check if a library is compiled with CocoaPods you 3 | // can use the `COCOAPODS` macro definition which is 4 | // defined in the xcconfigs so it is available in 5 | // headers also when they are imported in the client 6 | // project. 7 | 8 | 9 | // TTRangeSlider 10 | #define COCOAPODS_POD_AVAILABLE_TTRangeSlider 11 | #define COCOAPODS_VERSION_MAJOR_TTRangeSlider 1 12 | #define COCOAPODS_VERSION_MINOR_TTRangeSlider 0 13 | #define COCOAPODS_VERSION_PATCH_TTRangeSlider 2 14 | 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods/Pods-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | local source="${BUILT_PRODUCTS_DIR}/Pods/$1" 12 | local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 13 | 14 | if [ -L "${source}" ]; then 15 | echo "Symlinked..." 16 | source=$(readlink "${source}") 17 | fi 18 | 19 | # use filter instead of exclude so missing patterns dont' throw errors 20 | echo "rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers/" --filter "- PrivateHeaders/" --filter "- Modules/" ${source} ${destination}" 21 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers/" --filter "- PrivateHeaders/" --filter "- Modules/" "${source}" "${destination}" 22 | # Resign the code if required by the build settings to avoid unstable apps 23 | if [ "${CODE_SIGNING_REQUIRED}" == "YES" ]; then 24 | code_sign "${destination}/$1" 25 | fi 26 | 27 | # Embed linked Swift runtime libraries 28 | local basename 29 | basename=$(echo $1 | sed -E s/\\..+// && exit ${PIPESTATUS[0]}) 30 | local swift_runtime_libs 31 | swift_runtime_libs=$(xcrun otool -LX "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/$1/${basename}" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 32 | for lib in $swift_runtime_libs; do 33 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 34 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 35 | if [ "${CODE_SIGNING_REQUIRED}" == "YES" ]; then 36 | code_sign "${destination}/${lib}" 37 | fi 38 | done 39 | } 40 | 41 | # Signs a framework with the provided identity 42 | code_sign() { 43 | # Use the current code_sign_identitiy 44 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 45 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements $1" 46 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" 47 | } 48 | 49 | 50 | if [[ "$CONFIGURATION" == "Debug" ]]; then 51 | install_framework 'TTRangeSlider.framework' 52 | fi 53 | if [[ "$CONFIGURATION" == "Release" ]]; then 54 | install_framework 'TTRangeSlider.framework' 55 | fi 56 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods/Pods-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | realpath() { 12 | DIRECTORY=$(cd "${1%/*}" && pwd) 13 | FILENAME="${1##*/}" 14 | echo "$DIRECTORY/$FILENAME" 15 | } 16 | 17 | install_resource() 18 | { 19 | case $1 in 20 | *.storyboard) 21 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 22 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 23 | ;; 24 | *.xib) 25 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 26 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 27 | ;; 28 | *.framework) 29 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 30 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 31 | echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 32 | rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 33 | ;; 34 | *.xcdatamodel) 35 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" 36 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" 37 | ;; 38 | *.xcdatamodeld) 39 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" 40 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" 41 | ;; 42 | *.xcmappingmodel) 43 | echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" 44 | xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" 45 | ;; 46 | *.xcassets) 47 | ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") 48 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 49 | ;; 50 | /*) 51 | echo "$1" 52 | echo "$1" >> "$RESOURCES_TO_COPY" 53 | ;; 54 | *) 55 | echo "${PODS_ROOT}/$1" 56 | echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" 57 | ;; 58 | esac 59 | } 60 | 61 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 62 | if [[ "${ACTION}" == "install" ]]; then 63 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 64 | fi 65 | rm -f "$RESOURCES_TO_COPY" 66 | 67 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 68 | then 69 | case "${TARGETED_DEVICE_FAMILY}" in 70 | 1,2) 71 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 72 | ;; 73 | 1) 74 | TARGET_DEVICE_ARGS="--target-device iphone" 75 | ;; 76 | 2) 77 | TARGET_DEVICE_ARGS="--target-device ipad" 78 | ;; 79 | *) 80 | TARGET_DEVICE_ARGS="--target-device mac" 81 | ;; 82 | esac 83 | 84 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 85 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 86 | while read line; do 87 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 88 | XCASSET_FILES+=("$line") 89 | fi 90 | done <<<"$OTHER_XCASSETS" 91 | 92 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 93 | fi 94 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods/Pods-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double PodsVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char PodsVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods/Pods.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_FRAMEWORK_BUILD_PATH" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_FRAMEWORK_BUILD_PATH/TTRangeSlider.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -ObjC -framework "TTRangeSlider" 6 | OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) 7 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods 8 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods/Pods.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods { 2 | umbrella header "Pods-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods/Pods.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_FRAMEWORK_BUILD_PATH" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_FRAMEWORK_BUILD_PATH/TTRangeSlider.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -ObjC -framework "TTRangeSlider" 6 | OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) 7 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods 8 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Example/RangeSliderDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 64495A441ACAD93700482D73 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 64495A431ACAD93700482D73 /* main.m */; }; 11 | 64495A471ACAD93700482D73 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 64495A461ACAD93700482D73 /* AppDelegate.m */; }; 12 | 64495A4A1ACAD93700482D73 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 64495A491ACAD93700482D73 /* ViewController.m */; }; 13 | 64495A4D1ACAD93700482D73 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 64495A4B1ACAD93700482D73 /* Main.storyboard */; }; 14 | 64495A4F1ACAD93700482D73 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 64495A4E1ACAD93700482D73 /* Images.xcassets */; }; 15 | 64495A521ACAD93700482D73 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 64495A501ACAD93700482D73 /* LaunchScreen.xib */; }; 16 | 64495A5E1ACAD93700482D73 /* RangeSliderDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 64495A5D1ACAD93700482D73 /* RangeSliderDemoTests.m */; }; 17 | 6BA46D091BD8E1CF0049740C /* custom-handle.png in Resources */ = {isa = PBXBuildFile; fileRef = 6BA46D081BD8E1CF0049740C /* custom-handle.png */; settings = {ASSET_TAGS = (); }; }; 18 | E06CDBE58BA42330DDAA7756 /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F3B160588054A1ABBEE2B53C /* Pods.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 64495A581ACAD93700482D73 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = 64495A361ACAD93700482D73 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 64495A3D1ACAD93700482D73; 27 | remoteInfo = RangeSliderDemo; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 3DBBEE5E29AE142C4743C900 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; 33 | 64495A3E1ACAD93700482D73 /* RangeSliderDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RangeSliderDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | 64495A421ACAD93700482D73 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 35 | 64495A431ACAD93700482D73 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 36 | 64495A451ACAD93700482D73 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 37 | 64495A461ACAD93700482D73 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 38 | 64495A481ACAD93700482D73 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 39 | 64495A491ACAD93700482D73 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 40 | 64495A4C1ACAD93700482D73 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 41 | 64495A4E1ACAD93700482D73 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 42 | 64495A511ACAD93700482D73 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 43 | 64495A571ACAD93700482D73 /* RangeSliderDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RangeSliderDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 64495A5C1ACAD93700482D73 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | 64495A5D1ACAD93700482D73 /* RangeSliderDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RangeSliderDemoTests.m; sourceTree = ""; }; 46 | 6BA46D081BD8E1CF0049740C /* custom-handle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "custom-handle.png"; sourceTree = ""; }; 47 | E03B9800BFD96602A5FB30A7 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; 48 | F3B160588054A1ABBEE2B53C /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | /* End PBXFileReference section */ 50 | 51 | /* Begin PBXFrameworksBuildPhase section */ 52 | 64495A3B1ACAD93700482D73 /* Frameworks */ = { 53 | isa = PBXFrameworksBuildPhase; 54 | buildActionMask = 2147483647; 55 | files = ( 56 | E06CDBE58BA42330DDAA7756 /* Pods.framework in Frameworks */, 57 | ); 58 | runOnlyForDeploymentPostprocessing = 0; 59 | }; 60 | 64495A541ACAD93700482D73 /* Frameworks */ = { 61 | isa = PBXFrameworksBuildPhase; 62 | buildActionMask = 2147483647; 63 | files = ( 64 | ); 65 | runOnlyForDeploymentPostprocessing = 0; 66 | }; 67 | /* End PBXFrameworksBuildPhase section */ 68 | 69 | /* Begin PBXGroup section */ 70 | 14ACF65C76FC4FFB4BB6625D /* Frameworks */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | F3B160588054A1ABBEE2B53C /* Pods.framework */, 74 | ); 75 | name = Frameworks; 76 | sourceTree = ""; 77 | }; 78 | 3BBE6838E889427035751638 /* Pods */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | E03B9800BFD96602A5FB30A7 /* Pods.debug.xcconfig */, 82 | 3DBBEE5E29AE142C4743C900 /* Pods.release.xcconfig */, 83 | ); 84 | name = Pods; 85 | sourceTree = ""; 86 | }; 87 | 64495A351ACAD93700482D73 = { 88 | isa = PBXGroup; 89 | children = ( 90 | 64495A401ACAD93700482D73 /* RangeSliderDemo */, 91 | 64495A5A1ACAD93700482D73 /* RangeSliderDemoTests */, 92 | 64495A3F1ACAD93700482D73 /* Products */, 93 | 3BBE6838E889427035751638 /* Pods */, 94 | 14ACF65C76FC4FFB4BB6625D /* Frameworks */, 95 | ); 96 | sourceTree = ""; 97 | }; 98 | 64495A3F1ACAD93700482D73 /* Products */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 64495A3E1ACAD93700482D73 /* RangeSliderDemo.app */, 102 | 64495A571ACAD93700482D73 /* RangeSliderDemoTests.xctest */, 103 | ); 104 | name = Products; 105 | sourceTree = ""; 106 | }; 107 | 64495A401ACAD93700482D73 /* RangeSliderDemo */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 6BA46D051BD8DCC60049740C /* images */, 111 | 64495A451ACAD93700482D73 /* AppDelegate.h */, 112 | 64495A461ACAD93700482D73 /* AppDelegate.m */, 113 | 64495A481ACAD93700482D73 /* ViewController.h */, 114 | 64495A491ACAD93700482D73 /* ViewController.m */, 115 | 64495A4B1ACAD93700482D73 /* Main.storyboard */, 116 | 64495A4E1ACAD93700482D73 /* Images.xcassets */, 117 | 64495A501ACAD93700482D73 /* LaunchScreen.xib */, 118 | 64495A411ACAD93700482D73 /* Supporting Files */, 119 | ); 120 | path = RangeSliderDemo; 121 | sourceTree = ""; 122 | }; 123 | 64495A411ACAD93700482D73 /* Supporting Files */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 64495A421ACAD93700482D73 /* Info.plist */, 127 | 64495A431ACAD93700482D73 /* main.m */, 128 | ); 129 | name = "Supporting Files"; 130 | sourceTree = ""; 131 | }; 132 | 64495A5A1ACAD93700482D73 /* RangeSliderDemoTests */ = { 133 | isa = PBXGroup; 134 | children = ( 135 | 64495A5D1ACAD93700482D73 /* RangeSliderDemoTests.m */, 136 | 64495A5B1ACAD93700482D73 /* Supporting Files */, 137 | ); 138 | path = RangeSliderDemoTests; 139 | sourceTree = ""; 140 | }; 141 | 64495A5B1ACAD93700482D73 /* Supporting Files */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | 64495A5C1ACAD93700482D73 /* Info.plist */, 145 | ); 146 | name = "Supporting Files"; 147 | sourceTree = ""; 148 | }; 149 | 6BA46D051BD8DCC60049740C /* images */ = { 150 | isa = PBXGroup; 151 | children = ( 152 | 6BA46D081BD8E1CF0049740C /* custom-handle.png */, 153 | ); 154 | name = images; 155 | sourceTree = ""; 156 | }; 157 | /* End PBXGroup section */ 158 | 159 | /* Begin PBXNativeTarget section */ 160 | 64495A3D1ACAD93700482D73 /* RangeSliderDemo */ = { 161 | isa = PBXNativeTarget; 162 | buildConfigurationList = 64495A611ACAD93700482D73 /* Build configuration list for PBXNativeTarget "RangeSliderDemo" */; 163 | buildPhases = ( 164 | C00C0A5A2102F7AE46FE79FE /* Check Pods Manifest.lock */, 165 | 64495A3A1ACAD93700482D73 /* Sources */, 166 | 64495A3B1ACAD93700482D73 /* Frameworks */, 167 | 64495A3C1ACAD93700482D73 /* Resources */, 168 | DE9C2C55B2ECBE6D272551DB /* Copy Pods Resources */, 169 | 535947C51E2BAB645D940AAE /* Embed Pods Frameworks */, 170 | ); 171 | buildRules = ( 172 | ); 173 | dependencies = ( 174 | ); 175 | name = RangeSliderDemo; 176 | productName = RangeSliderDemo; 177 | productReference = 64495A3E1ACAD93700482D73 /* RangeSliderDemo.app */; 178 | productType = "com.apple.product-type.application"; 179 | }; 180 | 64495A561ACAD93700482D73 /* RangeSliderDemoTests */ = { 181 | isa = PBXNativeTarget; 182 | buildConfigurationList = 64495A641ACAD93700482D73 /* Build configuration list for PBXNativeTarget "RangeSliderDemoTests" */; 183 | buildPhases = ( 184 | 64495A531ACAD93700482D73 /* Sources */, 185 | 64495A541ACAD93700482D73 /* Frameworks */, 186 | 64495A551ACAD93700482D73 /* Resources */, 187 | ); 188 | buildRules = ( 189 | ); 190 | dependencies = ( 191 | 64495A591ACAD93700482D73 /* PBXTargetDependency */, 192 | ); 193 | name = RangeSliderDemoTests; 194 | productName = RangeSliderDemoTests; 195 | productReference = 64495A571ACAD93700482D73 /* RangeSliderDemoTests.xctest */; 196 | productType = "com.apple.product-type.bundle.unit-test"; 197 | }; 198 | /* End PBXNativeTarget section */ 199 | 200 | /* Begin PBXProject section */ 201 | 64495A361ACAD93700482D73 /* Project object */ = { 202 | isa = PBXProject; 203 | attributes = { 204 | LastUpgradeCheck = 0610; 205 | ORGANIZATIONNAME = tomthorpe; 206 | TargetAttributes = { 207 | 64495A3D1ACAD93700482D73 = { 208 | CreatedOnToolsVersion = 6.1.1; 209 | }; 210 | 64495A561ACAD93700482D73 = { 211 | CreatedOnToolsVersion = 6.1.1; 212 | TestTargetID = 64495A3D1ACAD93700482D73; 213 | }; 214 | }; 215 | }; 216 | buildConfigurationList = 64495A391ACAD93700482D73 /* Build configuration list for PBXProject "RangeSliderDemo" */; 217 | compatibilityVersion = "Xcode 3.2"; 218 | developmentRegion = English; 219 | hasScannedForEncodings = 0; 220 | knownRegions = ( 221 | en, 222 | Base, 223 | ); 224 | mainGroup = 64495A351ACAD93700482D73; 225 | productRefGroup = 64495A3F1ACAD93700482D73 /* Products */; 226 | projectDirPath = ""; 227 | projectRoot = ""; 228 | targets = ( 229 | 64495A3D1ACAD93700482D73 /* RangeSliderDemo */, 230 | 64495A561ACAD93700482D73 /* RangeSliderDemoTests */, 231 | ); 232 | }; 233 | /* End PBXProject section */ 234 | 235 | /* Begin PBXResourcesBuildPhase section */ 236 | 64495A3C1ACAD93700482D73 /* Resources */ = { 237 | isa = PBXResourcesBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | 64495A4D1ACAD93700482D73 /* Main.storyboard in Resources */, 241 | 64495A521ACAD93700482D73 /* LaunchScreen.xib in Resources */, 242 | 6BA46D091BD8E1CF0049740C /* custom-handle.png in Resources */, 243 | 64495A4F1ACAD93700482D73 /* Images.xcassets in Resources */, 244 | ); 245 | runOnlyForDeploymentPostprocessing = 0; 246 | }; 247 | 64495A551ACAD93700482D73 /* Resources */ = { 248 | isa = PBXResourcesBuildPhase; 249 | buildActionMask = 2147483647; 250 | files = ( 251 | ); 252 | runOnlyForDeploymentPostprocessing = 0; 253 | }; 254 | /* End PBXResourcesBuildPhase section */ 255 | 256 | /* Begin PBXShellScriptBuildPhase section */ 257 | 535947C51E2BAB645D940AAE /* Embed Pods Frameworks */ = { 258 | isa = PBXShellScriptBuildPhase; 259 | buildActionMask = 2147483647; 260 | files = ( 261 | ); 262 | inputPaths = ( 263 | ); 264 | name = "Embed Pods Frameworks"; 265 | outputPaths = ( 266 | ); 267 | runOnlyForDeploymentPostprocessing = 0; 268 | shellPath = /bin/sh; 269 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; 270 | showEnvVarsInLog = 0; 271 | }; 272 | C00C0A5A2102F7AE46FE79FE /* Check Pods Manifest.lock */ = { 273 | isa = PBXShellScriptBuildPhase; 274 | buildActionMask = 2147483647; 275 | files = ( 276 | ); 277 | inputPaths = ( 278 | ); 279 | name = "Check Pods Manifest.lock"; 280 | outputPaths = ( 281 | ); 282 | runOnlyForDeploymentPostprocessing = 0; 283 | shellPath = /bin/sh; 284 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 285 | showEnvVarsInLog = 0; 286 | }; 287 | DE9C2C55B2ECBE6D272551DB /* Copy Pods Resources */ = { 288 | isa = PBXShellScriptBuildPhase; 289 | buildActionMask = 2147483647; 290 | files = ( 291 | ); 292 | inputPaths = ( 293 | ); 294 | name = "Copy Pods Resources"; 295 | outputPaths = ( 296 | ); 297 | runOnlyForDeploymentPostprocessing = 0; 298 | shellPath = /bin/sh; 299 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; 300 | showEnvVarsInLog = 0; 301 | }; 302 | /* End PBXShellScriptBuildPhase section */ 303 | 304 | /* Begin PBXSourcesBuildPhase section */ 305 | 64495A3A1ACAD93700482D73 /* Sources */ = { 306 | isa = PBXSourcesBuildPhase; 307 | buildActionMask = 2147483647; 308 | files = ( 309 | 64495A4A1ACAD93700482D73 /* ViewController.m in Sources */, 310 | 64495A471ACAD93700482D73 /* AppDelegate.m in Sources */, 311 | 64495A441ACAD93700482D73 /* main.m in Sources */, 312 | ); 313 | runOnlyForDeploymentPostprocessing = 0; 314 | }; 315 | 64495A531ACAD93700482D73 /* Sources */ = { 316 | isa = PBXSourcesBuildPhase; 317 | buildActionMask = 2147483647; 318 | files = ( 319 | 64495A5E1ACAD93700482D73 /* RangeSliderDemoTests.m in Sources */, 320 | ); 321 | runOnlyForDeploymentPostprocessing = 0; 322 | }; 323 | /* End PBXSourcesBuildPhase section */ 324 | 325 | /* Begin PBXTargetDependency section */ 326 | 64495A591ACAD93700482D73 /* PBXTargetDependency */ = { 327 | isa = PBXTargetDependency; 328 | target = 64495A3D1ACAD93700482D73 /* RangeSliderDemo */; 329 | targetProxy = 64495A581ACAD93700482D73 /* PBXContainerItemProxy */; 330 | }; 331 | /* End PBXTargetDependency section */ 332 | 333 | /* Begin PBXVariantGroup section */ 334 | 64495A4B1ACAD93700482D73 /* Main.storyboard */ = { 335 | isa = PBXVariantGroup; 336 | children = ( 337 | 64495A4C1ACAD93700482D73 /* Base */, 338 | ); 339 | name = Main.storyboard; 340 | sourceTree = ""; 341 | }; 342 | 64495A501ACAD93700482D73 /* LaunchScreen.xib */ = { 343 | isa = PBXVariantGroup; 344 | children = ( 345 | 64495A511ACAD93700482D73 /* Base */, 346 | ); 347 | name = LaunchScreen.xib; 348 | sourceTree = ""; 349 | }; 350 | /* End PBXVariantGroup section */ 351 | 352 | /* Begin XCBuildConfiguration section */ 353 | 64495A5F1ACAD93700482D73 /* Debug */ = { 354 | isa = XCBuildConfiguration; 355 | buildSettings = { 356 | ALWAYS_SEARCH_USER_PATHS = NO; 357 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 358 | CLANG_CXX_LIBRARY = "libc++"; 359 | CLANG_ENABLE_MODULES = YES; 360 | CLANG_ENABLE_OBJC_ARC = YES; 361 | CLANG_WARN_BOOL_CONVERSION = YES; 362 | CLANG_WARN_CONSTANT_CONVERSION = YES; 363 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 364 | CLANG_WARN_EMPTY_BODY = YES; 365 | CLANG_WARN_ENUM_CONVERSION = YES; 366 | CLANG_WARN_INT_CONVERSION = YES; 367 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 368 | CLANG_WARN_UNREACHABLE_CODE = YES; 369 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 370 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 371 | COPY_PHASE_STRIP = NO; 372 | ENABLE_STRICT_OBJC_MSGSEND = YES; 373 | GCC_C_LANGUAGE_STANDARD = gnu99; 374 | GCC_DYNAMIC_NO_PIC = NO; 375 | GCC_OPTIMIZATION_LEVEL = 0; 376 | GCC_PREPROCESSOR_DEFINITIONS = ( 377 | "DEBUG=1", 378 | "$(inherited)", 379 | ); 380 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 381 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 382 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 383 | GCC_WARN_UNDECLARED_SELECTOR = YES; 384 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 385 | GCC_WARN_UNUSED_FUNCTION = YES; 386 | GCC_WARN_UNUSED_VARIABLE = YES; 387 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 388 | MTL_ENABLE_DEBUG_INFO = YES; 389 | ONLY_ACTIVE_ARCH = YES; 390 | SDKROOT = iphoneos; 391 | }; 392 | name = Debug; 393 | }; 394 | 64495A601ACAD93700482D73 /* Release */ = { 395 | isa = XCBuildConfiguration; 396 | buildSettings = { 397 | ALWAYS_SEARCH_USER_PATHS = NO; 398 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 399 | CLANG_CXX_LIBRARY = "libc++"; 400 | CLANG_ENABLE_MODULES = YES; 401 | CLANG_ENABLE_OBJC_ARC = YES; 402 | CLANG_WARN_BOOL_CONVERSION = YES; 403 | CLANG_WARN_CONSTANT_CONVERSION = YES; 404 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 405 | CLANG_WARN_EMPTY_BODY = YES; 406 | CLANG_WARN_ENUM_CONVERSION = YES; 407 | CLANG_WARN_INT_CONVERSION = YES; 408 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 409 | CLANG_WARN_UNREACHABLE_CODE = YES; 410 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 411 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 412 | COPY_PHASE_STRIP = YES; 413 | ENABLE_NS_ASSERTIONS = NO; 414 | ENABLE_STRICT_OBJC_MSGSEND = YES; 415 | GCC_C_LANGUAGE_STANDARD = gnu99; 416 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 417 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 418 | GCC_WARN_UNDECLARED_SELECTOR = YES; 419 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 420 | GCC_WARN_UNUSED_FUNCTION = YES; 421 | GCC_WARN_UNUSED_VARIABLE = YES; 422 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 423 | MTL_ENABLE_DEBUG_INFO = NO; 424 | SDKROOT = iphoneos; 425 | VALIDATE_PRODUCT = YES; 426 | }; 427 | name = Release; 428 | }; 429 | 64495A621ACAD93700482D73 /* Debug */ = { 430 | isa = XCBuildConfiguration; 431 | baseConfigurationReference = E03B9800BFD96602A5FB30A7 /* Pods.debug.xcconfig */; 432 | buildSettings = { 433 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 434 | CODE_SIGN_IDENTITY = "iPhone Developer"; 435 | INFOPLIST_FILE = RangeSliderDemo/Info.plist; 436 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 437 | PRODUCT_NAME = "$(TARGET_NAME)"; 438 | }; 439 | name = Debug; 440 | }; 441 | 64495A631ACAD93700482D73 /* Release */ = { 442 | isa = XCBuildConfiguration; 443 | baseConfigurationReference = 3DBBEE5E29AE142C4743C900 /* Pods.release.xcconfig */; 444 | buildSettings = { 445 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 446 | CODE_SIGN_IDENTITY = "iPhone Developer"; 447 | INFOPLIST_FILE = RangeSliderDemo/Info.plist; 448 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 449 | PRODUCT_NAME = "$(TARGET_NAME)"; 450 | }; 451 | name = Release; 452 | }; 453 | 64495A651ACAD93700482D73 /* Debug */ = { 454 | isa = XCBuildConfiguration; 455 | buildSettings = { 456 | BUNDLE_LOADER = "$(TEST_HOST)"; 457 | FRAMEWORK_SEARCH_PATHS = ( 458 | "$(SDKROOT)/Developer/Library/Frameworks", 459 | "$(inherited)", 460 | ); 461 | GCC_PREPROCESSOR_DEFINITIONS = ( 462 | "DEBUG=1", 463 | "$(inherited)", 464 | ); 465 | INFOPLIST_FILE = RangeSliderDemoTests/Info.plist; 466 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 467 | PRODUCT_NAME = "$(TARGET_NAME)"; 468 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RangeSliderDemo.app/RangeSliderDemo"; 469 | }; 470 | name = Debug; 471 | }; 472 | 64495A661ACAD93700482D73 /* Release */ = { 473 | isa = XCBuildConfiguration; 474 | buildSettings = { 475 | BUNDLE_LOADER = "$(TEST_HOST)"; 476 | FRAMEWORK_SEARCH_PATHS = ( 477 | "$(SDKROOT)/Developer/Library/Frameworks", 478 | "$(inherited)", 479 | ); 480 | INFOPLIST_FILE = RangeSliderDemoTests/Info.plist; 481 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 482 | PRODUCT_NAME = "$(TARGET_NAME)"; 483 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RangeSliderDemo.app/RangeSliderDemo"; 484 | }; 485 | name = Release; 486 | }; 487 | /* End XCBuildConfiguration section */ 488 | 489 | /* Begin XCConfigurationList section */ 490 | 64495A391ACAD93700482D73 /* Build configuration list for PBXProject "RangeSliderDemo" */ = { 491 | isa = XCConfigurationList; 492 | buildConfigurations = ( 493 | 64495A5F1ACAD93700482D73 /* Debug */, 494 | 64495A601ACAD93700482D73 /* Release */, 495 | ); 496 | defaultConfigurationIsVisible = 0; 497 | defaultConfigurationName = Release; 498 | }; 499 | 64495A611ACAD93700482D73 /* Build configuration list for PBXNativeTarget "RangeSliderDemo" */ = { 500 | isa = XCConfigurationList; 501 | buildConfigurations = ( 502 | 64495A621ACAD93700482D73 /* Debug */, 503 | 64495A631ACAD93700482D73 /* Release */, 504 | ); 505 | defaultConfigurationIsVisible = 0; 506 | defaultConfigurationName = Release; 507 | }; 508 | 64495A641ACAD93700482D73 /* Build configuration list for PBXNativeTarget "RangeSliderDemoTests" */ = { 509 | isa = XCConfigurationList; 510 | buildConfigurations = ( 511 | 64495A651ACAD93700482D73 /* Debug */, 512 | 64495A661ACAD93700482D73 /* Release */, 513 | ); 514 | defaultConfigurationIsVisible = 0; 515 | defaultConfigurationName = Release; 516 | }; 517 | /* End XCConfigurationList section */ 518 | }; 519 | rootObject = 64495A361ACAD93700482D73 /* Project object */; 520 | } 521 | -------------------------------------------------------------------------------- /Example/RangeSliderDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/RangeSliderDemo.xcodeproj/xcshareddata/xcschemes/RangeSliderDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 61 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 89 | 91 | 97 | 98 | 99 | 100 | 101 | 102 | 108 | 110 | 116 | 117 | 118 | 119 | 121 | 122 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /Example/RangeSliderDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/RangeSliderDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/RangeSliderDemo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // RangeSliderDemo 4 | // 5 | // Created by Tom Thorpe on 31/03/2015. 6 | // Copyright (c) 2015 tomthorpe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /Example/RangeSliderDemo/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // RangeSliderDemo 4 | // 5 | // Created by Tom Thorpe on 31/03/2015. 6 | // Copyright (c) 2015 tomthorpe. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | - (void)applicationWillResignActive:(UIApplication *)application { 24 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 25 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 26 | } 27 | 28 | - (void)applicationDidEnterBackground:(UIApplication *)application { 29 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 31 | } 32 | 33 | - (void)applicationWillEnterForeground:(UIApplication *)application { 34 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 35 | } 36 | 37 | - (void)applicationDidBecomeActive:(UIApplication *)application { 38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application { 42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /Example/RangeSliderDemo/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 25 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Example/RangeSliderDemo/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 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 44 | 50 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 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 | 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 | 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 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | -------------------------------------------------------------------------------- /Example/RangeSliderDemo/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /Example/RangeSliderDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.tomthorpe.$(PRODUCT_NAME:rfc1034identifier) 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 | UIInterfaceOrientationLandscapeRight 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /Example/RangeSliderDemo/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // RangeSliderDemo 4 | // 5 | // Created by Tom Thorpe on 31/03/2015. 6 | // Copyright (c) 2015 tomthorpe. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "TTRangeSlider.h" 11 | 12 | @interface ViewController : UIViewController 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /Example/RangeSliderDemo/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // RangeSliderDemo 4 | // 5 | // Created by Tom Thorpe on 31/03/2015. 6 | // Copyright (c) 2015 tomthorpe. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @interface ViewController () 12 | @property (weak, nonatomic) IBOutlet TTRangeSlider *rangeSlider; 13 | @property (weak, nonatomic) IBOutlet TTRangeSlider *rangeSliderCurrency; 14 | @property (weak, nonatomic) IBOutlet TTRangeSlider *rangeSliderCustom; 15 | @end 16 | 17 | @implementation ViewController 18 | 19 | - (void)logControlEvent:(TTRangeSlider *)sender { 20 | NSLog(@"Standard slider updated. Min Value: %.0f Max Value: %.0f", sender.selectedMinimum, sender.selectedMaximum); 21 | } 22 | 23 | - (void)viewDidLoad { 24 | [super viewDidLoad]; 25 | // Do any additional setup after loading the view, typically from a nib. 26 | 27 | //standard rsnge slider 28 | self.rangeSlider.minValue = 0; 29 | self.rangeSlider.maxValue = 200; 30 | self.rangeSlider.selectedMinimum = 50; 31 | self.rangeSlider.selectedMaximum = 150; 32 | 33 | self.rangeSlider.shadowRadius = 2; 34 | self.rangeSlider.shadowOpacity = 0.75; 35 | 36 | [self.rangeSlider addTarget:self action:@selector(logControlEvent:) forControlEvents:UIControlEventValueChanged]; 37 | 38 | //currency range slider 39 | self.rangeSliderCurrency.delegate = self; 40 | self.rangeSliderCurrency.minValue = 50; 41 | self.rangeSliderCurrency.maxValue = 150; 42 | self.rangeSliderCurrency.selectedMinimum = 50; 43 | self.rangeSliderCurrency.selectedMaximum = 150; 44 | self.rangeSliderCurrency.handleColor = [UIColor greenColor]; 45 | self.rangeSliderCurrency.handleDiameter = 30; 46 | self.rangeSliderCurrency.selectedHandleDiameterMultiplier = 1.3; 47 | NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 48 | formatter.numberStyle = NSNumberFormatterCurrencyStyle; 49 | self.rangeSliderCurrency.numberFormatterOverride = formatter; 50 | 51 | //custom number formatter range slider 52 | self.rangeSliderCustom.delegate = self; 53 | self.rangeSliderCustom.minValue = 0; 54 | self.rangeSliderCustom.maxValue = 100; 55 | self.rangeSliderCustom.selectedMinimum = 40; 56 | self.rangeSliderCustom.selectedMaximum = 60; 57 | self.rangeSliderCustom.handleImage = [UIImage imageNamed:@"custom-handle"]; 58 | self.rangeSliderCustom.selectedHandleDiameterMultiplier = 1; 59 | self.rangeSliderCustom.tintColorBetweenHandles = [UIColor redColor]; 60 | self.rangeSliderCustom.lineBorderWidth = 1; 61 | self.rangeSliderCustom.lineBorderColor = [UIColor darkGrayColor]; 62 | NSNumberFormatter *customFormatter = [[NSNumberFormatter alloc] init]; 63 | customFormatter.positiveSuffix = @"B"; 64 | self.rangeSliderCustom.numberFormatterOverride = customFormatter; 65 | 66 | self.rangeSliderCustom.shadowRadius = 3; 67 | self.rangeSliderCustom.shadowOpacity = 0.5; 68 | 69 | } 70 | 71 | - (void)didReceiveMemoryWarning { 72 | [super didReceiveMemoryWarning]; 73 | // Dispose of any resources that can be recreated. 74 | } 75 | 76 | #pragma mark TTRangeSliderViewDelegate 77 | -(void)rangeSlider:(TTRangeSlider *)sender didChangeSelectedMinimumValue:(float)selectedMinimum andMaximumValue:(float)selectedMaximum{ 78 | if (sender == self.rangeSliderCurrency) { 79 | NSLog(@"Currency slider updated. Min Value: %.0f Max Value: %.0f", selectedMinimum, selectedMaximum); 80 | } 81 | else if (sender == self.rangeSliderCustom){ 82 | NSLog(@"Custom slider updated. Min Value: %.0f Max Value: %.0f", selectedMinimum, selectedMaximum); 83 | } 84 | } 85 | 86 | @end 87 | -------------------------------------------------------------------------------- /Example/RangeSliderDemo/custom-handle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TomThorpe/TTRangeSlider/2860afbeea8d6467014e271e3dd17e26e70f240f/Example/RangeSliderDemo/custom-handle.png -------------------------------------------------------------------------------- /Example/RangeSliderDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // RangeSliderDemo 4 | // 5 | // Created by Tom Thorpe on 31/03/2015. 6 | // Copyright (c) 2015 tomthorpe. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Example/RangeSliderDemoTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.tomthorpe.$(PRODUCT_NAME:rfc1034identifier) 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/RangeSliderDemoTests/RangeSliderDemoTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // RangeSliderDemoTests.m 3 | // RangeSliderDemoTests 4 | // 5 | // Created by Tom Thorpe on 31/03/2015. 6 | // Copyright (c) 2015 tomthorpe. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface RangeSliderDemoTests : XCTestCase 13 | 14 | @end 15 | 16 | @implementation RangeSliderDemoTests 17 | 18 | - (void)setUp { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown { 24 | // Put teardown code here. This method is called after the invocation of each test method in the class. 25 | [super tearDown]; 26 | } 27 | 28 | - (void)testExample { 29 | // This is an example of a functional test case. 30 | XCTAssert(YES, @"Pass"); 31 | } 32 | 33 | - (void)testPerformanceExample { 34 | // This is an example of a performance test case. 35 | [self measureBlock:^{ 36 | // Put the code you want to measure the time of here. 37 | }]; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /Example/TTRangeSlider.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TomThorpe/TTRangeSlider/2860afbeea8d6467014e271e3dd17e26e70f240f/Example/TTRangeSlider.gif -------------------------------------------------------------------------------- /Example/interfacebuilder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TomThorpe/TTRangeSlider/2860afbeea8d6467014e271e3dd17e26e70f240f/Example/interfacebuilder.png -------------------------------------------------------------------------------- /Example/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TomThorpe/TTRangeSlider/2860afbeea8d6467014e271e3dd17e26e70f240f/Example/screenshot.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 Tom Thorpe 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.3 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "TTRangeSlider", 8 | platforms: [ 9 | .iOS(.v9), 10 | ], 11 | products: [ 12 | // Products define the executables and libraries a package produces, and make them visible to other packages. 13 | .library( 14 | name: "TTRangeSlider", 15 | targets: ["TTRangeSlider"]), 16 | ], 17 | dependencies: [ 18 | // Dependencies declare other packages that this package depends on. 19 | // .package(url: /* package url */, from: "1.0.0"), 20 | ], 21 | targets: [ 22 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 23 | // Targets can depend on other targets in this package, and on products in packages this package depends on. 24 | .target( 25 | name: "TTRangeSlider", 26 | dependencies: [], 27 | path: "Pod/Classes", 28 | publicHeadersPath: "."), 29 | ] 30 | ) 31 | -------------------------------------------------------------------------------- /Pod/Classes/TTRangeSlider.h: -------------------------------------------------------------------------------- 1 | // 2 | // TTRangeSliderView.h 3 | // 4 | // Created by Tom Thorpe 5 | // 6 | 7 | #import 8 | #import "TTRangeSliderDelegate.h" 9 | 10 | IB_DESIGNABLE 11 | @interface TTRangeSlider : UIControl 12 | 13 | /** 14 | * Optional delegate. 15 | */ 16 | @property (nonatomic, weak) IBOutlet id delegate; 17 | 18 | /** 19 | * The minimum possible value to select in the range 20 | */ 21 | @property (nonatomic, assign) IBInspectable float minValue; 22 | 23 | /** 24 | * The maximum possible value to select in the range 25 | */ 26 | @property (nonatomic, assign) IBInspectable float maxValue; 27 | 28 | /** 29 | * The preselected minumum value 30 | * (note: This should be less than the selectedMaximum) 31 | */ 32 | @property (nonatomic, assign) IBInspectable float selectedMinimum; 33 | 34 | /** 35 | * The preselected maximum value 36 | * (note: This should be greater than the selectedMinimum) 37 | */ 38 | @property (nonatomic, assign) IBInspectable float selectedMaximum; 39 | 40 | /** 41 | * Each handle in the slider has a label above it showing the current selected value. By default, this is displayed as a decimal format. 42 | * You can override this default here by supplying your own NSNumberFormatter. For example, you could supply an NSNumberFormatter that has a currency style, or a prefix or suffix. 43 | * If this property is nil, the default decimal format will be used. Note: If you want no labels at all, please use the hideLabels flag. */ 44 | @property (nonatomic, strong) NSNumberFormatter *numberFormatterOverride; 45 | 46 | /** 47 | * Hides the labels above the slider controls. YES = labels will be hidden. NO = labels will be shown. Default is NO. 48 | */ 49 | @property (nonatomic, assign) IBInspectable BOOL hideLabels; 50 | 51 | /** 52 | * The color of the minimum value text label. If not set, the default is the tintColor. 53 | */ 54 | @property (nonatomic, strong) IBInspectable UIColor *minLabelColour; 55 | 56 | /** 57 | * The color of the maximum value text label. If not set, the default is the tintColor. 58 | */ 59 | @property (nonatomic, strong) IBInspectable UIColor *maxLabelColour; 60 | 61 | /** 62 | * The color of both handles. If not set, the default is the tintColor. 63 | */ 64 | @property (nonatomic, strong) IBInspectable UIColor *handleColor; 65 | 66 | /** 67 | * The color of the left handle. If not set, the default is the tintColor. 68 | */ 69 | @property (nonatomic, strong) IBInspectable UIColor *minHandleColor; 70 | 71 | /** 72 | * The color of the right handle. If not set, the default is the tintColor. 73 | */ 74 | @property (nonatomic, strong) IBInspectable UIColor *maxHandleColor; 75 | 76 | /** 77 | * The font of the minimum value text label. If not set, the default is system font size 12. 78 | */ 79 | @property (nonatomic, strong) IBInspectable UIFont *minLabelFont; 80 | 81 | /** 82 | * The font of the maximum value text label. If not set, the default is system font size 12. 83 | */ 84 | @property (nonatomic, strong) IBInspectable UIFont *maxLabelFont; 85 | 86 | /** 87 | * The label displayed in accessibility mode for minimum value handler 88 | */ 89 | @property (nonatomic, strong) IBInspectable NSString *minLabelAccessibilityLabel; 90 | 91 | /** 92 | * The label displayed in accessibility mode for maximum value handler 93 | */ 94 | @property (nonatomic, strong) IBInspectable NSString *maxLabelAccessibilityLabel; 95 | 96 | /** 97 | * The brief description displayed in accessibility mode for minimum value handler 98 | */ 99 | @property (nonatomic, strong) IBInspectable NSString *minLabelAccessibilityHint; 100 | 101 | /** 102 | * The brief description displayed in accessibility mode for maximum value handler 103 | */ 104 | @property (nonatomic, strong) IBInspectable NSString *maxLabelAccessibilityHint; 105 | 106 | /** 107 | * If true, the control will mimic a normal slider and have only one handle rather than a range. 108 | * In this case, the selectedMinValue will be not functional anymore. Use selectedMaxValue instead to determine the value the user has selected. 109 | */ 110 | @property (nonatomic, assign) IBInspectable BOOL disableRange; 111 | 112 | @property (nonatomic, assign) IBInspectable float minDistance; 113 | 114 | @property (nonatomic, assign) IBInspectable float maxDistance; 115 | 116 | /** 117 | * If true the control will snap to point at each step between minValue and maxValue 118 | */ 119 | @property (nonatomic, assign) IBInspectable BOOL enableStep; 120 | 121 | /** 122 | * The step value, this control the value of each step. If not set the default is 0.1. 123 | * (note: this is ignored if <= 0.0) 124 | */ 125 | @property (nonatomic, assign) IBInspectable float step; 126 | 127 | /** 128 | *Set padding between label and handle (default 8.0) 129 | */ 130 | @property (nonatomic, assign) IBInspectable CGFloat labelPadding; 131 | 132 | /** 133 | *Set padding on left and right side of slider line (default 16.0) 134 | */ 135 | @property (nonatomic, assign) IBInspectable CGFloat barSidePadding; 136 | 137 | /** 138 | *Handle slider with custom image, you can set custom image for your handle 139 | */ 140 | @property (nonatomic, strong) UIImage *handleImage; 141 | 142 | 143 | /** 144 | *Handle slider with custom border color, you can set custom border color for your handle 145 | */ 146 | @property (nonatomic, strong) UIColor *handleBorderColor; 147 | 148 | /** 149 | *Handle border width (default 0.0) 150 | */ 151 | @property (nonatomic, assign) CGFloat handleBorderWidth; 152 | 153 | /** 154 | *Handle diameter (default 16.0) 155 | */ 156 | @property (nonatomic, assign) CGFloat handleDiameter; 157 | 158 | /** 159 | *Selected handle diameter multiplier (default 1.7) 160 | */ 161 | @property (nonatomic, assign) CGFloat selectedHandleDiameterMultiplier; 162 | 163 | /** 164 | *Set slider line tint color between handles 165 | */ 166 | @property (nonatomic, strong) IBInspectable UIColor *tintColorBetweenHandles; 167 | 168 | /** 169 | *Set the slider line height (default 1.0) 170 | */ 171 | @property (nonatomic, assign) IBInspectable CGFloat lineHeight; 172 | 173 | /** 174 | *Slider line border color 175 | */ 176 | @property (nonatomic, strong) IBInspectable UIColor *lineBorderColor; 177 | 178 | /** 179 | *Slider line border width (default 0.0) 180 | */ 181 | @property (nonatomic, assign) IBInspectable CGFloat lineBorderWidth; 182 | 183 | /** 184 | *Define the two possibilities of label positions (above or below the handles) 185 | */ 186 | typedef NS_ENUM(NSInteger, LabelPosition) { 187 | LabelPositionAbove, 188 | LabelPositionBelow, 189 | }; 190 | 191 | /** 192 | *Set the label positions (default LabelPositionAbove) 193 | */ 194 | @property (nonatomic, assign) LabelPosition labelPosition; 195 | 196 | /** 197 | *Set radius of the shadow for handle. Also used for setting shadow offset value 198 | */ 199 | 200 | @property (nonatomic, assign) IBInspectable CGFloat shadowRadius; 201 | 202 | /** 203 | *Set the opacity of the shadow for handle 204 | */ 205 | @property (nonatomic, assign) IBInspectable float shadowOpacity; 206 | 207 | /** 208 | *Define the two possibilities of HandleType (round or rectangle) 209 | */ 210 | typedef NS_ENUM(NSInteger, HandleType) { 211 | HandleTypeRound, 212 | HandleTypeRectangle, 213 | }; 214 | 215 | /** 216 | *Set the HandleType (default HandleType) 217 | */ 218 | @property (nonatomic, assign) HandleType handleType; 219 | 220 | /** 221 | *Set the Handle Size (default (16.0, 16.0)) 222 | */ 223 | @property (nonatomic, assign) CGSize handleSize; 224 | 225 | @end 226 | -------------------------------------------------------------------------------- /Pod/Classes/TTRangeSlider.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTRangeSlider.m 3 | // 4 | // Created by Tom Thorpe 5 | 6 | #import "TTRangeSlider.h" 7 | 8 | const int HANDLE_TOUCH_AREA_EXPANSION = -30; //expand the touch area of the handle by this much (negative values increase size) so that you don't have to touch right on the handle to activate it. 9 | const float TEXT_HEIGHT = 14; 10 | 11 | @interface TTRangeSlider () 12 | 13 | @property (nonatomic, strong) CALayer *sliderLine; 14 | @property (nonatomic, strong) CALayer *sliderLineBetweenHandles; 15 | 16 | @property (nonatomic, strong) CALayer *leftHandle; 17 | @property (nonatomic, assign) BOOL leftHandleSelected; 18 | @property (nonatomic, strong) CALayer *rightHandle; 19 | @property (nonatomic, assign) BOOL rightHandleSelected; 20 | 21 | @property (nonatomic, strong) CATextLayer *minLabel; 22 | @property (nonatomic, strong) CATextLayer *maxLabel; 23 | 24 | @property (nonatomic, assign) CGSize minLabelTextSize; 25 | @property (nonatomic, assign) CGSize maxLabelTextSize; 26 | 27 | @property (nonatomic, strong) NSNumberFormatter *decimalNumberFormatter; // Used to format values if formatType is YLRangeSliderFormatTypeDecimal 28 | 29 | // strong reference needed for UIAccessibilityContainer 30 | // see http://stackoverflow.com/questions/13462046/custom-uiview-not-showing-accessibility-on-voice-over 31 | @property (nonatomic, strong) NSMutableArray *accessibleElements; 32 | @end 33 | 34 | /** 35 | An accessibility element that increments and decrements the left slider 36 | */ 37 | @interface TTRangeSliderLeftElement : UIAccessibilityElement 38 | @end 39 | 40 | /** 41 | An accessibility element that increments and decrements the right slider 42 | */ 43 | @interface TTRangeSliderRightElement : UIAccessibilityElement 44 | @end 45 | 46 | static const CGFloat kLabelsFontSize = 12.0f; 47 | 48 | @implementation TTRangeSlider 49 | 50 | //do all the setup in a common place, as there can be two initialisers called depending on if storyboards or code are used. The designated initialiser isn't always called :| 51 | - (void)initialiseControl { 52 | //defaults: 53 | _minValue = 0; 54 | _selectedMinimum = 10; 55 | _maxValue = 100; 56 | _selectedMaximum = 90; 57 | 58 | _minDistance = -1; 59 | _maxDistance = -1; 60 | 61 | _enableStep = NO; 62 | _step = 0.1f; 63 | 64 | _hideLabels = NO; 65 | 66 | _handleDiameter = 16.0; 67 | _selectedHandleDiameterMultiplier = 1.7; 68 | 69 | _lineHeight = 1.0; 70 | 71 | _handleBorderWidth = 0.0; 72 | _handleBorderColor = self.tintColor; 73 | 74 | 75 | _labelPadding = 8.0; 76 | _barSidePadding = 16.0; 77 | 78 | _labelPosition = LabelPositionAbove; 79 | 80 | _handleType = HandleTypeRound; 81 | _handleSize = CGSizeMake(_handleDiameter, _handleDiameter); 82 | 83 | //draw the slider line 84 | self.sliderLine = [CALayer layer]; 85 | self.sliderLine.backgroundColor = self.tintColor.CGColor; 86 | self.sliderLine.borderColor = self.lineBorderColor.CGColor; 87 | self.sliderLine.borderWidth = self.lineBorderWidth; 88 | [self.layer addSublayer:self.sliderLine]; 89 | 90 | //draw the track distline 91 | self.sliderLineBetweenHandles = [CALayer layer]; 92 | self.sliderLineBetweenHandles.backgroundColor = self.tintColor.CGColor; 93 | [self.layer addSublayer:self.sliderLineBetweenHandles]; 94 | 95 | //draw the minimum slider handle 96 | self.leftHandle = [CALayer layer]; 97 | self.leftHandle.cornerRadius = self.handleDiameter / 2; 98 | self.leftHandle.backgroundColor = self.tintColor.CGColor; 99 | self.leftHandle.borderWidth = self.handleBorderWidth; 100 | self.leftHandle.borderColor = self.handleBorderColor.CGColor; 101 | [self.layer addSublayer:self.leftHandle]; 102 | 103 | //draw the maximum slider handle 104 | self.rightHandle = [CALayer layer]; 105 | self.rightHandle.cornerRadius = self.handleDiameter / 2; 106 | self.rightHandle.backgroundColor = self.tintColor.CGColor; 107 | self.rightHandle.borderWidth = self.handleBorderWidth; 108 | self.rightHandle.borderColor = self.handleBorderColor.CGColor; 109 | [self.layer addSublayer:self.rightHandle]; 110 | 111 | self.leftHandle.frame = CGRectMake(0, 0, self.handleDiameter, self.handleDiameter); 112 | self.rightHandle.frame = CGRectMake(0, 0, self.handleDiameter, self.handleDiameter); 113 | 114 | //draw the text labels 115 | self.minLabel = [[CATextLayer alloc] init]; 116 | self.minLabel.alignmentMode = kCAAlignmentCenter; 117 | self.minLabel.fontSize = kLabelsFontSize; 118 | self.minLabel.frame = CGRectMake(0, 0, 75, TEXT_HEIGHT); 119 | self.minLabel.contentsScale = [UIScreen mainScreen].scale; 120 | self.minLabel.contentsScale = [UIScreen mainScreen].scale; 121 | if (self.minLabelColour == nil){ 122 | self.minLabel.foregroundColor = self.tintColor.CGColor; 123 | } else { 124 | self.minLabel.foregroundColor = self.minLabelColour.CGColor; 125 | } 126 | self.minLabelFont = [UIFont systemFontOfSize:kLabelsFontSize]; 127 | [self.layer addSublayer:self.minLabel]; 128 | 129 | self.maxLabel = [[CATextLayer alloc] init]; 130 | self.maxLabel.alignmentMode = kCAAlignmentCenter; 131 | self.maxLabel.fontSize = kLabelsFontSize; 132 | self.maxLabel.frame = CGRectMake(0, 0, 75, TEXT_HEIGHT); 133 | self.maxLabel.contentsScale = [UIScreen mainScreen].scale; 134 | if (self.maxLabelColour == nil){ 135 | self.maxLabel.foregroundColor = self.tintColor.CGColor; 136 | } else { 137 | self.maxLabel.foregroundColor = self.maxLabelColour.CGColor; 138 | } 139 | self.maxLabelFont = [UIFont systemFontOfSize:kLabelsFontSize]; 140 | [self.layer addSublayer:self.maxLabel]; 141 | 142 | // TODO Create a bundle that allows localization of default accessibility labels and hints 143 | if (!self.minLabelAccessibilityLabel || self.minLabelAccessibilityLabel.length == 0) { 144 | self.minLabelAccessibilityLabel = @"Left Handle"; 145 | } 146 | 147 | if (!self.minLabelAccessibilityHint || self.minLabelAccessibilityHint.length == 0) { 148 | self.minLabelAccessibilityHint = @"Minimum value in slider"; 149 | } 150 | 151 | if (!self.maxLabelAccessibilityLabel || self.maxLabelAccessibilityLabel.length == 0) { 152 | self.maxLabelAccessibilityLabel = @"Right Handle"; 153 | } 154 | 155 | if (!self.maxLabelAccessibilityHint || self.maxLabelAccessibilityHint.length == 0) { 156 | self.maxLabelAccessibilityHint = @"Maximum value in slider"; 157 | } 158 | 159 | [self refresh]; 160 | } 161 | 162 | - (void)layoutSubviews { 163 | [super layoutSubviews]; 164 | 165 | //positioning for the slider line 166 | float barSidePadding = self.barSidePadding; 167 | CGRect currentFrame = self.frame; 168 | float yMiddle = currentFrame.size.height/2.0; 169 | CGPoint lineLeftSide = CGPointMake(barSidePadding, yMiddle); 170 | CGPoint lineRightSide = CGPointMake(currentFrame.size.width-barSidePadding, yMiddle); 171 | self.sliderLine.frame = CGRectMake(lineLeftSide.x, lineLeftSide.y, lineRightSide.x-lineLeftSide.x, self.lineHeight); 172 | 173 | self.sliderLine.cornerRadius = self.lineHeight / 2.0; 174 | self.sliderLineBetweenHandles.cornerRadius = self.lineHeight / 2.0; 175 | 176 | [self updateLabelValues]; 177 | [self updateHandlePositions]; 178 | [self updateLabelPositions]; 179 | } 180 | 181 | - (id)initWithCoder:(NSCoder *)aCoder 182 | { 183 | self = [super initWithCoder:aCoder]; 184 | 185 | if(self) 186 | { 187 | [self initialiseControl]; 188 | } 189 | return self; 190 | } 191 | 192 | - (id)initWithFrame:(CGRect)aRect 193 | { 194 | self = [super initWithFrame:aRect]; 195 | 196 | if (self) 197 | { 198 | [self initialiseControl]; 199 | } 200 | 201 | return self; 202 | } 203 | 204 | - (CGSize)intrinsicContentSize{ 205 | return CGSizeMake(UIViewNoIntrinsicMetric, 65); 206 | } 207 | 208 | -(void)prepareForInterfaceBuilder{ 209 | if (self.tintColorBetweenHandles == nil){ 210 | self.sliderLineBetweenHandles.backgroundColor = self.tintColor.CGColor; 211 | } 212 | } 213 | 214 | 215 | - (void)tintColorDidChange { 216 | CGColorRef color = self.tintColor.CGColor; 217 | 218 | [CATransaction begin]; 219 | [CATransaction setAnimationDuration:0.5]; 220 | [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut] ]; 221 | self.sliderLine.backgroundColor = color; 222 | if (_minHandleColor == nil) { 223 | self.leftHandle.backgroundColor = color; 224 | } 225 | if (_maxHandleColor == nil) { 226 | self.rightHandle.backgroundColor = color; 227 | } 228 | 229 | if (self.minLabelColour == nil){ 230 | self.minLabel.foregroundColor = color; 231 | } 232 | if (self.maxLabelColour == nil){ 233 | self.maxLabel.foregroundColor = color; 234 | } 235 | [CATransaction commit]; 236 | } 237 | 238 | - (float)getPercentageAlongLineForValue:(float) value { 239 | if (self.minValue == self.maxValue){ 240 | return 0; //stops divide by zero errors where maxMinDif would be zero. If the min and max are the same the percentage has no point. 241 | } 242 | 243 | //get the difference between the maximum and minimum values (e.g if max was 100, and min was 50, difference is 50) 244 | float maxMinDif = self.maxValue - self.minValue; 245 | 246 | //now subtract value from the minValue (e.g if value is 75, then 75-50 = 25) 247 | float valueSubtracted = value - self.minValue; 248 | 249 | //now divide valueSubtracted by maxMinDif to get the percentage (e.g 25/50 = 0.5) 250 | return valueSubtracted / maxMinDif; 251 | } 252 | 253 | - (float)getXPositionAlongLineForValue:(float) value { 254 | //first get the percentage along the line for the value 255 | float percentage = [self getPercentageAlongLineForValue:value]; 256 | 257 | //get the difference between the maximum and minimum coordinate position x values (e.g if max was x = 310, and min was x=10, difference is 300) 258 | float maxMinDif = CGRectGetMaxX(self.sliderLine.frame) - CGRectGetMinX(self.sliderLine.frame); 259 | 260 | //now multiply the percentage by the minMaxDif to see how far along the line the point should be, and add it onto the minimum x position. 261 | float offset = percentage * maxMinDif; 262 | 263 | return CGRectGetMinX(self.sliderLine.frame) + offset; 264 | } 265 | 266 | - (void)updateLabelValues { 267 | if (self.hideLabels || [self.numberFormatterOverride isEqual:[NSNull null]]){ 268 | self.minLabel.string = @""; 269 | self.maxLabel.string = @""; 270 | return; 271 | } 272 | 273 | NSNumberFormatter *formatter = (self.numberFormatterOverride != nil) ? self.numberFormatterOverride : self.decimalNumberFormatter; 274 | 275 | self.minLabel.string = [formatter stringFromNumber:@(self.selectedMinimum)]; 276 | self.maxLabel.string = [formatter stringFromNumber:@(self.selectedMaximum)]; 277 | 278 | self.minLabelTextSize = [self.minLabel.string sizeWithAttributes:@{NSFontAttributeName:self.minLabelFont}]; 279 | self.maxLabelTextSize = [self.maxLabel.string sizeWithAttributes:@{NSFontAttributeName:self.maxLabelFont}]; 280 | } 281 | 282 | - (void)updateAccessibilityElements { 283 | [_accessibleElements removeAllObjects]; 284 | [_accessibleElements addObject:[self leftHandleAccessibilityElement]]; 285 | [_accessibleElements addObject:[self rightHandleAccessbilityElement]]; 286 | } 287 | 288 | #pragma mark - Set Positions 289 | - (void)updateHandlePositions { 290 | CGPoint leftHandleCenter = CGPointMake([self getXPositionAlongLineForValue:self.selectedMinimum], CGRectGetMidY(self.sliderLine.frame)); 291 | self.leftHandle.position = leftHandleCenter; 292 | 293 | CGPoint rightHandleCenter = CGPointMake([self getXPositionAlongLineForValue:self.selectedMaximum], CGRectGetMidY(self.sliderLine.frame)); 294 | self.rightHandle.position= rightHandleCenter; 295 | 296 | //positioning for the dist slider line 297 | self.sliderLineBetweenHandles.frame = CGRectMake(self.leftHandle.position.x, self.sliderLine.frame.origin.y, self.rightHandle.position.x-self.leftHandle.position.x, self.lineHeight); 298 | } 299 | 300 | - (void)updateLabelPositions { 301 | //the centre points for the labels are X = the same x position as the relevant handle. Y = the y center of the handle plus or minus (depending on the label position) the handle size / 2 + padding + label size/2 302 | float padding = self.labelPadding; 303 | float minSpacingBetweenLabels = 8.0f; 304 | 305 | CGPoint leftHandleCentre = [self getCentreOfRect:self.leftHandle.frame]; 306 | CGPoint newMinLabelCenter = CGPointMake(leftHandleCentre.x, (self.leftHandle.frame.origin.y + (self.leftHandle.frame.size.height/2)) + ((self.labelPosition == LabelPositionAbove ? -1 : 1) * ((self.minLabel.frame.size.height/2) + padding + (self.leftHandle.frame.size.height/2)))); 307 | 308 | CGPoint rightHandleCentre = [self getCentreOfRect:self.rightHandle.frame]; 309 | CGPoint newMaxLabelCenter = CGPointMake(rightHandleCentre.x, (self.rightHandle.frame.origin.y + (self.rightHandle.frame.size.height/2)) + ((self.labelPosition == LabelPositionAbove ? -1 : 1) * ((self.maxLabel.frame.size.height/2) + padding + (self.rightHandle.frame.size.height/2)))); 310 | 311 | CGSize minLabelTextSize = self.minLabelTextSize; 312 | CGSize maxLabelTextSize = self.maxLabelTextSize; 313 | 314 | 315 | self.minLabel.frame = CGRectMake(0, 0, minLabelTextSize.width, minLabelTextSize.height); 316 | self.maxLabel.frame = CGRectMake(0, 0, maxLabelTextSize.width, maxLabelTextSize.height); 317 | 318 | float newLeftMostXInMaxLabel = newMaxLabelCenter.x - maxLabelTextSize.width/2; 319 | float newRightMostXInMinLabel = newMinLabelCenter.x + minLabelTextSize.width/2; 320 | float newSpacingBetweenTextLabels = newLeftMostXInMaxLabel - newRightMostXInMinLabel; 321 | 322 | if (self.disableRange == YES || newSpacingBetweenTextLabels > minSpacingBetweenLabels) { 323 | self.minLabel.position = newMinLabelCenter; 324 | self.maxLabel.position = newMaxLabelCenter; 325 | } 326 | else { 327 | float increaseAmount = minSpacingBetweenLabels - newSpacingBetweenTextLabels; 328 | newMinLabelCenter = CGPointMake(newMinLabelCenter.x - increaseAmount/2, newMinLabelCenter.y); 329 | newMaxLabelCenter = CGPointMake(newMaxLabelCenter.x + increaseAmount/2, newMaxLabelCenter.y); 330 | self.minLabel.position = newMinLabelCenter; 331 | self.maxLabel.position = newMaxLabelCenter; 332 | 333 | //Update x if they are still in the original position 334 | if (self.minLabel.position.x == self.maxLabel.position.x && self.leftHandle != nil) { 335 | self.minLabel.position = CGPointMake(leftHandleCentre.x, self.minLabel.position.y); 336 | self.maxLabel.position = CGPointMake(leftHandleCentre.x + self.minLabel.frame.size.width/2 + minSpacingBetweenLabels + self.maxLabel.frame.size.width/2, self.maxLabel.position.y); 337 | } 338 | } 339 | } 340 | 341 | - (void)updateHandleTypeAndSize { 342 | self.leftHandle.cornerRadius = self.handleType == HandleTypeRound ? self.handleDiameter / 2 : 0; 343 | self.rightHandle.cornerRadius = self.handleType == HandleTypeRound ? self.handleDiameter / 2 : 0; 344 | 345 | CGRect handleRect = self.handleType == HandleTypeRound ? CGRectMake(0, 0, self.handleDiameter, self.handleDiameter) : CGRectMake(0, 0, self.handleSize.width, self.handleSize.height); 346 | self.leftHandle.frame = handleRect; 347 | self.rightHandle.frame = handleRect; 348 | } 349 | 350 | #pragma mark - Touch Tracking 351 | - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 352 | //kill any gestures when we're tracking a touch that started on one of the handles. This ensures the correct behaviour when 353 | //the superview is something like a scrollview that can accepts touches in the same area as the slider thats placed on that view. 354 | return !self.isTracking; 355 | } 356 | 357 | - (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { 358 | CGPoint gesturePressLocation = [touch locationInView:self]; 359 | 360 | if (CGRectContainsPoint(CGRectInset(self.leftHandle.frame, HANDLE_TOUCH_AREA_EXPANSION, HANDLE_TOUCH_AREA_EXPANSION), gesturePressLocation) || CGRectContainsPoint(CGRectInset(self.rightHandle.frame, HANDLE_TOUCH_AREA_EXPANSION, HANDLE_TOUCH_AREA_EXPANSION), gesturePressLocation)) 361 | { 362 | //the touch was inside one of the handles so we're definitely going to start movign one of them. But the handles might be quite close to each other, so now we need to find out which handle the touch was closest too, and activate that one. 363 | float distanceFromLeftHandle = [self distanceBetweenPoint:gesturePressLocation andPoint:[self getCentreOfRect:self.leftHandle.frame]]; 364 | float distanceFromRightHandle =[self distanceBetweenPoint:gesturePressLocation andPoint:[self getCentreOfRect:self.rightHandle.frame]]; 365 | 366 | if (distanceFromLeftHandle < distanceFromRightHandle && self.disableRange == NO){ 367 | self.leftHandleSelected = YES; 368 | [self animateHandle:self.leftHandle withSelection:YES]; 369 | } else { 370 | if (self.selectedMaximum == self.maxValue && [self getCentreOfRect:self.leftHandle.frame].x == [self getCentreOfRect:self.rightHandle.frame].x) { 371 | self.leftHandleSelected = YES; 372 | [self animateHandle:self.leftHandle withSelection:YES]; 373 | } 374 | else { 375 | self.rightHandleSelected = YES; 376 | [self animateHandle:self.rightHandle withSelection:YES]; 377 | } 378 | } 379 | 380 | if ([self.delegate respondsToSelector:@selector(didStartTouchesInRangeSlider:)]){ 381 | [self.delegate didStartTouchesInRangeSlider:self]; 382 | } 383 | 384 | return YES; 385 | } else { 386 | return NO; 387 | } 388 | } 389 | 390 | - (void)refresh { 391 | 392 | if (self.enableStep && self.step>0.0f){ 393 | _selectedMinimum = roundf(self.selectedMinimum/self.step)*self.step; 394 | _selectedMaximum = roundf(self.selectedMaximum/self.step)*self.step; 395 | } 396 | 397 | float diff = self.selectedMaximum - self.selectedMinimum; 398 | 399 | if (self.minDistance != -1 && diff < self.minDistance) { 400 | if(self.leftHandleSelected){ 401 | _selectedMinimum = self.selectedMaximum - self.minDistance; 402 | }else{ 403 | _selectedMaximum = self.selectedMinimum + self.minDistance; 404 | } 405 | }else if(self.maxDistance != -1 && diff > self.maxDistance){ 406 | 407 | if(self.leftHandleSelected){ 408 | _selectedMinimum = self.selectedMaximum - self.maxDistance; 409 | }else if(self.rightHandleSelected){ 410 | _selectedMaximum = self.selectedMinimum + self.maxDistance; 411 | } 412 | } 413 | 414 | //ensure the minimum and maximum selected values are within range. Access the values directly so we don't cause this refresh method to be called again (otherwise changing the properties causes a refresh) 415 | if (self.selectedMinimum < self.minValue){ 416 | _selectedMinimum = self.minValue; 417 | } 418 | if (self.selectedMaximum > self.maxValue){ 419 | _selectedMaximum = self.maxValue; 420 | } 421 | 422 | //update the frames in a transaction so that the tracking doesn't continue until the frame has moved. 423 | [CATransaction begin]; 424 | [CATransaction setDisableActions:YES] ; 425 | [self updateHandlePositions]; 426 | [self updateLabelPositions]; 427 | [CATransaction commit]; 428 | [self updateLabelValues]; 429 | [self updateAccessibilityElements]; 430 | 431 | //update the delegate 432 | if ([self.delegate respondsToSelector:@selector(rangeSlider:didChangeSelectedMinimumValue:andMaximumValue:)] && 433 | (self.leftHandleSelected || self.rightHandleSelected)){ 434 | 435 | [self.delegate rangeSlider:self didChangeSelectedMinimumValue:self.selectedMinimum andMaximumValue:self.selectedMaximum]; 436 | } 437 | 438 | [self sendActionsForControlEvents:UIControlEventValueChanged]; 439 | } 440 | 441 | - (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { 442 | 443 | CGPoint location = [touch locationInView:self]; 444 | 445 | //find out the percentage along the line we are in x coordinate terms (subtracting half the frames width to account for moving the middle of the handle, not the left hand side) 446 | float percentage = ((location.x-CGRectGetMinX(self.sliderLine.frame)) - self.handleDiameter/2) / (CGRectGetMaxX(self.sliderLine.frame) - CGRectGetMinX(self.sliderLine.frame)); 447 | 448 | //multiply that percentage by self.maxValue to get the new selected minimum value 449 | float selectedValue = percentage * (self.maxValue - self.minValue) + self.minValue; 450 | 451 | if (self.leftHandleSelected) 452 | { 453 | if (selectedValue < self.selectedMaximum){ 454 | self.selectedMinimum = selectedValue; 455 | } 456 | else { 457 | self.selectedMinimum = self.selectedMaximum; 458 | } 459 | 460 | } 461 | else if (self.rightHandleSelected) 462 | { 463 | if (selectedValue > self.selectedMinimum || (self.disableRange && selectedValue >= self.minValue)){ //don't let the dots cross over, (unless range is disabled, in which case just dont let the dot fall off the end of the screen) 464 | self.selectedMaximum = selectedValue; 465 | } 466 | else { 467 | self.selectedMaximum = self.selectedMinimum; 468 | } 469 | } 470 | 471 | //no need to refresh the view because it is done as a sideeffect of setting the property 472 | 473 | return YES; 474 | } 475 | 476 | - (void)cancelTrackingWithEvent:(UIEvent *)event { 477 | [super cancelTrackingWithEvent:event]; 478 | [self cleanupTouch]; 479 | } 480 | 481 | - (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { 482 | [super endTrackingWithTouch:touch withEvent:event]; 483 | [self cleanupTouch]; 484 | } 485 | 486 | - (void)cleanupTouch { 487 | if (self.leftHandleSelected){ 488 | self.leftHandleSelected = NO; 489 | [self animateHandle:self.leftHandle withSelection:NO]; 490 | } else { 491 | self.rightHandleSelected = NO; 492 | [self animateHandle:self.rightHandle withSelection:NO]; 493 | } 494 | if ([self.delegate respondsToSelector:@selector(didEndTouchesInRangeSlider:)]) { 495 | [self.delegate didEndTouchesInRangeSlider:self]; 496 | } 497 | } 498 | 499 | #pragma mark - Animation 500 | - (void)animateHandle:(CALayer*)handle withSelection:(BOOL)selected { 501 | if (selected){ 502 | [CATransaction begin]; 503 | [CATransaction setAnimationDuration:0.3]; 504 | [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut] ]; 505 | handle.transform = CATransform3DMakeScale(self.selectedHandleDiameterMultiplier, self.selectedHandleDiameterMultiplier, 1); 506 | 507 | //the label above the handle will need to move too if the handle changes size 508 | [self updateLabelPositions]; 509 | 510 | [CATransaction setCompletionBlock:^{ 511 | }]; 512 | [CATransaction commit]; 513 | 514 | } else { 515 | [CATransaction begin]; 516 | [CATransaction setAnimationDuration:0.3]; 517 | [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut] ]; 518 | handle.transform = CATransform3DIdentity; 519 | 520 | //the label above the handle will need to move too if the handle changes size 521 | [self updateLabelPositions]; 522 | 523 | [CATransaction commit]; 524 | } 525 | } 526 | 527 | #pragma mark - Calculating nearest handle to point 528 | - (float)distanceBetweenPoint:(CGPoint)point1 andPoint:(CGPoint)point2 529 | { 530 | CGFloat xDist = (point2.x - point1.x); 531 | CGFloat yDist = (point2.y - point1.y); 532 | return sqrt((xDist * xDist) + (yDist * yDist)); 533 | } 534 | 535 | - (CGPoint)getCentreOfRect:(CGRect)rect 536 | { 537 | return CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect)); 538 | } 539 | 540 | 541 | #pragma mark - Properties 542 | -(void)setTintColor:(UIColor *)tintColor{ 543 | [super setTintColor:tintColor]; 544 | 545 | struct CGColor *color = self.tintColor.CGColor; 546 | 547 | [CATransaction begin]; 548 | [CATransaction setAnimationDuration:0.5]; 549 | [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut] ]; 550 | self.sliderLine.backgroundColor = color; 551 | 552 | if (self.minLabelColour == nil){ 553 | self.minLabel.foregroundColor = color; 554 | } 555 | if (self.maxLabelColour == nil){ 556 | self.maxLabel.foregroundColor = color; 557 | } 558 | [CATransaction commit]; 559 | } 560 | 561 | - (void)setDisableRange:(BOOL)disableRange { 562 | _disableRange = disableRange; 563 | if (_disableRange){ 564 | self.leftHandle.hidden = YES; 565 | self.minLabel.hidden = YES; 566 | } else { 567 | self.leftHandle.hidden = NO; 568 | self.minLabel.hidden = NO; 569 | } 570 | } 571 | 572 | - (NSNumberFormatter *)decimalNumberFormatter { 573 | if (!_decimalNumberFormatter){ 574 | _decimalNumberFormatter = [[NSNumberFormatter alloc] init]; 575 | _decimalNumberFormatter.numberStyle = NSNumberFormatterDecimalStyle; 576 | _decimalNumberFormatter.maximumFractionDigits = 0; 577 | } 578 | return _decimalNumberFormatter; 579 | } 580 | 581 | - (void)setMinValue:(float)minValue { 582 | _minValue = minValue; 583 | [self refresh]; 584 | } 585 | 586 | - (void)setMaxValue:(float)maxValue { 587 | _maxValue = maxValue; 588 | [self refresh]; 589 | } 590 | 591 | - (void)setSelectedMinimum:(float)selectedMinimum { 592 | if (selectedMinimum < self.minValue){ 593 | selectedMinimum = self.minValue; 594 | } 595 | 596 | _selectedMinimum = selectedMinimum; 597 | [self refresh]; 598 | } 599 | 600 | - (void)setSelectedMaximum:(float)selectedMaximum { 601 | if (selectedMaximum > self.maxValue){ 602 | selectedMaximum = self.maxValue; 603 | } 604 | 605 | _selectedMaximum = selectedMaximum; 606 | [self refresh]; 607 | } 608 | 609 | -(void)setMinLabelColour:(UIColor *)minLabelColour{ 610 | _minLabelColour = minLabelColour; 611 | self.minLabel.foregroundColor = _minLabelColour.CGColor; 612 | } 613 | 614 | -(void)setMaxLabelColour:(UIColor *)maxLabelColour{ 615 | _maxLabelColour = maxLabelColour; 616 | self.maxLabel.foregroundColor = _maxLabelColour.CGColor; 617 | } 618 | 619 | -(void)setMinHandleColor:(UIColor *)minHandleColor{ 620 | _minHandleColor = minHandleColor; 621 | self.leftHandle.backgroundColor = _minHandleColor.CGColor; 622 | } 623 | 624 | -(void)setMaxHandleColor:(UIColor *)maxHandleColor{ 625 | _maxHandleColor = maxHandleColor; 626 | self.rightHandle.backgroundColor = _maxHandleColor.CGColor; 627 | } 628 | 629 | -(void)setMinLabelFont:(UIFont *)minLabelFont{ 630 | _minLabelFont = minLabelFont; 631 | self.minLabel.font = (__bridge CFTypeRef)_minLabelFont; 632 | self.minLabel.fontSize = _minLabelFont.pointSize; 633 | } 634 | 635 | -(void)setMaxLabelFont:(UIFont *)maxLabelFont{ 636 | _maxLabelFont = maxLabelFont; 637 | self.maxLabel.font = (__bridge CFTypeRef)_maxLabelFont; 638 | self.maxLabel.fontSize = _maxLabelFont.pointSize; 639 | } 640 | 641 | -(void)setNumberFormatterOverride:(NSNumberFormatter *)numberFormatterOverride{ 642 | _numberFormatterOverride = numberFormatterOverride; 643 | [self updateLabelValues]; 644 | } 645 | 646 | -(void)setHandleImage:(UIImage *)handleImage{ 647 | _handleImage = handleImage; 648 | 649 | CGRect startFrame = CGRectMake(0.0, 0.0, 31, 32); 650 | self.leftHandle.contents = (id)handleImage.CGImage; 651 | self.leftHandle.frame = startFrame; 652 | 653 | self.rightHandle.contents = (id)handleImage.CGImage; 654 | self.rightHandle.frame = startFrame; 655 | 656 | //Force layer background to transparant 657 | self.leftHandle.backgroundColor = [[UIColor clearColor] CGColor]; 658 | self.rightHandle.backgroundColor = [[UIColor clearColor] CGColor]; 659 | } 660 | 661 | -(void)setHandleColor:(UIColor *)handleColor{ 662 | _minHandleColor = handleColor; 663 | _maxHandleColor = handleColor; 664 | self.leftHandle.backgroundColor = [handleColor CGColor]; 665 | self.rightHandle.backgroundColor = [handleColor CGColor]; 666 | } 667 | 668 | -(void)setHandleBorderColor:(UIColor *)handleBorderColor{ 669 | _handleBorderColor = handleBorderColor; 670 | self.leftHandle.borderColor = [handleBorderColor CGColor]; 671 | self.rightHandle.borderColor = [handleBorderColor CGColor]; 672 | } 673 | 674 | -(void)setHandleBorderWidth:(CGFloat)handleBorderWidth{ 675 | _handleBorderWidth = handleBorderWidth; 676 | self.leftHandle.borderWidth = handleBorderWidth; 677 | self.rightHandle.borderWidth = handleBorderWidth; 678 | } 679 | 680 | -(void)setHandleDiameter:(CGFloat)handleDiameter{ 681 | _handleDiameter = handleDiameter; 682 | 683 | self.leftHandle.cornerRadius = self.handleDiameter / 2; 684 | self.rightHandle.cornerRadius = self.handleDiameter / 2; 685 | 686 | self.leftHandle.frame = CGRectMake(0, 0, self.handleDiameter, self.handleDiameter); 687 | self.rightHandle.frame = CGRectMake(0, 0, self.handleDiameter, self.handleDiameter); 688 | 689 | } 690 | 691 | -(void)setTintColorBetweenHandles:(UIColor *)tintColorBetweenHandles{ 692 | _tintColorBetweenHandles = tintColorBetweenHandles; 693 | self.sliderLineBetweenHandles.backgroundColor = [tintColorBetweenHandles CGColor]; 694 | } 695 | 696 | -(void)setLineHeight:(CGFloat)lineHeight{ 697 | _lineHeight = lineHeight; 698 | [self setNeedsLayout]; 699 | } 700 | 701 | -(void)setLineBorderColor:(UIColor *)lineBorderColor{ 702 | _lineBorderColor = lineBorderColor; 703 | self.sliderLine.borderColor = [lineBorderColor CGColor]; 704 | } 705 | 706 | -(void)setLineBorderWidth:(CGFloat)lineBorderWidth{ 707 | _lineBorderWidth = lineBorderWidth; 708 | self.sliderLine.borderWidth = lineBorderWidth; 709 | } 710 | 711 | -(void)setLabelPadding:(CGFloat)labelPadding { 712 | _labelPadding = labelPadding; 713 | [self updateLabelPositions]; 714 | } 715 | 716 | -(void)setBarSidePadding:(CGFloat)barSidePadding { 717 | _barSidePadding = barSidePadding; 718 | [self updateLabelPositions]; 719 | } 720 | 721 | - (void)setShadowRadius:(CGFloat)shadowRadius { 722 | _shadowRadius = shadowRadius; 723 | _shadowOpacity = 1.0; 724 | 725 | self.leftHandle.shadowOffset = CGSizeMake(0.0, self.shadowRadius); 726 | self.leftHandle.shadowRadius = self.shadowRadius; 727 | self.leftHandle.shadowColor = self.tintColor.CGColor; 728 | 729 | self.rightHandle.shadowOffset = CGSizeMake(0.0, _shadowRadius); 730 | self.rightHandle.shadowRadius = _shadowRadius; 731 | self.rightHandle.shadowColor = self.tintColor.CGColor; 732 | } 733 | 734 | - (void)setShadowOpacity:(float)shadowOpacity { 735 | _shadowOpacity = shadowOpacity; 736 | 737 | self.leftHandle.shadowOffset = CGSizeMake(0.0, self.shadowRadius); 738 | self.leftHandle.shadowOpacity = self.shadowOpacity; 739 | self.leftHandle.shadowColor = self.tintColor.CGColor; 740 | 741 | self.rightHandle.shadowOffset = CGSizeMake(0.0, _shadowRadius); 742 | self.rightHandle.shadowOpacity = _shadowOpacity; 743 | self.rightHandle.shadowColor = self.tintColor.CGColor; 744 | } 745 | 746 | - (void)setEnableStep:(BOOL)enableStep { 747 | _enableStep = enableStep; 748 | 749 | [self refresh]; 750 | } 751 | 752 | - (void)setStep:(float)step { 753 | _step = step; 754 | 755 | [self refresh]; 756 | } 757 | 758 | -(void)setHandleType:(HandleType)handleType { 759 | _handleType = handleType; 760 | [self updateHandleTypeAndSize]; 761 | } 762 | 763 | -(void)setHandleSize:(CGSize)handleSize { 764 | _handleSize = handleSize; 765 | [self updateHandleTypeAndSize]; 766 | } 767 | 768 | #pragma mark - UIAccessibility 769 | 770 | - (BOOL)isAccessibilityElement 771 | { 772 | return NO; 773 | } 774 | 775 | #pragma mark - UIAccessibilityContainer Protocol 776 | 777 | - (NSArray *)accessibleElements 778 | { 779 | if(_accessibleElements != nil) { 780 | return _accessibleElements; 781 | } 782 | 783 | _accessibleElements = [[NSMutableArray alloc] init]; 784 | [_accessibleElements addObject:[self leftHandleAccessibilityElement]]; 785 | [_accessibleElements addObject:[self rightHandleAccessbilityElement]]; 786 | 787 | return _accessibleElements; 788 | } 789 | 790 | - (NSInteger)accessibilityElementCount 791 | { 792 | return [[self accessibleElements] count]; 793 | } 794 | 795 | - (id)accessibilityElementAtIndex:(NSInteger)index 796 | { 797 | return [[self accessibleElements] objectAtIndex:index]; 798 | } 799 | 800 | - (NSInteger)indexOfAccessibilityElement:(id)element 801 | { 802 | return [[self accessibleElements] indexOfObject:element]; 803 | } 804 | 805 | - (UIAccessibilityElement *)leftHandleAccessibilityElement 806 | { 807 | TTRangeSliderLeftElement *element = [[TTRangeSliderLeftElement alloc] initWithAccessibilityContainer:self]; 808 | element.isAccessibilityElement = YES; 809 | element.accessibilityLabel = self.minLabelAccessibilityLabel; 810 | element.accessibilityHint = self.minLabelAccessibilityHint; 811 | element.accessibilityValue = self.minLabel.string; 812 | element.accessibilityFrame = [self convertRect:self.leftHandle.frame toView:nil]; 813 | element.accessibilityTraits = UIAccessibilityTraitAdjustable; 814 | return element; 815 | } 816 | 817 | - (UIAccessibilityElement *)rightHandleAccessbilityElement 818 | { 819 | TTRangeSliderRightElement *element = [[TTRangeSliderRightElement alloc] initWithAccessibilityContainer:self]; 820 | element.isAccessibilityElement = YES; 821 | element.accessibilityLabel = self.maxLabelAccessibilityLabel; 822 | element.accessibilityHint = self.maxLabelAccessibilityHint; 823 | element.accessibilityValue = self.maxLabel.string; 824 | element.accessibilityFrame = [self convertRect:self.rightHandle.frame toView:nil]; 825 | element.accessibilityTraits = UIAccessibilityTraitAdjustable; 826 | return element; 827 | } 828 | 829 | @end 830 | 831 | @implementation TTRangeSliderLeftElement 832 | 833 | - (void)accessibilityIncrement { 834 | TTRangeSlider* slider = (TTRangeSlider*)self.accessibilityContainer; 835 | slider.selectedMinimum += slider.step; 836 | self.accessibilityValue = slider.minLabel.string; 837 | } 838 | 839 | - (void)accessibilityDecrement { 840 | TTRangeSlider* slider = (TTRangeSlider*)self.accessibilityContainer; 841 | slider.selectedMinimum -= slider.step; 842 | self.accessibilityValue = slider.minLabel.string; 843 | } 844 | 845 | @end 846 | 847 | @implementation TTRangeSliderRightElement 848 | 849 | - (void)accessibilityIncrement { 850 | TTRangeSlider* slider = (TTRangeSlider*)self.accessibilityContainer; 851 | slider.selectedMaximum += slider.step; 852 | self.accessibilityValue = slider.maxLabel.string; 853 | } 854 | 855 | - (void)accessibilityDecrement { 856 | TTRangeSlider* slider = (TTRangeSlider*)self.accessibilityContainer; 857 | slider.selectedMaximum -= slider.step; 858 | self.accessibilityValue = slider.maxLabel.string; 859 | } 860 | 861 | @end 862 | 863 | -------------------------------------------------------------------------------- /Pod/Classes/TTRangeSliderDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // YLRangeSliderViewDelegate.h 3 | // FantasyRealFootball 4 | // 5 | // Created by Tom Thorpe on 16/04/2014. 6 | // Copyright (c) 2014 Yahoo inc. All rights reserved. 7 | // 8 | 9 | #import 10 | @class TTRangeSlider; 11 | 12 | @protocol TTRangeSliderDelegate 13 | 14 | @optional 15 | 16 | /** 17 | * Called when the RangeSlider values are changed 18 | */ 19 | -(void)rangeSlider:(TTRangeSlider *)sender didChangeSelectedMinimumValue:(float)selectedMinimum andMaximumValue:(float)selectedMaximum; 20 | 21 | /** 22 | * Called when the user has finished interacting with the RangeSlider 23 | */ 24 | - (void)didEndTouchesInRangeSlider:(TTRangeSlider *)sender; 25 | 26 | /** 27 | * Called when the user has started interacting with the RangeSlider 28 | */ 29 | - (void)didStartTouchesInRangeSlider:(TTRangeSlider *)sender; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TTRangeSlider 2 | [![Build Status](https://travis-ci.org/TomThorpe/TTRangeSlider.svg?branch=master)](https://travis-ci.org/TomThorpe/TTRangeSlider) [![Version](https://img.shields.io/cocoapods/v/TTRangeSlider.svg?style=flat)](http://cocoadocs.org/docsets/TTRangeSlider) 3 | [![License](https://img.shields.io/cocoapods/l/TTRangeSlider.svg?style=flat)](http://cocoadocs.org/docsets/TTRangeSlider) 4 | [![Platform](https://img.shields.io/cocoapods/p/TTRangeSlider.svg?style=flat)](http://cocoadocs.org/docsets/TTRangeSlider) 5 | 6 | A slider, similar in style to UISlider, but which allows you to pick a minimum and maximum range. 7 | 8 | ![Screenshot](Example/TTRangeSlider.gif) 9 | ## Installation 10 | TTRangeSlider is available through [CocoaPods](http://cocoapods.org). To install 11 | it, simply add the following line to your Podfile: 12 | 13 | ```ruby 14 | pod "TTRangeSlider" 15 | ``` 16 | 17 | Note that this control uses IB_DESIGNABLE, so for it to work well and not get warnings in Interface Builder, you should use the latest version of CocoaPods, and add the `use_frameworks!` line. So your podfile may look something like 18 | 19 | ```ruby 20 | source 'https://github.com/CocoaPods/Specs.git' 21 | use_frameworks! 22 | 23 | pod “TTRangeSlider” 24 | ``` 25 | 26 | ## Usage 27 | 28 | Add the TTRangeSlider like you would with any other UIControl. Either: 29 | * Add a view in your storyboard/class and change it’s type to `TTRangeSlider`. As long as you’re using >= XCode6 you can now use this control like any other, you can set all the properties in the Attributes Inspector and see a live preview: 30 | 31 | ![Interface Builder Screenshot](Example/interfacebuilder.png) 32 | 33 | or 34 | * Create the `TTRangeSlider` in code using `[TTRangeSlider alloc] init]` then add it as a subview to your code and set the relevant autolayout properties or frame. 35 | 36 | The default slider ranges from 0->100 and has 10 preselected as the minimum, and 90 as the maximum. 37 | 38 | Values that the user has selected are exposed using the `selectedMinimum` and `selectedMaximum` properties. You can also use these properties to change the selected values programatically if you wish. 39 | 40 | ## Getting updates 41 | 42 | To be notified when the slider’s value changes, register your action method with the `UIControlEventValueChanged` event. At runtime, the slider calls your method in response to the user changing the slider’s value. 43 | 44 | Alternatively you can implement the `TTRangeSliderDelegate` protocol and respond to changes in the `rangeSlider:didChangeSelectedMinimumValue:andMaximumValue:` method. 45 | 46 | Other customisation of the control is done using the following properties: 47 | #### `tintColor` 48 | The tintColor property (which you can also set in Interface Builder) sets the overall colour of the control, including the colour of the line, the two handles, and the labels. 49 | 50 | It is safe to change the `tintColor` at any time, if the control is currently visible the colour change will be animated into the new colour. 51 | #### `tintColorBetweenHandles` 52 | The tintColorBetweenHandles property sets the color of the line between the two handles. 53 | #### `minValue` 54 | The minimum possible value to select in the range 55 | #### `maxValue` 56 | The maximum possible value to select in the range 57 | #### `selectedMinimum` 58 | The preselected minumum value (note: This should be less than the selectedMaximum) 59 | #### `selectedMaximum` 60 | The preselected maximum value (note: This should be greater than the selectedMinimum) 61 | #### `numberFormatterOverride` 62 | Each handle in the slider has a label above it showing the current selected value. By default, this is displayed as a decimal format. 63 | 64 | You can override this default here by supplying your own NSNumberFormatter. For example, you could supply an NSNumberFormatter that has a currency style, or a prefix or suffix. 65 | 66 | If this property is nil, the default decimal format will be used. Note: If you want no labels at all, set this value to be `(NSNumberFormatter *)[NSNull null]` (as opposed to nil), to specifically mark that you want no labels 67 | #### `hideLabels` 68 | When set to `YES` the labels above the slider controls will be hidden. Default is NO. 69 | #### `minDistance` 70 | The minimum distance the two selected slider values must be apart. -1 for no minimum. Default is -1. 71 | #### `maxDistance` 72 | The maximum distance the two selected slider values must be apart. -1 for no maximum. Default is -1. 73 | #### `minLabelColour` 74 | The colour of the minimum value text label. If not set, the default is the tintColor. 75 | #### `maxLabelColour` 76 | The colour of the maximum value text label. If not set, the default is the tintColor. 77 | #### `disableRange` 78 | If true, the control will mimic a normal slider and have only one handle rather than a range. 79 | 80 | In this case, the selectedMinValue will be not functional anymore. Use selectedMaxValue instead to determine the value the user has selected. 81 | #### `enableStep` 82 | If true the control will snap to point at each `step` (property) between minValue and maxValue. Default value is disabled. 83 | #### `step` 84 | If `enableStep` is true, this controls the value of each step. E.g. if this value is 20, the control will snap to values 20,40,60...etc. Set this is you enable the `enableStep` property. 85 | #### `handleImage` 86 | If set the image passed will be used for the handles. 87 | #### `handleColor` 88 | If set it will update the color of the handles. Default is `tintColor`. 89 | #### `handleDiameter` 90 | If set it will update the size of the handles. Default is `16.0`. 91 | #### `selectedHandleDiameterMultiplier` 92 | If set it update the scaling factor of the handle when selected. Default is `1.7`. If you don't want any scaling, set it to `1.0`. 93 | #### `lineHeight` 94 | Set the height of the line. It will automatically round the corners. If not specified, the default value will be `1.0`. 95 | #### `lineBorderWidth` 96 | Sets an optional border on the outer lines (not the line inside the range) of the slider. Default is 0. 97 | #### `lineBorderColor` 98 | If `lineBorderWidth`, set the colour of the line here. 99 | #### `handleBorderColor` 100 | If set it will update the color of the handle borders. Default is `tintColor`. 101 | #### `handleBorderWidth` 102 | If set it will update the size of the handle borders. Default is `0.0` 103 | #### `labelPadding` 104 | If set it will update the size of the padding between label and handle. Default is `8.0` 105 | 106 | ## Author 107 | 108 | Tom Thorpe 109 | 110 | ## License 111 | 112 | TTRangeSlider is available under the MIT license. See the LICENSE file for more info. 113 | -------------------------------------------------------------------------------- /TTRangeSlider.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "TTRangeSlider" 3 | s.version = "1.0.7" 4 | s.summary = "A slider that allows you to pick a range" 5 | s.description = <<-DESC 6 | A slider, similar in style to UISlider, but has two handles instead of one, allowing you to pick a minimum and maximum range. 7 | DESC 8 | s.homepage = "https://github.com/TomThorpe/TTRangeSlider" 9 | # s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" 10 | s.license = 'MIT' 11 | s.author = { "Tom Thorpe" => "code@tomthorpe.co.uk" } 12 | s.source = { :git => "https://github.com/TomThorpe/TTRangeSlider.git", :tag => 'v1.0.7' } 13 | s.platform = :ios, '7.0' 14 | s.requires_arc = true 15 | 16 | s.source_files = 'Pod/Classes/**/*' 17 | end 18 | --------------------------------------------------------------------------------