├── .github └── workflows │ └── main.yml ├── .gitignore ├── Example ├── Podfile ├── Podfile.lock ├── Pods │ ├── Local Podspecs │ │ └── TactileSlider.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── TactileSlider.xcscheme │ └── Target Support Files │ │ ├── Pods-TactileSlider_Example │ │ ├── Info.plist │ │ ├── Pods-TactileSlider_Example-Info.plist │ │ ├── Pods-TactileSlider_Example-acknowledgements.markdown │ │ ├── Pods-TactileSlider_Example-acknowledgements.plist │ │ ├── Pods-TactileSlider_Example-dummy.m │ │ ├── Pods-TactileSlider_Example-frameworks.sh │ │ ├── Pods-TactileSlider_Example-resources.sh │ │ ├── Pods-TactileSlider_Example-umbrella.h │ │ ├── Pods-TactileSlider_Example.debug.xcconfig │ │ ├── Pods-TactileSlider_Example.modulemap │ │ └── Pods-TactileSlider_Example.release.xcconfig │ │ ├── Pods-TactileSlider_Tests │ │ ├── Info.plist │ │ ├── Pods-TactileSlider_Tests-Info.plist │ │ ├── Pods-TactileSlider_Tests-acknowledgements.markdown │ │ ├── Pods-TactileSlider_Tests-acknowledgements.plist │ │ ├── Pods-TactileSlider_Tests-dummy.m │ │ ├── Pods-TactileSlider_Tests-frameworks.sh │ │ ├── Pods-TactileSlider_Tests-resources.sh │ │ ├── Pods-TactileSlider_Tests-umbrella.h │ │ ├── Pods-TactileSlider_Tests.debug.xcconfig │ │ ├── Pods-TactileSlider_Tests.modulemap │ │ └── Pods-TactileSlider_Tests.release.xcconfig │ │ └── TactileSlider │ │ ├── Info.plist │ │ ├── TactileSlider-Info.plist │ │ ├── TactileSlider-dummy.m │ │ ├── TactileSlider-prefix.pch │ │ ├── TactileSlider-umbrella.h │ │ ├── TactileSlider.debug.xcconfig │ │ ├── TactileSlider.modulemap │ │ ├── TactileSlider.release.xcconfig │ │ └── TactileSlider.xcconfig ├── TactileSlider.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── TactileSlider-Example.xcscheme ├── TactileSlider.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── TactileSlider │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── LaunchScreen.xib │ │ └── Main.storyboard │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ └── ViewController.swift └── Tests │ ├── Info.plist │ └── Tests.swift ├── LICENSE ├── Package.swift ├── README.md ├── Screenshots ├── IBDesignable.png ├── horizontal.png ├── in_use.gif └── vertical.png ├── TactileSlider.podspec ├── TactileSlider ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ ├── TactileSlider+UIPointerInteractionDelegate.swift │ ├── TactileSlider.swift │ ├── TactileSliderLayerRenderer.swift │ └── UIColor+ContrastRatio.swift └── _Pods.xcodeproj /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: CI 4 | 5 | # Controls when the workflow will run 6 | on: 7 | # Triggers the workflow on push or pull request events but only for the main branch 8 | push: 9 | branches: [ main, develop ] 10 | pull_request: 11 | branches: [ main, develop, github-actions-ci ] 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | workflow_dispatch: 15 | 16 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 17 | jobs: 18 | # This workflow contains a single job called "build" 19 | build: 20 | # The type of runner that the job will run on 21 | runs-on: macos-latest 22 | 23 | # Steps represent a sequence of tasks that will be executed as part of the job 24 | steps: 25 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 26 | - uses: actions/checkout@v2 27 | 28 | # Runs a single command using the runners shell 29 | - name: Xcode build 30 | run: set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/TactileSlider.xcworkspace -scheme TactileSlider-Example -sdk iphonesimulator14.4 -destination "platform=iOS Simulator,OS=14.4,name=iPhone 11" ONLY_ACTIVE_ARCH=NO | xcpretty 31 | 32 | # Runs a set of commands using the runners shell 33 | - name: pod lib lint 34 | run: pod lib lint 35 | -------------------------------------------------------------------------------- /.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 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 26 | # Carthage/Checkouts 27 | 28 | Carthage/Build 29 | 30 | # We recommend against adding the Pods directory to your .gitignore. However 31 | # you should judge for yourself, the pros and cons are mentioned at: 32 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 33 | # 34 | # Note: if you ignore the Pods directory, make sure to uncomment 35 | # `pod install` in .travis.yml 36 | # 37 | # Pods/ 38 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'TactileSlider_Example' do 4 | pod 'TactileSlider', :path => '../' 5 | 6 | target 'TactileSlider_Tests' do 7 | inherit! :search_paths 8 | 9 | 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - TactileSlider (3.0.0) 3 | 4 | DEPENDENCIES: 5 | - TactileSlider (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | TactileSlider: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | TactileSlider: 29d7ece49b13f921f1c8e0952ffba6c0b9c9d19d 13 | 14 | PODFILE CHECKSUM: 2e2460c93ad3a974bdc28985d5e5541147bb0773 15 | 16 | COCOAPODS: 1.10.2 17 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/TactileSlider.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "TactileSlider", 3 | "version": "3.0.0", 4 | "summary": "Easy-to-grab slider control inspired by Control Center and HomeKit.", 5 | "description": "A slider control designed to be easy to grab and use because it can be dragged or tapped from anywhere along its track, similar to the sliders in Control Center and HomeKit.", 6 | "homepage": "https://github.com/daprice/iOS-Tactile-Slider", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "Dale Price": "daprice@mac.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com/daprice/iOS-Tactile-Slider.git", 16 | "tag": "3.0.0" 17 | }, 18 | "social_media_url": "https://mastodon.technology/@dale_price", 19 | "platforms": { 20 | "ios": "9.0" 21 | }, 22 | "swift_versions": "5.0", 23 | "source_files": "TactileSlider/Classes/**/*", 24 | "frameworks": "UIKit", 25 | "swift_version": "5.0" 26 | } 27 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - TactileSlider (3.0.0) 3 | 4 | DEPENDENCIES: 5 | - TactileSlider (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | TactileSlider: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | TactileSlider: 29d7ece49b13f921f1c8e0952ffba6c0b9c9d19d 13 | 14 | PODFILE CHECKSUM: 2e2460c93ad3a974bdc28985d5e5541147bb0773 15 | 16 | COCOAPODS: 1.10.2 17 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 17AC1E7DAA27C01FA0C7DA71F0810AB8 /* TactileSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = E37F42BFB3249AAA22389039128774B9 /* TactileSlider.swift */; }; 11 | 378B5128ECFA7D1820919A0A00C06DAE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D245E0514AAC1A2B9A6D5EA2F383E90F /* UIKit.framework */; }; 12 | 3ACBB581ADAA58C2D5652E0E9E0875C8 /* TactileSliderLayerRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF8183C5F2CAEEB7DAE1E9E038C3FD6 /* TactileSliderLayerRenderer.swift */; }; 13 | 463606B606CEC4E6C6659849899638E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */; }; 14 | 4B0CA5D59D5F80CC61732D7D893BB8A7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */; }; 15 | 5E2D461C30ED71FC7038DC5756FC5707 /* TactileSlider+UIPointerInteractionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0247D8675A6DF35593484D6FD224A051 /* TactileSlider+UIPointerInteractionDelegate.swift */; }; 16 | 6807F44B6194F7C69C8D685F21C456FA /* UIColor+ContrastRatio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1353A2765F13F0AA1388CB16B3DD73D0 /* UIColor+ContrastRatio.swift */; }; 17 | 6FAB0B43B1B18385CC1AE7AEEDF0B4C4 /* Pods-TactileSlider_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B1EF4514EEB06A11CDC4D54DF47E749A /* Pods-TactileSlider_Tests-dummy.m */; }; 18 | 794FC712BCE6582FD12498F13631854D /* Pods-TactileSlider_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D1250780FFA398CE8F5394959CD4E044 /* Pods-TactileSlider_Example-dummy.m */; }; 19 | 8EB8F7C2B74B0C759185B364C8ABE7F3 /* TactileSlider-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 78089BF0965DA728F0BF35C88DA2FD29 /* TactileSlider-dummy.m */; }; 20 | 9D4601CA1FE1D683185B90EC6579EA4B /* Pods-TactileSlider_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1075ADEB69467304258380F693EF6CDC /* Pods-TactileSlider_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 21 | A8E5159F5AE3B5A1435F5FC6C5517F5C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */; }; 22 | AB07333DFDF598BEFD6DD288978DE96C /* TactileSlider-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ABF4D6BD5594230C4D83A0C1F140F41 /* TactileSlider-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 23 | D62C49902818A720F4796C50A7B437B1 /* Pods-TactileSlider_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FB2CD6421A5CF2280EEF04923763D7 /* Pods-TactileSlider_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXContainerItemProxy section */ 27 | A8995654EAA74D0AF2D22F249887EB14 /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 30 | proxyType = 1; 31 | remoteGlobalIDString = 871DF4CDAFC65BB655C9133B3C78D951; 32 | remoteInfo = "Pods-TactileSlider_Example"; 33 | }; 34 | EE256BD9AEE49C4794F7B340FB8DCDD0 /* PBXContainerItemProxy */ = { 35 | isa = PBXContainerItemProxy; 36 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 37 | proxyType = 1; 38 | remoteGlobalIDString = 80DEE1020F4A777B4C5B940B77991565; 39 | remoteInfo = TactileSlider; 40 | }; 41 | /* End PBXContainerItemProxy section */ 42 | 43 | /* Begin PBXFileReference section */ 44 | 022FCCD2A7651B213B499EF9CBC49E13 /* TactileSlider.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TactileSlider.modulemap; sourceTree = ""; }; 45 | 0247D8675A6DF35593484D6FD224A051 /* TactileSlider+UIPointerInteractionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "TactileSlider+UIPointerInteractionDelegate.swift"; path = "TactileSlider/Classes/TactileSlider+UIPointerInteractionDelegate.swift"; sourceTree = ""; }; 46 | 059978BF2DD1D62EA77F27A792A8A555 /* TactileSlider.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TactileSlider.release.xcconfig; sourceTree = ""; }; 47 | 0DF8183C5F2CAEEB7DAE1E9E038C3FD6 /* TactileSliderLayerRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TactileSliderLayerRenderer.swift; path = TactileSlider/Classes/TactileSliderLayerRenderer.swift; sourceTree = ""; }; 48 | 1075ADEB69467304258380F693EF6CDC /* Pods-TactileSlider_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TactileSlider_Tests-umbrella.h"; sourceTree = ""; }; 49 | 1353A2765F13F0AA1388CB16B3DD73D0 /* UIColor+ContrastRatio.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+ContrastRatio.swift"; path = "TactileSlider/Classes/UIColor+ContrastRatio.swift"; sourceTree = ""; }; 50 | 1ABF4D6BD5594230C4D83A0C1F140F41 /* TactileSlider-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TactileSlider-umbrella.h"; sourceTree = ""; }; 51 | 1F0D0892DC5728C8B1F43C6B48669DC0 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 52 | 2317EB53B535645261350739C5CBDE43 /* Pods-TactileSlider_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TactileSlider_Tests.debug.xcconfig"; sourceTree = ""; }; 53 | 26C8800642A88CD97942A19B2FA5E90A /* Pods-TactileSlider_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TactileSlider_Tests-Info.plist"; sourceTree = ""; }; 54 | 334B75F807DD5A8DB3F343926F866DB2 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 55 | 420140E596F57B6CB71A6F45694ED41F /* Pods-TactileSlider_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TactileSlider_Tests.release.xcconfig"; sourceTree = ""; }; 56 | 4CF07B91A750E57DC5DCFB77C7AA707B /* Pods-TactileSlider_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TactileSlider_Example.modulemap"; sourceTree = ""; }; 57 | 5E06080D2B1A0F4CC930D0F6135DE58E /* Pods-TactileSlider_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TactileSlider_Example-acknowledgements.plist"; sourceTree = ""; }; 58 | 6B49879D608C1D96E70799B37E705DED /* Pods-TactileSlider_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TactileSlider_Tests-acknowledgements.plist"; sourceTree = ""; }; 59 | 6D7613A991207D8DBDC0FDB94D6457E0 /* Pods_TactileSlider_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TactileSlider_Example.framework; path = "Pods-TactileSlider_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 60 | 757E18938DFB9459991440CFCC9B24F0 /* TactileSlider.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = TactileSlider.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 61 | 78089BF0965DA728F0BF35C88DA2FD29 /* TactileSlider-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TactileSlider-dummy.m"; sourceTree = ""; }; 62 | 8B0839462995779CCC56FB9612A76E64 /* Pods-TactileSlider_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TactileSlider_Example-acknowledgements.markdown"; sourceTree = ""; }; 63 | 92C4C6F02C7A264D175930B66680A213 /* Pods-TactileSlider_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TactileSlider_Tests.modulemap"; sourceTree = ""; }; 64 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 65 | A5EC5BC96DCC828F9FD1A76F0C0D0AD4 /* Pods_TactileSlider_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TactileSlider_Tests.framework; path = "Pods-TactileSlider_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 66 | A71F6181E5C732974BC788754FB602DC /* Pods-TactileSlider_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TactileSlider_Tests-acknowledgements.markdown"; sourceTree = ""; }; 67 | A7ADAEC0B181767F1185FC57992B05D0 /* TactileSlider-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "TactileSlider-Info.plist"; sourceTree = ""; }; 68 | B1EF4514EEB06A11CDC4D54DF47E749A /* Pods-TactileSlider_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TactileSlider_Tests-dummy.m"; sourceTree = ""; }; 69 | B361F29B0AD76E15F77738A295E770DC /* Pods-TactileSlider_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TactileSlider_Example-frameworks.sh"; sourceTree = ""; }; 70 | C102E697FD3C87475D4A01BBF9FD51A9 /* TactileSlider.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TactileSlider.debug.xcconfig; sourceTree = ""; }; 71 | C198D37682E9D7A8CE6AF0AD3790723E /* Pods-TactileSlider_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TactileSlider_Example.debug.xcconfig"; sourceTree = ""; }; 72 | D1250780FFA398CE8F5394959CD4E044 /* Pods-TactileSlider_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TactileSlider_Example-dummy.m"; sourceTree = ""; }; 73 | D245E0514AAC1A2B9A6D5EA2F383E90F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 74 | D7FB2CD6421A5CF2280EEF04923763D7 /* Pods-TactileSlider_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TactileSlider_Example-umbrella.h"; sourceTree = ""; }; 75 | E37F42BFB3249AAA22389039128774B9 /* TactileSlider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TactileSlider.swift; path = TactileSlider/Classes/TactileSlider.swift; sourceTree = ""; }; 76 | E4034BF0620B8345DC35E86922842D24 /* Pods-TactileSlider_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TactileSlider_Example-Info.plist"; sourceTree = ""; }; 77 | E94DC7A89756EC1640B9831205261F0F /* Pods-TactileSlider_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TactileSlider_Example.release.xcconfig"; sourceTree = ""; }; 78 | EAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 79 | EF282BEAD4349BC18A56D8307C9DE7F6 /* TactileSlider.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = TactileSlider.framework; path = TactileSlider.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 80 | F2B3E4B3FCC90E961591DF1879F73911 /* TactileSlider-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TactileSlider-prefix.pch"; sourceTree = ""; }; 81 | /* End PBXFileReference section */ 82 | 83 | /* Begin PBXFrameworksBuildPhase section */ 84 | 0BD94D6855736DCDE1591FB4247B0DDB /* Frameworks */ = { 85 | isa = PBXFrameworksBuildPhase; 86 | buildActionMask = 2147483647; 87 | files = ( 88 | 463606B606CEC4E6C6659849899638E4 /* Foundation.framework in Frameworks */, 89 | ); 90 | runOnlyForDeploymentPostprocessing = 0; 91 | }; 92 | 78E8B0582BF733146307661A827C45F4 /* Frameworks */ = { 93 | isa = PBXFrameworksBuildPhase; 94 | buildActionMask = 2147483647; 95 | files = ( 96 | A8E5159F5AE3B5A1435F5FC6C5517F5C /* Foundation.framework in Frameworks */, 97 | ); 98 | runOnlyForDeploymentPostprocessing = 0; 99 | }; 100 | 81A9086AABCC256FA513B97CE875FCB9 /* Frameworks */ = { 101 | isa = PBXFrameworksBuildPhase; 102 | buildActionMask = 2147483647; 103 | files = ( 104 | 4B0CA5D59D5F80CC61732D7D893BB8A7 /* Foundation.framework in Frameworks */, 105 | 378B5128ECFA7D1820919A0A00C06DAE /* UIKit.framework in Frameworks */, 106 | ); 107 | runOnlyForDeploymentPostprocessing = 0; 108 | }; 109 | /* End PBXFrameworksBuildPhase section */ 110 | 111 | /* Begin PBXGroup section */ 112 | 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 59DA5C1F72E1D5BABC43EACBA672C3BA /* iOS */, 116 | ); 117 | name = Frameworks; 118 | sourceTree = ""; 119 | }; 120 | 59DA5C1F72E1D5BABC43EACBA672C3BA /* iOS */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | EAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */, 124 | D245E0514AAC1A2B9A6D5EA2F383E90F /* UIKit.framework */, 125 | ); 126 | name = iOS; 127 | sourceTree = ""; 128 | }; 129 | 61A4479388AEE8DACA90B1AB48F7CF41 /* Targets Support Files */ = { 130 | isa = PBXGroup; 131 | children = ( 132 | 8B19A7D20D03E9776B56C5643AB502F5 /* Pods-TactileSlider_Example */, 133 | A6C783978C0174D2750B9E049DBAA755 /* Pods-TactileSlider_Tests */, 134 | ); 135 | name = "Targets Support Files"; 136 | sourceTree = ""; 137 | }; 138 | 8B19A7D20D03E9776B56C5643AB502F5 /* Pods-TactileSlider_Example */ = { 139 | isa = PBXGroup; 140 | children = ( 141 | 4CF07B91A750E57DC5DCFB77C7AA707B /* Pods-TactileSlider_Example.modulemap */, 142 | 8B0839462995779CCC56FB9612A76E64 /* Pods-TactileSlider_Example-acknowledgements.markdown */, 143 | 5E06080D2B1A0F4CC930D0F6135DE58E /* Pods-TactileSlider_Example-acknowledgements.plist */, 144 | D1250780FFA398CE8F5394959CD4E044 /* Pods-TactileSlider_Example-dummy.m */, 145 | B361F29B0AD76E15F77738A295E770DC /* Pods-TactileSlider_Example-frameworks.sh */, 146 | E4034BF0620B8345DC35E86922842D24 /* Pods-TactileSlider_Example-Info.plist */, 147 | D7FB2CD6421A5CF2280EEF04923763D7 /* Pods-TactileSlider_Example-umbrella.h */, 148 | C198D37682E9D7A8CE6AF0AD3790723E /* Pods-TactileSlider_Example.debug.xcconfig */, 149 | E94DC7A89756EC1640B9831205261F0F /* Pods-TactileSlider_Example.release.xcconfig */, 150 | ); 151 | name = "Pods-TactileSlider_Example"; 152 | path = "Target Support Files/Pods-TactileSlider_Example"; 153 | sourceTree = ""; 154 | }; 155 | 8CADDA42916CDF92B4A0547F764CDB6C /* Support Files */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | 022FCCD2A7651B213B499EF9CBC49E13 /* TactileSlider.modulemap */, 159 | 78089BF0965DA728F0BF35C88DA2FD29 /* TactileSlider-dummy.m */, 160 | A7ADAEC0B181767F1185FC57992B05D0 /* TactileSlider-Info.plist */, 161 | F2B3E4B3FCC90E961591DF1879F73911 /* TactileSlider-prefix.pch */, 162 | 1ABF4D6BD5594230C4D83A0C1F140F41 /* TactileSlider-umbrella.h */, 163 | C102E697FD3C87475D4A01BBF9FD51A9 /* TactileSlider.debug.xcconfig */, 164 | 059978BF2DD1D62EA77F27A792A8A555 /* TactileSlider.release.xcconfig */, 165 | ); 166 | name = "Support Files"; 167 | path = "Example/Pods/Target Support Files/TactileSlider"; 168 | sourceTree = ""; 169 | }; 170 | 913920CC575412ED7F11E9D324E0BC09 /* TactileSlider */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | E37F42BFB3249AAA22389039128774B9 /* TactileSlider.swift */, 174 | 0247D8675A6DF35593484D6FD224A051 /* TactileSlider+UIPointerInteractionDelegate.swift */, 175 | 0DF8183C5F2CAEEB7DAE1E9E038C3FD6 /* TactileSliderLayerRenderer.swift */, 176 | 1353A2765F13F0AA1388CB16B3DD73D0 /* UIColor+ContrastRatio.swift */, 177 | FDCC31F29D0C0BC3E519F0DB3AED6569 /* Pod */, 178 | 8CADDA42916CDF92B4A0547F764CDB6C /* Support Files */, 179 | ); 180 | name = TactileSlider; 181 | path = ../..; 182 | sourceTree = ""; 183 | }; 184 | A6C783978C0174D2750B9E049DBAA755 /* Pods-TactileSlider_Tests */ = { 185 | isa = PBXGroup; 186 | children = ( 187 | 92C4C6F02C7A264D175930B66680A213 /* Pods-TactileSlider_Tests.modulemap */, 188 | A71F6181E5C732974BC788754FB602DC /* Pods-TactileSlider_Tests-acknowledgements.markdown */, 189 | 6B49879D608C1D96E70799B37E705DED /* Pods-TactileSlider_Tests-acknowledgements.plist */, 190 | B1EF4514EEB06A11CDC4D54DF47E749A /* Pods-TactileSlider_Tests-dummy.m */, 191 | 26C8800642A88CD97942A19B2FA5E90A /* Pods-TactileSlider_Tests-Info.plist */, 192 | 1075ADEB69467304258380F693EF6CDC /* Pods-TactileSlider_Tests-umbrella.h */, 193 | 2317EB53B535645261350739C5CBDE43 /* Pods-TactileSlider_Tests.debug.xcconfig */, 194 | 420140E596F57B6CB71A6F45694ED41F /* Pods-TactileSlider_Tests.release.xcconfig */, 195 | ); 196 | name = "Pods-TactileSlider_Tests"; 197 | path = "Target Support Files/Pods-TactileSlider_Tests"; 198 | sourceTree = ""; 199 | }; 200 | CF1408CF629C7361332E53B88F7BD30C = { 201 | isa = PBXGroup; 202 | children = ( 203 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 204 | F253DDFC1B86F8049173084851BFA56E /* Development Pods */, 205 | 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, 206 | E1E5B9E25E26B942C88549BF55091AF0 /* Products */, 207 | 61A4479388AEE8DACA90B1AB48F7CF41 /* Targets Support Files */, 208 | ); 209 | sourceTree = ""; 210 | }; 211 | E1E5B9E25E26B942C88549BF55091AF0 /* Products */ = { 212 | isa = PBXGroup; 213 | children = ( 214 | 6D7613A991207D8DBDC0FDB94D6457E0 /* Pods_TactileSlider_Example.framework */, 215 | A5EC5BC96DCC828F9FD1A76F0C0D0AD4 /* Pods_TactileSlider_Tests.framework */, 216 | EF282BEAD4349BC18A56D8307C9DE7F6 /* TactileSlider.framework */, 217 | ); 218 | name = Products; 219 | sourceTree = ""; 220 | }; 221 | F253DDFC1B86F8049173084851BFA56E /* Development Pods */ = { 222 | isa = PBXGroup; 223 | children = ( 224 | 913920CC575412ED7F11E9D324E0BC09 /* TactileSlider */, 225 | ); 226 | name = "Development Pods"; 227 | sourceTree = ""; 228 | }; 229 | FDCC31F29D0C0BC3E519F0DB3AED6569 /* Pod */ = { 230 | isa = PBXGroup; 231 | children = ( 232 | 334B75F807DD5A8DB3F343926F866DB2 /* LICENSE */, 233 | 1F0D0892DC5728C8B1F43C6B48669DC0 /* README.md */, 234 | 757E18938DFB9459991440CFCC9B24F0 /* TactileSlider.podspec */, 235 | ); 236 | name = Pod; 237 | sourceTree = ""; 238 | }; 239 | /* End PBXGroup section */ 240 | 241 | /* Begin PBXHeadersBuildPhase section */ 242 | 5847BC82442039754FE6842D2223DC6B /* Headers */ = { 243 | isa = PBXHeadersBuildPhase; 244 | buildActionMask = 2147483647; 245 | files = ( 246 | AB07333DFDF598BEFD6DD288978DE96C /* TactileSlider-umbrella.h in Headers */, 247 | ); 248 | runOnlyForDeploymentPostprocessing = 0; 249 | }; 250 | C1C818E296D4E124802544490D92A82F /* Headers */ = { 251 | isa = PBXHeadersBuildPhase; 252 | buildActionMask = 2147483647; 253 | files = ( 254 | 9D4601CA1FE1D683185B90EC6579EA4B /* Pods-TactileSlider_Tests-umbrella.h in Headers */, 255 | ); 256 | runOnlyForDeploymentPostprocessing = 0; 257 | }; 258 | F9F5364AB777FAC960395E7BAE13EBB2 /* Headers */ = { 259 | isa = PBXHeadersBuildPhase; 260 | buildActionMask = 2147483647; 261 | files = ( 262 | D62C49902818A720F4796C50A7B437B1 /* Pods-TactileSlider_Example-umbrella.h in Headers */, 263 | ); 264 | runOnlyForDeploymentPostprocessing = 0; 265 | }; 266 | /* End PBXHeadersBuildPhase section */ 267 | 268 | /* Begin PBXNativeTarget section */ 269 | 80DEE1020F4A777B4C5B940B77991565 /* TactileSlider */ = { 270 | isa = PBXNativeTarget; 271 | buildConfigurationList = F0B9F1DB68CE5B4E84DAC45E4542431E /* Build configuration list for PBXNativeTarget "TactileSlider" */; 272 | buildPhases = ( 273 | 5847BC82442039754FE6842D2223DC6B /* Headers */, 274 | C440FA3DC4C4E9EFA70A44447F30E09D /* Sources */, 275 | 81A9086AABCC256FA513B97CE875FCB9 /* Frameworks */, 276 | CDC4ABCA80E53A42ADD002A226F06678 /* Resources */, 277 | ); 278 | buildRules = ( 279 | ); 280 | dependencies = ( 281 | ); 282 | name = TactileSlider; 283 | productName = TactileSlider; 284 | productReference = EF282BEAD4349BC18A56D8307C9DE7F6 /* TactileSlider.framework */; 285 | productType = "com.apple.product-type.framework"; 286 | }; 287 | 871DF4CDAFC65BB655C9133B3C78D951 /* Pods-TactileSlider_Example */ = { 288 | isa = PBXNativeTarget; 289 | buildConfigurationList = 42ECE660A60BF2E78677298F7E64EAFE /* Build configuration list for PBXNativeTarget "Pods-TactileSlider_Example" */; 290 | buildPhases = ( 291 | F9F5364AB777FAC960395E7BAE13EBB2 /* Headers */, 292 | 9B802730DFC83C9478D1494D25369503 /* Sources */, 293 | 78E8B0582BF733146307661A827C45F4 /* Frameworks */, 294 | 44462DAB91B5AA38CEAF1B20185DE407 /* Resources */, 295 | ); 296 | buildRules = ( 297 | ); 298 | dependencies = ( 299 | 8103B98623AE7B8E9F9A10507B042C4E /* PBXTargetDependency */, 300 | ); 301 | name = "Pods-TactileSlider_Example"; 302 | productName = "Pods-TactileSlider_Example"; 303 | productReference = 6D7613A991207D8DBDC0FDB94D6457E0 /* Pods_TactileSlider_Example.framework */; 304 | productType = "com.apple.product-type.framework"; 305 | }; 306 | F09B28709C1CFD0FBB239A99DF29FCA7 /* Pods-TactileSlider_Tests */ = { 307 | isa = PBXNativeTarget; 308 | buildConfigurationList = 3FD9F28885784BC8FF1802820E5C0DC3 /* Build configuration list for PBXNativeTarget "Pods-TactileSlider_Tests" */; 309 | buildPhases = ( 310 | C1C818E296D4E124802544490D92A82F /* Headers */, 311 | 1783145A03F996612F76D4E7BFA60500 /* Sources */, 312 | 0BD94D6855736DCDE1591FB4247B0DDB /* Frameworks */, 313 | 6F3A497BFD0BA2C9E4ABC268FBF6CDE7 /* Resources */, 314 | ); 315 | buildRules = ( 316 | ); 317 | dependencies = ( 318 | 8C33AC72372C33B0350E938483463B8F /* PBXTargetDependency */, 319 | ); 320 | name = "Pods-TactileSlider_Tests"; 321 | productName = "Pods-TactileSlider_Tests"; 322 | productReference = A5EC5BC96DCC828F9FD1A76F0C0D0AD4 /* Pods_TactileSlider_Tests.framework */; 323 | productType = "com.apple.product-type.framework"; 324 | }; 325 | /* End PBXNativeTarget section */ 326 | 327 | /* Begin PBXProject section */ 328 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 329 | isa = PBXProject; 330 | attributes = { 331 | LastSwiftUpdateCheck = 1240; 332 | LastUpgradeCheck = 1240; 333 | }; 334 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 335 | compatibilityVersion = "Xcode 3.2"; 336 | developmentRegion = en; 337 | hasScannedForEncodings = 0; 338 | knownRegions = ( 339 | en, 340 | Base, 341 | ); 342 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 343 | productRefGroup = E1E5B9E25E26B942C88549BF55091AF0 /* Products */; 344 | projectDirPath = ""; 345 | projectRoot = ""; 346 | targets = ( 347 | 871DF4CDAFC65BB655C9133B3C78D951 /* Pods-TactileSlider_Example */, 348 | F09B28709C1CFD0FBB239A99DF29FCA7 /* Pods-TactileSlider_Tests */, 349 | 80DEE1020F4A777B4C5B940B77991565 /* TactileSlider */, 350 | ); 351 | }; 352 | /* End PBXProject section */ 353 | 354 | /* Begin PBXResourcesBuildPhase section */ 355 | 44462DAB91B5AA38CEAF1B20185DE407 /* Resources */ = { 356 | isa = PBXResourcesBuildPhase; 357 | buildActionMask = 2147483647; 358 | files = ( 359 | ); 360 | runOnlyForDeploymentPostprocessing = 0; 361 | }; 362 | 6F3A497BFD0BA2C9E4ABC268FBF6CDE7 /* Resources */ = { 363 | isa = PBXResourcesBuildPhase; 364 | buildActionMask = 2147483647; 365 | files = ( 366 | ); 367 | runOnlyForDeploymentPostprocessing = 0; 368 | }; 369 | CDC4ABCA80E53A42ADD002A226F06678 /* Resources */ = { 370 | isa = PBXResourcesBuildPhase; 371 | buildActionMask = 2147483647; 372 | files = ( 373 | ); 374 | runOnlyForDeploymentPostprocessing = 0; 375 | }; 376 | /* End PBXResourcesBuildPhase section */ 377 | 378 | /* Begin PBXSourcesBuildPhase section */ 379 | 1783145A03F996612F76D4E7BFA60500 /* Sources */ = { 380 | isa = PBXSourcesBuildPhase; 381 | buildActionMask = 2147483647; 382 | files = ( 383 | 6FAB0B43B1B18385CC1AE7AEEDF0B4C4 /* Pods-TactileSlider_Tests-dummy.m in Sources */, 384 | ); 385 | runOnlyForDeploymentPostprocessing = 0; 386 | }; 387 | 9B802730DFC83C9478D1494D25369503 /* Sources */ = { 388 | isa = PBXSourcesBuildPhase; 389 | buildActionMask = 2147483647; 390 | files = ( 391 | 794FC712BCE6582FD12498F13631854D /* Pods-TactileSlider_Example-dummy.m in Sources */, 392 | ); 393 | runOnlyForDeploymentPostprocessing = 0; 394 | }; 395 | C440FA3DC4C4E9EFA70A44447F30E09D /* Sources */ = { 396 | isa = PBXSourcesBuildPhase; 397 | buildActionMask = 2147483647; 398 | files = ( 399 | 5E2D461C30ED71FC7038DC5756FC5707 /* TactileSlider+UIPointerInteractionDelegate.swift in Sources */, 400 | 8EB8F7C2B74B0C759185B364C8ABE7F3 /* TactileSlider-dummy.m in Sources */, 401 | 17AC1E7DAA27C01FA0C7DA71F0810AB8 /* TactileSlider.swift in Sources */, 402 | 3ACBB581ADAA58C2D5652E0E9E0875C8 /* TactileSliderLayerRenderer.swift in Sources */, 403 | 6807F44B6194F7C69C8D685F21C456FA /* UIColor+ContrastRatio.swift in Sources */, 404 | ); 405 | runOnlyForDeploymentPostprocessing = 0; 406 | }; 407 | /* End PBXSourcesBuildPhase section */ 408 | 409 | /* Begin PBXTargetDependency section */ 410 | 8103B98623AE7B8E9F9A10507B042C4E /* PBXTargetDependency */ = { 411 | isa = PBXTargetDependency; 412 | name = TactileSlider; 413 | target = 80DEE1020F4A777B4C5B940B77991565 /* TactileSlider */; 414 | targetProxy = EE256BD9AEE49C4794F7B340FB8DCDD0 /* PBXContainerItemProxy */; 415 | }; 416 | 8C33AC72372C33B0350E938483463B8F /* PBXTargetDependency */ = { 417 | isa = PBXTargetDependency; 418 | name = "Pods-TactileSlider_Example"; 419 | target = 871DF4CDAFC65BB655C9133B3C78D951 /* Pods-TactileSlider_Example */; 420 | targetProxy = A8995654EAA74D0AF2D22F249887EB14 /* PBXContainerItemProxy */; 421 | }; 422 | /* End PBXTargetDependency section */ 423 | 424 | /* Begin XCBuildConfiguration section */ 425 | 25AD9454612BF454A1E3DC4CD4FA8C6D /* Debug */ = { 426 | isa = XCBuildConfiguration; 427 | buildSettings = { 428 | ALWAYS_SEARCH_USER_PATHS = NO; 429 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 430 | CLANG_ANALYZER_NONNULL = YES; 431 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 432 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 433 | CLANG_CXX_LIBRARY = "libc++"; 434 | CLANG_ENABLE_MODULES = YES; 435 | CLANG_ENABLE_OBJC_ARC = YES; 436 | CLANG_ENABLE_OBJC_WEAK = YES; 437 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 438 | CLANG_WARN_BOOL_CONVERSION = YES; 439 | CLANG_WARN_COMMA = YES; 440 | CLANG_WARN_CONSTANT_CONVERSION = YES; 441 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 442 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 443 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 444 | CLANG_WARN_EMPTY_BODY = YES; 445 | CLANG_WARN_ENUM_CONVERSION = YES; 446 | CLANG_WARN_INFINITE_RECURSION = YES; 447 | CLANG_WARN_INT_CONVERSION = YES; 448 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 449 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 450 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 451 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 452 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 453 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 454 | CLANG_WARN_STRICT_PROTOTYPES = YES; 455 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 456 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 457 | CLANG_WARN_UNREACHABLE_CODE = YES; 458 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 459 | COPY_PHASE_STRIP = NO; 460 | DEBUG_INFORMATION_FORMAT = dwarf; 461 | ENABLE_STRICT_OBJC_MSGSEND = YES; 462 | ENABLE_TESTABILITY = YES; 463 | GCC_C_LANGUAGE_STANDARD = gnu11; 464 | GCC_DYNAMIC_NO_PIC = NO; 465 | GCC_NO_COMMON_BLOCKS = YES; 466 | GCC_OPTIMIZATION_LEVEL = 0; 467 | GCC_PREPROCESSOR_DEFINITIONS = ( 468 | "POD_CONFIGURATION_DEBUG=1", 469 | "DEBUG=1", 470 | "$(inherited)", 471 | ); 472 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 473 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 474 | GCC_WARN_UNDECLARED_SELECTOR = YES; 475 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 476 | GCC_WARN_UNUSED_FUNCTION = YES; 477 | GCC_WARN_UNUSED_VARIABLE = YES; 478 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 479 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 480 | MTL_FAST_MATH = YES; 481 | ONLY_ACTIVE_ARCH = YES; 482 | PRODUCT_NAME = "$(TARGET_NAME)"; 483 | STRIP_INSTALLED_PRODUCT = NO; 484 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 485 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 486 | SWIFT_VERSION = 5.0; 487 | SYMROOT = "${SRCROOT}/../build"; 488 | }; 489 | name = Debug; 490 | }; 491 | 26868115B46E1E2E15ED036824468620 /* Release */ = { 492 | isa = XCBuildConfiguration; 493 | baseConfigurationReference = 059978BF2DD1D62EA77F27A792A8A555 /* TactileSlider.release.xcconfig */; 494 | buildSettings = { 495 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 496 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 497 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 498 | CURRENT_PROJECT_VERSION = 1; 499 | DEFINES_MODULE = YES; 500 | DYLIB_COMPATIBILITY_VERSION = 1; 501 | DYLIB_CURRENT_VERSION = 1; 502 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 503 | GCC_PREFIX_HEADER = "Target Support Files/TactileSlider/TactileSlider-prefix.pch"; 504 | INFOPLIST_FILE = "Target Support Files/TactileSlider/TactileSlider-Info.plist"; 505 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 506 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 507 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 508 | MODULEMAP_FILE = "Target Support Files/TactileSlider/TactileSlider.modulemap"; 509 | PRODUCT_MODULE_NAME = TactileSlider; 510 | PRODUCT_NAME = TactileSlider; 511 | SDKROOT = iphoneos; 512 | SKIP_INSTALL = YES; 513 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 514 | SWIFT_VERSION = 5.0; 515 | TARGETED_DEVICE_FAMILY = "1,2"; 516 | VALIDATE_PRODUCT = YES; 517 | VERSIONING_SYSTEM = "apple-generic"; 518 | VERSION_INFO_PREFIX = ""; 519 | }; 520 | name = Release; 521 | }; 522 | 58D3455588D2915B1A3EBE81177A6FF1 /* Debug */ = { 523 | isa = XCBuildConfiguration; 524 | baseConfigurationReference = C198D37682E9D7A8CE6AF0AD3790723E /* Pods-TactileSlider_Example.debug.xcconfig */; 525 | buildSettings = { 526 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 527 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 528 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 529 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 530 | CURRENT_PROJECT_VERSION = 1; 531 | DEFINES_MODULE = YES; 532 | DYLIB_COMPATIBILITY_VERSION = 1; 533 | DYLIB_CURRENT_VERSION = 1; 534 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 535 | INFOPLIST_FILE = "Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example-Info.plist"; 536 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 537 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 538 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 539 | MACH_O_TYPE = staticlib; 540 | MODULEMAP_FILE = "Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example.modulemap"; 541 | OTHER_LDFLAGS = ""; 542 | OTHER_LIBTOOLFLAGS = ""; 543 | PODS_ROOT = "$(SRCROOT)"; 544 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 545 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 546 | SDKROOT = iphoneos; 547 | SKIP_INSTALL = YES; 548 | TARGETED_DEVICE_FAMILY = "1,2"; 549 | VERSIONING_SYSTEM = "apple-generic"; 550 | VERSION_INFO_PREFIX = ""; 551 | }; 552 | name = Debug; 553 | }; 554 | 67B9568BF5C2CED1D86553B9D7B20886 /* Release */ = { 555 | isa = XCBuildConfiguration; 556 | baseConfigurationReference = 420140E596F57B6CB71A6F45694ED41F /* Pods-TactileSlider_Tests.release.xcconfig */; 557 | buildSettings = { 558 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 559 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 560 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 561 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 562 | CURRENT_PROJECT_VERSION = 1; 563 | DEFINES_MODULE = YES; 564 | DYLIB_COMPATIBILITY_VERSION = 1; 565 | DYLIB_CURRENT_VERSION = 1; 566 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 567 | INFOPLIST_FILE = "Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests-Info.plist"; 568 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 569 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 570 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 571 | MACH_O_TYPE = staticlib; 572 | MODULEMAP_FILE = "Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests.modulemap"; 573 | OTHER_LDFLAGS = ""; 574 | OTHER_LIBTOOLFLAGS = ""; 575 | PODS_ROOT = "$(SRCROOT)"; 576 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 577 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 578 | SDKROOT = iphoneos; 579 | SKIP_INSTALL = YES; 580 | TARGETED_DEVICE_FAMILY = "1,2"; 581 | VALIDATE_PRODUCT = YES; 582 | VERSIONING_SYSTEM = "apple-generic"; 583 | VERSION_INFO_PREFIX = ""; 584 | }; 585 | name = Release; 586 | }; 587 | 922558F8431E99A2E7AF1DCFA9CB343E /* Debug */ = { 588 | isa = XCBuildConfiguration; 589 | baseConfigurationReference = C102E697FD3C87475D4A01BBF9FD51A9 /* TactileSlider.debug.xcconfig */; 590 | buildSettings = { 591 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 592 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 593 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 594 | CURRENT_PROJECT_VERSION = 1; 595 | DEFINES_MODULE = YES; 596 | DYLIB_COMPATIBILITY_VERSION = 1; 597 | DYLIB_CURRENT_VERSION = 1; 598 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 599 | GCC_PREFIX_HEADER = "Target Support Files/TactileSlider/TactileSlider-prefix.pch"; 600 | INFOPLIST_FILE = "Target Support Files/TactileSlider/TactileSlider-Info.plist"; 601 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 602 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 603 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 604 | MODULEMAP_FILE = "Target Support Files/TactileSlider/TactileSlider.modulemap"; 605 | PRODUCT_MODULE_NAME = TactileSlider; 606 | PRODUCT_NAME = TactileSlider; 607 | SDKROOT = iphoneos; 608 | SKIP_INSTALL = YES; 609 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 610 | SWIFT_VERSION = 5.0; 611 | TARGETED_DEVICE_FAMILY = "1,2"; 612 | VERSIONING_SYSTEM = "apple-generic"; 613 | VERSION_INFO_PREFIX = ""; 614 | }; 615 | name = Debug; 616 | }; 617 | A68383C1E5DBC4DFEFFFC0EBF69FF03D /* Release */ = { 618 | isa = XCBuildConfiguration; 619 | baseConfigurationReference = E94DC7A89756EC1640B9831205261F0F /* Pods-TactileSlider_Example.release.xcconfig */; 620 | buildSettings = { 621 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 622 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 623 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 624 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 625 | CURRENT_PROJECT_VERSION = 1; 626 | DEFINES_MODULE = YES; 627 | DYLIB_COMPATIBILITY_VERSION = 1; 628 | DYLIB_CURRENT_VERSION = 1; 629 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 630 | INFOPLIST_FILE = "Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example-Info.plist"; 631 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 632 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 633 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 634 | MACH_O_TYPE = staticlib; 635 | MODULEMAP_FILE = "Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example.modulemap"; 636 | OTHER_LDFLAGS = ""; 637 | OTHER_LIBTOOLFLAGS = ""; 638 | PODS_ROOT = "$(SRCROOT)"; 639 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 640 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 641 | SDKROOT = iphoneos; 642 | SKIP_INSTALL = YES; 643 | TARGETED_DEVICE_FAMILY = "1,2"; 644 | VALIDATE_PRODUCT = YES; 645 | VERSIONING_SYSTEM = "apple-generic"; 646 | VERSION_INFO_PREFIX = ""; 647 | }; 648 | name = Release; 649 | }; 650 | B24B87E92DD451503AC78F2DDDEB1B47 /* Debug */ = { 651 | isa = XCBuildConfiguration; 652 | baseConfigurationReference = 2317EB53B535645261350739C5CBDE43 /* Pods-TactileSlider_Tests.debug.xcconfig */; 653 | buildSettings = { 654 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 655 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 656 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 657 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 658 | CURRENT_PROJECT_VERSION = 1; 659 | DEFINES_MODULE = YES; 660 | DYLIB_COMPATIBILITY_VERSION = 1; 661 | DYLIB_CURRENT_VERSION = 1; 662 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 663 | INFOPLIST_FILE = "Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests-Info.plist"; 664 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 665 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 666 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 667 | MACH_O_TYPE = staticlib; 668 | MODULEMAP_FILE = "Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests.modulemap"; 669 | OTHER_LDFLAGS = ""; 670 | OTHER_LIBTOOLFLAGS = ""; 671 | PODS_ROOT = "$(SRCROOT)"; 672 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 673 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 674 | SDKROOT = iphoneos; 675 | SKIP_INSTALL = YES; 676 | TARGETED_DEVICE_FAMILY = "1,2"; 677 | VERSIONING_SYSTEM = "apple-generic"; 678 | VERSION_INFO_PREFIX = ""; 679 | }; 680 | name = Debug; 681 | }; 682 | CA547D2C7E9A8A153DC2B27FBE00B112 /* Release */ = { 683 | isa = XCBuildConfiguration; 684 | buildSettings = { 685 | ALWAYS_SEARCH_USER_PATHS = NO; 686 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 687 | CLANG_ANALYZER_NONNULL = YES; 688 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 689 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 690 | CLANG_CXX_LIBRARY = "libc++"; 691 | CLANG_ENABLE_MODULES = YES; 692 | CLANG_ENABLE_OBJC_ARC = YES; 693 | CLANG_ENABLE_OBJC_WEAK = YES; 694 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 695 | CLANG_WARN_BOOL_CONVERSION = YES; 696 | CLANG_WARN_COMMA = YES; 697 | CLANG_WARN_CONSTANT_CONVERSION = YES; 698 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 699 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 700 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 701 | CLANG_WARN_EMPTY_BODY = YES; 702 | CLANG_WARN_ENUM_CONVERSION = YES; 703 | CLANG_WARN_INFINITE_RECURSION = YES; 704 | CLANG_WARN_INT_CONVERSION = YES; 705 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 706 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 707 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 708 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 709 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 710 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 711 | CLANG_WARN_STRICT_PROTOTYPES = YES; 712 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 713 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 714 | CLANG_WARN_UNREACHABLE_CODE = YES; 715 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 716 | COPY_PHASE_STRIP = NO; 717 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 718 | ENABLE_NS_ASSERTIONS = NO; 719 | ENABLE_STRICT_OBJC_MSGSEND = YES; 720 | GCC_C_LANGUAGE_STANDARD = gnu11; 721 | GCC_NO_COMMON_BLOCKS = YES; 722 | GCC_PREPROCESSOR_DEFINITIONS = ( 723 | "POD_CONFIGURATION_RELEASE=1", 724 | "$(inherited)", 725 | ); 726 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 727 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 728 | GCC_WARN_UNDECLARED_SELECTOR = YES; 729 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 730 | GCC_WARN_UNUSED_FUNCTION = YES; 731 | GCC_WARN_UNUSED_VARIABLE = YES; 732 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 733 | MTL_ENABLE_DEBUG_INFO = NO; 734 | MTL_FAST_MATH = YES; 735 | PRODUCT_NAME = "$(TARGET_NAME)"; 736 | STRIP_INSTALLED_PRODUCT = NO; 737 | SWIFT_COMPILATION_MODE = wholemodule; 738 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 739 | SWIFT_VERSION = 5.0; 740 | SYMROOT = "${SRCROOT}/../build"; 741 | }; 742 | name = Release; 743 | }; 744 | /* End XCBuildConfiguration section */ 745 | 746 | /* Begin XCConfigurationList section */ 747 | 3FD9F28885784BC8FF1802820E5C0DC3 /* Build configuration list for PBXNativeTarget "Pods-TactileSlider_Tests" */ = { 748 | isa = XCConfigurationList; 749 | buildConfigurations = ( 750 | B24B87E92DD451503AC78F2DDDEB1B47 /* Debug */, 751 | 67B9568BF5C2CED1D86553B9D7B20886 /* Release */, 752 | ); 753 | defaultConfigurationIsVisible = 0; 754 | defaultConfigurationName = Release; 755 | }; 756 | 42ECE660A60BF2E78677298F7E64EAFE /* Build configuration list for PBXNativeTarget "Pods-TactileSlider_Example" */ = { 757 | isa = XCConfigurationList; 758 | buildConfigurations = ( 759 | 58D3455588D2915B1A3EBE81177A6FF1 /* Debug */, 760 | A68383C1E5DBC4DFEFFFC0EBF69FF03D /* Release */, 761 | ); 762 | defaultConfigurationIsVisible = 0; 763 | defaultConfigurationName = Release; 764 | }; 765 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 766 | isa = XCConfigurationList; 767 | buildConfigurations = ( 768 | 25AD9454612BF454A1E3DC4CD4FA8C6D /* Debug */, 769 | CA547D2C7E9A8A153DC2B27FBE00B112 /* Release */, 770 | ); 771 | defaultConfigurationIsVisible = 0; 772 | defaultConfigurationName = Release; 773 | }; 774 | F0B9F1DB68CE5B4E84DAC45E4542431E /* Build configuration list for PBXNativeTarget "TactileSlider" */ = { 775 | isa = XCConfigurationList; 776 | buildConfigurations = ( 777 | 922558F8431E99A2E7AF1DCFA9CB343E /* Debug */, 778 | 26868115B46E1E2E15ED036824468620 /* Release */, 779 | ); 780 | defaultConfigurationIsVisible = 0; 781 | defaultConfigurationName = Release; 782 | }; 783 | /* End XCConfigurationList section */ 784 | }; 785 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 786 | } 787 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/TactileSlider.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## TactileSlider 5 | 6 | Copyright (c) 2020 Dale Price 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 - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2020 Dale Price <daprice@mac.com> 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 | License 38 | MIT 39 | Title 40 | TactileSlider 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_TactileSlider_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_TactileSlider_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | BCSYMBOLMAP_DIR="BCSymbolMaps" 23 | 24 | 25 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 26 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 27 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 28 | 29 | # Copies and strips a vendored framework 30 | install_framework() 31 | { 32 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 33 | local source="${BUILT_PRODUCTS_DIR}/$1" 34 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 35 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 36 | elif [ -r "$1" ]; then 37 | local source="$1" 38 | fi 39 | 40 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 41 | 42 | if [ -L "${source}" ]; then 43 | echo "Symlinked..." 44 | source="$(readlink "${source}")" 45 | fi 46 | 47 | if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then 48 | # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied 49 | find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do 50 | echo "Installing $f" 51 | install_bcsymbolmap "$f" "$destination" 52 | rm "$f" 53 | done 54 | rmdir "${source}/${BCSYMBOLMAP_DIR}" 55 | fi 56 | 57 | # Use filter instead of exclude so missing patterns don't throw errors. 58 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 59 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 60 | 61 | local basename 62 | basename="$(basename -s .framework "$1")" 63 | binary="${destination}/${basename}.framework/${basename}" 64 | 65 | if ! [ -r "$binary" ]; then 66 | binary="${destination}/${basename}" 67 | elif [ -L "${binary}" ]; then 68 | echo "Destination binary is symlinked..." 69 | dirname="$(dirname "${binary}")" 70 | binary="${dirname}/$(readlink "${binary}")" 71 | fi 72 | 73 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 74 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 75 | strip_invalid_archs "$binary" 76 | fi 77 | 78 | # Resign the code if required by the build settings to avoid unstable apps 79 | code_sign_if_enabled "${destination}/$(basename "$1")" 80 | 81 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 82 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 83 | local swift_runtime_libs 84 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 85 | for lib in $swift_runtime_libs; do 86 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 87 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 88 | code_sign_if_enabled "${destination}/${lib}" 89 | done 90 | fi 91 | } 92 | # Copies and strips a vendored dSYM 93 | install_dsym() { 94 | local source="$1" 95 | warn_missing_arch=${2:-true} 96 | if [ -r "$source" ]; then 97 | # Copy the dSYM into the targets temp dir. 98 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 99 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 100 | 101 | local basename 102 | basename="$(basename -s .dSYM "$source")" 103 | binary_name="$(ls "$source/Contents/Resources/DWARF")" 104 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" 105 | 106 | # Strip invalid architectures from the dSYM. 107 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 108 | strip_invalid_archs "$binary" "$warn_missing_arch" 109 | fi 110 | if [[ $STRIP_BINARY_RETVAL == 0 ]]; then 111 | # Move the stripped file into its final destination. 112 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 113 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 114 | else 115 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 116 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" 117 | fi 118 | fi 119 | } 120 | 121 | # Used as a return value for each invocation of `strip_invalid_archs` function. 122 | STRIP_BINARY_RETVAL=0 123 | 124 | # Strip invalid architectures 125 | strip_invalid_archs() { 126 | binary="$1" 127 | warn_missing_arch=${2:-true} 128 | # Get architectures for current target binary 129 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 130 | # Intersect them with the architectures we are building for 131 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 132 | # If there are no archs supported by this binary then warn the user 133 | if [[ -z "$intersected_archs" ]]; then 134 | if [[ "$warn_missing_arch" == "true" ]]; then 135 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 136 | fi 137 | STRIP_BINARY_RETVAL=1 138 | return 139 | fi 140 | stripped="" 141 | for arch in $binary_archs; do 142 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 143 | # Strip non-valid architectures in-place 144 | lipo -remove "$arch" -output "$binary" "$binary" 145 | stripped="$stripped $arch" 146 | fi 147 | done 148 | if [[ "$stripped" ]]; then 149 | echo "Stripped $binary of architectures:$stripped" 150 | fi 151 | STRIP_BINARY_RETVAL=0 152 | } 153 | 154 | # Copies the bcsymbolmap files of a vendored framework 155 | install_bcsymbolmap() { 156 | local bcsymbolmap_path="$1" 157 | local destination="${BUILT_PRODUCTS_DIR}" 158 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 159 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 160 | } 161 | 162 | # Signs a framework with the provided identity 163 | code_sign_if_enabled() { 164 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 165 | # Use the current code_sign_identity 166 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 167 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 168 | 169 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 170 | code_sign_cmd="$code_sign_cmd &" 171 | fi 172 | echo "$code_sign_cmd" 173 | eval "$code_sign_cmd" 174 | fi 175 | } 176 | 177 | if [[ "$CONFIGURATION" == "Debug" ]]; then 178 | install_framework "${BUILT_PRODUCTS_DIR}/TactileSlider/TactileSlider.framework" 179 | fi 180 | if [[ "$CONFIGURATION" == "Release" ]]; then 181 | install_framework "${BUILT_PRODUCTS_DIR}/TactileSlider/TactileSlider.framework" 182 | fi 183 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 184 | wait 185 | fi 186 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then 7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # resources to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 13 | 14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 15 | > "$RESOURCES_TO_COPY" 16 | 17 | XCASSET_FILES=() 18 | 19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 22 | 23 | case "${TARGETED_DEVICE_FAMILY:-}" in 24 | 1,2) 25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 26 | ;; 27 | 1) 28 | TARGET_DEVICE_ARGS="--target-device iphone" 29 | ;; 30 | 2) 31 | TARGET_DEVICE_ARGS="--target-device ipad" 32 | ;; 33 | 3) 34 | TARGET_DEVICE_ARGS="--target-device tv" 35 | ;; 36 | 4) 37 | TARGET_DEVICE_ARGS="--target-device watch" 38 | ;; 39 | *) 40 | TARGET_DEVICE_ARGS="--target-device mac" 41 | ;; 42 | esac 43 | 44 | install_resource() 45 | { 46 | if [[ "$1" = /* ]] ; then 47 | RESOURCE_PATH="$1" 48 | else 49 | RESOURCE_PATH="${PODS_ROOT}/$1" 50 | fi 51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 52 | cat << EOM 53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 54 | EOM 55 | exit 1 56 | fi 57 | case $RESOURCE_PATH in 58 | *.storyboard) 59 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 60 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 61 | ;; 62 | *.xib) 63 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 64 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 65 | ;; 66 | *.framework) 67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 71 | ;; 72 | *.xcdatamodel) 73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 75 | ;; 76 | *.xcdatamodeld) 77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 79 | ;; 80 | *.xcmappingmodel) 81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 83 | ;; 84 | *.xcassets) 85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 87 | ;; 88 | *) 89 | echo "$RESOURCE_PATH" || true 90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 91 | ;; 92 | esac 93 | } 94 | 95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] 104 | then 105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 107 | while read line; do 108 | if [[ $line != "${PODS_ROOT}*" ]]; then 109 | XCASSET_FILES+=("$line") 110 | fi 111 | done <<<"$OTHER_XCASSETS" 112 | 113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then 114 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 115 | else 116 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" 117 | fi 118 | fi 119 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_TactileSlider_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_TactileSlider_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/TactileSlider" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/TactileSlider/TactileSlider.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | OTHER_LDFLAGS = $(inherited) -framework "TactileSlider" -framework "UIKit" 8 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 9 | PODS_BUILD_DIR = ${BUILD_DIR} 10 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 11 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 12 | PODS_ROOT = ${SRCROOT}/Pods 13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_TactileSlider_Example { 2 | umbrella header "Pods-TactileSlider_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/TactileSlider" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/TactileSlider/TactileSlider.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | OTHER_LDFLAGS = $(inherited) -framework "TactileSlider" -framework "UIKit" 8 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 9 | PODS_BUILD_DIR = ${BUILD_DIR} 10 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 11 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 12 | PODS_ROOT = ${SRCROOT}/Pods 13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_TactileSlider_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_TactileSlider_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 7 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # frameworks to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 13 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 14 | 15 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 16 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 17 | 18 | # Used as a return value for each invocation of `strip_invalid_archs` function. 19 | STRIP_BINARY_RETVAL=0 20 | 21 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 22 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 23 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 24 | 25 | # Copies and strips a vendored framework 26 | install_framework() 27 | { 28 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 29 | local source="${BUILT_PRODUCTS_DIR}/$1" 30 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 31 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 32 | elif [ -r "$1" ]; then 33 | local source="$1" 34 | fi 35 | 36 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 37 | 38 | if [ -L "${source}" ]; then 39 | echo "Symlinked..." 40 | source="$(readlink "${source}")" 41 | fi 42 | 43 | # Use filter instead of exclude so missing patterns don't throw errors. 44 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 45 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 46 | 47 | local basename 48 | basename="$(basename -s .framework "$1")" 49 | binary="${destination}/${basename}.framework/${basename}" 50 | if ! [ -r "$binary" ]; then 51 | binary="${destination}/${basename}" 52 | fi 53 | 54 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 55 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 56 | strip_invalid_archs "$binary" 57 | fi 58 | 59 | # Resign the code if required by the build settings to avoid unstable apps 60 | code_sign_if_enabled "${destination}/$(basename "$1")" 61 | 62 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 63 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 64 | local swift_runtime_libs 65 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 66 | for lib in $swift_runtime_libs; do 67 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 68 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 69 | code_sign_if_enabled "${destination}/${lib}" 70 | done 71 | fi 72 | } 73 | 74 | # Copies and strips a vendored dSYM 75 | install_dsym() { 76 | local source="$1" 77 | if [ -r "$source" ]; then 78 | # Copy the dSYM into a the targets temp dir. 79 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 80 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 81 | 82 | local basename 83 | basename="$(basename -s .framework.dSYM "$source")" 84 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 85 | 86 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 87 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 88 | strip_invalid_archs "$binary" 89 | fi 90 | 91 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 92 | # Move the stripped file into its final destination. 93 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 94 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 95 | else 96 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 97 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 98 | fi 99 | fi 100 | } 101 | 102 | # Signs a framework with the provided identity 103 | code_sign_if_enabled() { 104 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 105 | # Use the current code_sign_identitiy 106 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 107 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 108 | 109 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 110 | code_sign_cmd="$code_sign_cmd &" 111 | fi 112 | echo "$code_sign_cmd" 113 | eval "$code_sign_cmd" 114 | fi 115 | } 116 | 117 | # Strip invalid architectures 118 | strip_invalid_archs() { 119 | binary="$1" 120 | # Get architectures for current target binary 121 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 122 | # Intersect them with the architectures we are building for 123 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 124 | # If there are no archs supported by this binary then warn the user 125 | if [[ -z "$intersected_archs" ]]; then 126 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 127 | STRIP_BINARY_RETVAL=0 128 | return 129 | fi 130 | stripped="" 131 | for arch in $binary_archs; do 132 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 133 | # Strip non-valid architectures in-place 134 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 135 | stripped="$stripped $arch" 136 | fi 137 | done 138 | if [[ "$stripped" ]]; then 139 | echo "Stripped $binary of architectures:$stripped" 140 | fi 141 | STRIP_BINARY_RETVAL=1 142 | } 143 | 144 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 145 | wait 146 | fi 147 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then 7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # resources to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 13 | 14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 15 | > "$RESOURCES_TO_COPY" 16 | 17 | XCASSET_FILES=() 18 | 19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 22 | 23 | case "${TARGETED_DEVICE_FAMILY:-}" in 24 | 1,2) 25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 26 | ;; 27 | 1) 28 | TARGET_DEVICE_ARGS="--target-device iphone" 29 | ;; 30 | 2) 31 | TARGET_DEVICE_ARGS="--target-device ipad" 32 | ;; 33 | 3) 34 | TARGET_DEVICE_ARGS="--target-device tv" 35 | ;; 36 | 4) 37 | TARGET_DEVICE_ARGS="--target-device watch" 38 | ;; 39 | *) 40 | TARGET_DEVICE_ARGS="--target-device mac" 41 | ;; 42 | esac 43 | 44 | install_resource() 45 | { 46 | if [[ "$1" = /* ]] ; then 47 | RESOURCE_PATH="$1" 48 | else 49 | RESOURCE_PATH="${PODS_ROOT}/$1" 50 | fi 51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 52 | cat << EOM 53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 54 | EOM 55 | exit 1 56 | fi 57 | case $RESOURCE_PATH in 58 | *.storyboard) 59 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 60 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 61 | ;; 62 | *.xib) 63 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 64 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 65 | ;; 66 | *.framework) 67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 71 | ;; 72 | *.xcdatamodel) 73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 75 | ;; 76 | *.xcdatamodeld) 77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 79 | ;; 80 | *.xcmappingmodel) 81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 83 | ;; 84 | *.xcassets) 85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 87 | ;; 88 | *) 89 | echo "$RESOURCE_PATH" || true 90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 91 | ;; 92 | esac 93 | } 94 | 95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] 104 | then 105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 107 | while read line; do 108 | if [[ $line != "${PODS_ROOT}*" ]]; then 109 | XCASSET_FILES+=("$line") 110 | fi 111 | done <<<"$OTHER_XCASSETS" 112 | 113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then 114 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 115 | else 116 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" 117 | fi 118 | fi 119 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_TactileSlider_TestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_TactileSlider_TestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/TactileSlider" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/TactileSlider/TactileSlider.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "TactileSlider" -framework "UIKit" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_TactileSlider_Tests { 2 | umbrella header "Pods-TactileSlider_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/TactileSlider" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/TactileSlider/TactileSlider.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "TactileSlider" -framework "UIKit" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TactileSlider/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TactileSlider/TactileSlider-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 3.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TactileSlider/TactileSlider-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_TactileSlider : NSObject 3 | @end 4 | @implementation PodsDummy_TactileSlider 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TactileSlider/TactileSlider-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TactileSlider/TactileSlider-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double TactileSliderVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char TactileSliderVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TactileSlider/TactileSlider.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/TactileSlider 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | OTHER_LDFLAGS = $(inherited) -framework "UIKit" 5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 12 | SKIP_INSTALL = YES 13 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 14 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TactileSlider/TactileSlider.modulemap: -------------------------------------------------------------------------------- 1 | framework module TactileSlider { 2 | umbrella header "TactileSlider-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TactileSlider/TactileSlider.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/TactileSlider 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | OTHER_LDFLAGS = $(inherited) -framework "UIKit" 5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 12 | SKIP_INSTALL = YES 13 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 14 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TactileSlider/TactileSlider.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/TactileSlider 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Example/TactileSlider.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 297932F81D3B3ABCE08EAC8A /* Pods_TactileSlider_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D835D1B0037234BC4BE7EC7F /* Pods_TactileSlider_Tests.framework */; }; 11 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 12 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 13 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 14 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 15 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 16 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; 17 | C7B69CC9C8A67ECD336E3CBD /* Pods_TactileSlider_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 684E25AB1CB5640E45D95103 /* Pods_TactileSlider_Example.framework */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = 607FACC81AFB9204008FA782 /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = 607FACCF1AFB9204008FA782; 26 | remoteInfo = TactileSlider; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 38277B12592879D2A1EECE43 /* Pods-TactileSlider_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TactileSlider_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example.release.xcconfig"; sourceTree = ""; }; 32 | 607FACD01AFB9204008FA782 /* TactileSlider_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TactileSlider_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 34 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 35 | 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 36 | 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 37 | 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 38 | 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 39 | 607FACE51AFB9204008FA782 /* TactileSlider_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TactileSlider_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 41 | 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; 42 | 684E25AB1CB5640E45D95103 /* Pods_TactileSlider_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TactileSlider_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 7A14141FBA53E1D636776910 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 44 | 930142F5D3592F4F04C9DE8C /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 45 | 9EAE8FCF56FC15C7B40C0E4A /* TactileSlider.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = TactileSlider.podspec; path = ../TactileSlider.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 46 | CE04875C79D4058559379131 /* Pods-TactileSlider_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TactileSlider_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests.release.xcconfig"; sourceTree = ""; }; 47 | D835D1B0037234BC4BE7EC7F /* Pods_TactileSlider_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TactileSlider_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | DC59FFBE2E41351BAC77C116 /* Pods-TactileSlider_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TactileSlider_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example.debug.xcconfig"; sourceTree = ""; }; 49 | F565835CEFC0BFEE0752BD9C /* Pods-TactileSlider_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TactileSlider_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TactileSlider_Tests/Pods-TactileSlider_Tests.debug.xcconfig"; sourceTree = ""; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | 607FACCD1AFB9204008FA782 /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | C7B69CC9C8A67ECD336E3CBD /* Pods_TactileSlider_Example.framework in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | 607FACE21AFB9204008FA782 /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | 297932F81D3B3ABCE08EAC8A /* Pods_TactileSlider_Tests.framework in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXFrameworksBuildPhase section */ 70 | 71 | /* Begin PBXGroup section */ 72 | 607FACC71AFB9204008FA782 = { 73 | isa = PBXGroup; 74 | children = ( 75 | 607FACF51AFB993E008FA782 /* Podspec Metadata */, 76 | 607FACD21AFB9204008FA782 /* Example for TactileSlider */, 77 | 607FACE81AFB9204008FA782 /* Tests */, 78 | 607FACD11AFB9204008FA782 /* Products */, 79 | C61F4A5CB1CBABEE3038C813 /* Pods */, 80 | 92B2F4A72C003F3F86706EE5 /* Frameworks */, 81 | ); 82 | sourceTree = ""; 83 | }; 84 | 607FACD11AFB9204008FA782 /* Products */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 607FACD01AFB9204008FA782 /* TactileSlider_Example.app */, 88 | 607FACE51AFB9204008FA782 /* TactileSlider_Tests.xctest */, 89 | ); 90 | name = Products; 91 | sourceTree = ""; 92 | }; 93 | 607FACD21AFB9204008FA782 /* Example for TactileSlider */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */, 97 | 607FACD71AFB9204008FA782 /* ViewController.swift */, 98 | 607FACD91AFB9204008FA782 /* Main.storyboard */, 99 | 607FACDC1AFB9204008FA782 /* Images.xcassets */, 100 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, 101 | 607FACD31AFB9204008FA782 /* Supporting Files */, 102 | ); 103 | name = "Example for TactileSlider"; 104 | path = TactileSlider; 105 | sourceTree = ""; 106 | }; 107 | 607FACD31AFB9204008FA782 /* Supporting Files */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 607FACD41AFB9204008FA782 /* Info.plist */, 111 | ); 112 | name = "Supporting Files"; 113 | sourceTree = ""; 114 | }; 115 | 607FACE81AFB9204008FA782 /* Tests */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | 607FACEB1AFB9204008FA782 /* Tests.swift */, 119 | 607FACE91AFB9204008FA782 /* Supporting Files */, 120 | ); 121 | path = Tests; 122 | sourceTree = ""; 123 | }; 124 | 607FACE91AFB9204008FA782 /* Supporting Files */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 607FACEA1AFB9204008FA782 /* Info.plist */, 128 | ); 129 | name = "Supporting Files"; 130 | sourceTree = ""; 131 | }; 132 | 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { 133 | isa = PBXGroup; 134 | children = ( 135 | 9EAE8FCF56FC15C7B40C0E4A /* TactileSlider.podspec */, 136 | 930142F5D3592F4F04C9DE8C /* README.md */, 137 | 7A14141FBA53E1D636776910 /* LICENSE */, 138 | ); 139 | name = "Podspec Metadata"; 140 | sourceTree = ""; 141 | }; 142 | 92B2F4A72C003F3F86706EE5 /* Frameworks */ = { 143 | isa = PBXGroup; 144 | children = ( 145 | 684E25AB1CB5640E45D95103 /* Pods_TactileSlider_Example.framework */, 146 | D835D1B0037234BC4BE7EC7F /* Pods_TactileSlider_Tests.framework */, 147 | ); 148 | name = Frameworks; 149 | sourceTree = ""; 150 | }; 151 | C61F4A5CB1CBABEE3038C813 /* Pods */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | DC59FFBE2E41351BAC77C116 /* Pods-TactileSlider_Example.debug.xcconfig */, 155 | 38277B12592879D2A1EECE43 /* Pods-TactileSlider_Example.release.xcconfig */, 156 | F565835CEFC0BFEE0752BD9C /* Pods-TactileSlider_Tests.debug.xcconfig */, 157 | CE04875C79D4058559379131 /* Pods-TactileSlider_Tests.release.xcconfig */, 158 | ); 159 | name = Pods; 160 | sourceTree = ""; 161 | }; 162 | /* End PBXGroup section */ 163 | 164 | /* Begin PBXNativeTarget section */ 165 | 607FACCF1AFB9204008FA782 /* TactileSlider_Example */ = { 166 | isa = PBXNativeTarget; 167 | buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "TactileSlider_Example" */; 168 | buildPhases = ( 169 | 4868E0C4250241CE0A59ED50 /* [CP] Check Pods Manifest.lock */, 170 | 607FACCC1AFB9204008FA782 /* Sources */, 171 | 607FACCD1AFB9204008FA782 /* Frameworks */, 172 | 607FACCE1AFB9204008FA782 /* Resources */, 173 | E95A6903D28F6DC411B244CE /* [CP] Embed Pods Frameworks */, 174 | ); 175 | buildRules = ( 176 | ); 177 | dependencies = ( 178 | ); 179 | name = TactileSlider_Example; 180 | productName = TactileSlider; 181 | productReference = 607FACD01AFB9204008FA782 /* TactileSlider_Example.app */; 182 | productType = "com.apple.product-type.application"; 183 | }; 184 | 607FACE41AFB9204008FA782 /* TactileSlider_Tests */ = { 185 | isa = PBXNativeTarget; 186 | buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "TactileSlider_Tests" */; 187 | buildPhases = ( 188 | BCF7971A50792562FDF83793 /* [CP] Check Pods Manifest.lock */, 189 | 607FACE11AFB9204008FA782 /* Sources */, 190 | 607FACE21AFB9204008FA782 /* Frameworks */, 191 | 607FACE31AFB9204008FA782 /* Resources */, 192 | ); 193 | buildRules = ( 194 | ); 195 | dependencies = ( 196 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */, 197 | ); 198 | name = TactileSlider_Tests; 199 | productName = Tests; 200 | productReference = 607FACE51AFB9204008FA782 /* TactileSlider_Tests.xctest */; 201 | productType = "com.apple.product-type.bundle.unit-test"; 202 | }; 203 | /* End PBXNativeTarget section */ 204 | 205 | /* Begin PBXProject section */ 206 | 607FACC81AFB9204008FA782 /* Project object */ = { 207 | isa = PBXProject; 208 | attributes = { 209 | LastSwiftUpdateCheck = 0830; 210 | LastUpgradeCheck = 1250; 211 | ORGANIZATIONNAME = CocoaPods; 212 | TargetAttributes = { 213 | 607FACCF1AFB9204008FA782 = { 214 | CreatedOnToolsVersion = 6.3.1; 215 | LastSwiftMigration = 1140; 216 | }; 217 | 607FACE41AFB9204008FA782 = { 218 | CreatedOnToolsVersion = 6.3.1; 219 | LastSwiftMigration = 1140; 220 | TestTargetID = 607FACCF1AFB9204008FA782; 221 | }; 222 | }; 223 | }; 224 | buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "TactileSlider" */; 225 | compatibilityVersion = "Xcode 3.2"; 226 | developmentRegion = en; 227 | hasScannedForEncodings = 0; 228 | knownRegions = ( 229 | en, 230 | Base, 231 | ); 232 | mainGroup = 607FACC71AFB9204008FA782; 233 | productRefGroup = 607FACD11AFB9204008FA782 /* Products */; 234 | projectDirPath = ""; 235 | projectRoot = ""; 236 | targets = ( 237 | 607FACCF1AFB9204008FA782 /* TactileSlider_Example */, 238 | 607FACE41AFB9204008FA782 /* TactileSlider_Tests */, 239 | ); 240 | }; 241 | /* End PBXProject section */ 242 | 243 | /* Begin PBXResourcesBuildPhase section */ 244 | 607FACCE1AFB9204008FA782 /* Resources */ = { 245 | isa = PBXResourcesBuildPhase; 246 | buildActionMask = 2147483647; 247 | files = ( 248 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, 249 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, 250 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, 251 | ); 252 | runOnlyForDeploymentPostprocessing = 0; 253 | }; 254 | 607FACE31AFB9204008FA782 /* Resources */ = { 255 | isa = PBXResourcesBuildPhase; 256 | buildActionMask = 2147483647; 257 | files = ( 258 | ); 259 | runOnlyForDeploymentPostprocessing = 0; 260 | }; 261 | /* End PBXResourcesBuildPhase section */ 262 | 263 | /* Begin PBXShellScriptBuildPhase section */ 264 | 4868E0C4250241CE0A59ED50 /* [CP] Check Pods Manifest.lock */ = { 265 | isa = PBXShellScriptBuildPhase; 266 | buildActionMask = 2147483647; 267 | files = ( 268 | ); 269 | inputFileListPaths = ( 270 | ); 271 | inputPaths = ( 272 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 273 | "${PODS_ROOT}/Manifest.lock", 274 | ); 275 | name = "[CP] Check Pods Manifest.lock"; 276 | outputFileListPaths = ( 277 | ); 278 | outputPaths = ( 279 | "$(DERIVED_FILE_DIR)/Pods-TactileSlider_Example-checkManifestLockResult.txt", 280 | ); 281 | runOnlyForDeploymentPostprocessing = 0; 282 | shellPath = /bin/sh; 283 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 284 | showEnvVarsInLog = 0; 285 | }; 286 | BCF7971A50792562FDF83793 /* [CP] Check Pods Manifest.lock */ = { 287 | isa = PBXShellScriptBuildPhase; 288 | buildActionMask = 2147483647; 289 | files = ( 290 | ); 291 | inputFileListPaths = ( 292 | ); 293 | inputPaths = ( 294 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 295 | "${PODS_ROOT}/Manifest.lock", 296 | ); 297 | name = "[CP] Check Pods Manifest.lock"; 298 | outputFileListPaths = ( 299 | ); 300 | outputPaths = ( 301 | "$(DERIVED_FILE_DIR)/Pods-TactileSlider_Tests-checkManifestLockResult.txt", 302 | ); 303 | runOnlyForDeploymentPostprocessing = 0; 304 | shellPath = /bin/sh; 305 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 306 | showEnvVarsInLog = 0; 307 | }; 308 | E95A6903D28F6DC411B244CE /* [CP] Embed Pods Frameworks */ = { 309 | isa = PBXShellScriptBuildPhase; 310 | buildActionMask = 2147483647; 311 | files = ( 312 | ); 313 | inputPaths = ( 314 | "${PODS_ROOT}/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example-frameworks.sh", 315 | "${BUILT_PRODUCTS_DIR}/TactileSlider/TactileSlider.framework", 316 | ); 317 | name = "[CP] Embed Pods Frameworks"; 318 | outputPaths = ( 319 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TactileSlider.framework", 320 | ); 321 | runOnlyForDeploymentPostprocessing = 0; 322 | shellPath = /bin/sh; 323 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-TactileSlider_Example/Pods-TactileSlider_Example-frameworks.sh\"\n"; 324 | showEnvVarsInLog = 0; 325 | }; 326 | /* End PBXShellScriptBuildPhase section */ 327 | 328 | /* Begin PBXSourcesBuildPhase section */ 329 | 607FACCC1AFB9204008FA782 /* Sources */ = { 330 | isa = PBXSourcesBuildPhase; 331 | buildActionMask = 2147483647; 332 | files = ( 333 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, 334 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, 335 | ); 336 | runOnlyForDeploymentPostprocessing = 0; 337 | }; 338 | 607FACE11AFB9204008FA782 /* Sources */ = { 339 | isa = PBXSourcesBuildPhase; 340 | buildActionMask = 2147483647; 341 | files = ( 342 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, 343 | ); 344 | runOnlyForDeploymentPostprocessing = 0; 345 | }; 346 | /* End PBXSourcesBuildPhase section */ 347 | 348 | /* Begin PBXTargetDependency section */ 349 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { 350 | isa = PBXTargetDependency; 351 | target = 607FACCF1AFB9204008FA782 /* TactileSlider_Example */; 352 | targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; 353 | }; 354 | /* End PBXTargetDependency section */ 355 | 356 | /* Begin PBXVariantGroup section */ 357 | 607FACD91AFB9204008FA782 /* Main.storyboard */ = { 358 | isa = PBXVariantGroup; 359 | children = ( 360 | 607FACDA1AFB9204008FA782 /* Base */, 361 | ); 362 | name = Main.storyboard; 363 | sourceTree = ""; 364 | }; 365 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { 366 | isa = PBXVariantGroup; 367 | children = ( 368 | 607FACDF1AFB9204008FA782 /* Base */, 369 | ); 370 | name = LaunchScreen.xib; 371 | sourceTree = ""; 372 | }; 373 | /* End PBXVariantGroup section */ 374 | 375 | /* Begin XCBuildConfiguration section */ 376 | 607FACED1AFB9204008FA782 /* Debug */ = { 377 | isa = XCBuildConfiguration; 378 | buildSettings = { 379 | ALWAYS_SEARCH_USER_PATHS = NO; 380 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 381 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 382 | CLANG_CXX_LIBRARY = "libc++"; 383 | CLANG_ENABLE_MODULES = YES; 384 | CLANG_ENABLE_OBJC_ARC = YES; 385 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 386 | CLANG_WARN_BOOL_CONVERSION = YES; 387 | CLANG_WARN_COMMA = YES; 388 | CLANG_WARN_CONSTANT_CONVERSION = YES; 389 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 390 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 391 | CLANG_WARN_EMPTY_BODY = YES; 392 | CLANG_WARN_ENUM_CONVERSION = YES; 393 | CLANG_WARN_INFINITE_RECURSION = YES; 394 | CLANG_WARN_INT_CONVERSION = YES; 395 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 396 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 397 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 398 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 399 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 400 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 401 | CLANG_WARN_STRICT_PROTOTYPES = YES; 402 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 403 | CLANG_WARN_UNREACHABLE_CODE = YES; 404 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 405 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 406 | COPY_PHASE_STRIP = NO; 407 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 408 | ENABLE_STRICT_OBJC_MSGSEND = YES; 409 | ENABLE_TESTABILITY = YES; 410 | GCC_C_LANGUAGE_STANDARD = gnu99; 411 | GCC_DYNAMIC_NO_PIC = NO; 412 | GCC_NO_COMMON_BLOCKS = YES; 413 | GCC_OPTIMIZATION_LEVEL = 0; 414 | GCC_PREPROCESSOR_DEFINITIONS = ( 415 | "DEBUG=1", 416 | "$(inherited)", 417 | ); 418 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 419 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 420 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 421 | GCC_WARN_UNDECLARED_SELECTOR = YES; 422 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 423 | GCC_WARN_UNUSED_FUNCTION = YES; 424 | GCC_WARN_UNUSED_VARIABLE = YES; 425 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 426 | MTL_ENABLE_DEBUG_INFO = YES; 427 | ONLY_ACTIVE_ARCH = YES; 428 | SDKROOT = iphoneos; 429 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 430 | TARGETED_DEVICE_FAMILY = "1,2"; 431 | }; 432 | name = Debug; 433 | }; 434 | 607FACEE1AFB9204008FA782 /* Release */ = { 435 | isa = XCBuildConfiguration; 436 | buildSettings = { 437 | ALWAYS_SEARCH_USER_PATHS = NO; 438 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 439 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 440 | CLANG_CXX_LIBRARY = "libc++"; 441 | CLANG_ENABLE_MODULES = YES; 442 | CLANG_ENABLE_OBJC_ARC = YES; 443 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 444 | CLANG_WARN_BOOL_CONVERSION = YES; 445 | CLANG_WARN_COMMA = YES; 446 | CLANG_WARN_CONSTANT_CONVERSION = YES; 447 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 448 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 449 | CLANG_WARN_EMPTY_BODY = YES; 450 | CLANG_WARN_ENUM_CONVERSION = YES; 451 | CLANG_WARN_INFINITE_RECURSION = YES; 452 | CLANG_WARN_INT_CONVERSION = YES; 453 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 454 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 455 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 456 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 457 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 458 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 459 | CLANG_WARN_STRICT_PROTOTYPES = YES; 460 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 461 | CLANG_WARN_UNREACHABLE_CODE = YES; 462 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 463 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 464 | COPY_PHASE_STRIP = NO; 465 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 466 | ENABLE_NS_ASSERTIONS = NO; 467 | ENABLE_STRICT_OBJC_MSGSEND = YES; 468 | GCC_C_LANGUAGE_STANDARD = gnu99; 469 | GCC_NO_COMMON_BLOCKS = YES; 470 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 471 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 472 | GCC_WARN_UNDECLARED_SELECTOR = YES; 473 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 474 | GCC_WARN_UNUSED_FUNCTION = YES; 475 | GCC_WARN_UNUSED_VARIABLE = YES; 476 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 477 | MTL_ENABLE_DEBUG_INFO = NO; 478 | SDKROOT = iphoneos; 479 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 480 | TARGETED_DEVICE_FAMILY = "1,2"; 481 | VALIDATE_PRODUCT = YES; 482 | }; 483 | name = Release; 484 | }; 485 | 607FACF01AFB9204008FA782 /* Debug */ = { 486 | isa = XCBuildConfiguration; 487 | baseConfigurationReference = DC59FFBE2E41351BAC77C116 /* Pods-TactileSlider_Example.debug.xcconfig */; 488 | buildSettings = { 489 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 490 | INFOPLIST_FILE = TactileSlider/Info.plist; 491 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 492 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 493 | MODULE_NAME = ExampleApp; 494 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 495 | PRODUCT_NAME = "$(TARGET_NAME)"; 496 | SWIFT_VERSION = 5.0; 497 | TARGETED_DEVICE_FAMILY = "1,2"; 498 | }; 499 | name = Debug; 500 | }; 501 | 607FACF11AFB9204008FA782 /* Release */ = { 502 | isa = XCBuildConfiguration; 503 | baseConfigurationReference = 38277B12592879D2A1EECE43 /* Pods-TactileSlider_Example.release.xcconfig */; 504 | buildSettings = { 505 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 506 | INFOPLIST_FILE = TactileSlider/Info.plist; 507 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 508 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 509 | MODULE_NAME = ExampleApp; 510 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 511 | PRODUCT_NAME = "$(TARGET_NAME)"; 512 | SWIFT_VERSION = 5.0; 513 | TARGETED_DEVICE_FAMILY = "1,2"; 514 | }; 515 | name = Release; 516 | }; 517 | 607FACF31AFB9204008FA782 /* Debug */ = { 518 | isa = XCBuildConfiguration; 519 | baseConfigurationReference = F565835CEFC0BFEE0752BD9C /* Pods-TactileSlider_Tests.debug.xcconfig */; 520 | buildSettings = { 521 | FRAMEWORK_SEARCH_PATHS = ( 522 | "$(SDKROOT)/Developer/Library/Frameworks", 523 | "$(inherited)", 524 | ); 525 | GCC_PREPROCESSOR_DEFINITIONS = ( 526 | "DEBUG=1", 527 | "$(inherited)", 528 | ); 529 | INFOPLIST_FILE = Tests/Info.plist; 530 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 531 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 532 | PRODUCT_NAME = "$(TARGET_NAME)"; 533 | SWIFT_VERSION = 5.0; 534 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TactileSlider_Example.app/TactileSlider_Example"; 535 | }; 536 | name = Debug; 537 | }; 538 | 607FACF41AFB9204008FA782 /* Release */ = { 539 | isa = XCBuildConfiguration; 540 | baseConfigurationReference = CE04875C79D4058559379131 /* Pods-TactileSlider_Tests.release.xcconfig */; 541 | buildSettings = { 542 | FRAMEWORK_SEARCH_PATHS = ( 543 | "$(SDKROOT)/Developer/Library/Frameworks", 544 | "$(inherited)", 545 | ); 546 | INFOPLIST_FILE = Tests/Info.plist; 547 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 548 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 549 | PRODUCT_NAME = "$(TARGET_NAME)"; 550 | SWIFT_VERSION = 5.0; 551 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TactileSlider_Example.app/TactileSlider_Example"; 552 | }; 553 | name = Release; 554 | }; 555 | /* End XCBuildConfiguration section */ 556 | 557 | /* Begin XCConfigurationList section */ 558 | 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "TactileSlider" */ = { 559 | isa = XCConfigurationList; 560 | buildConfigurations = ( 561 | 607FACED1AFB9204008FA782 /* Debug */, 562 | 607FACEE1AFB9204008FA782 /* Release */, 563 | ); 564 | defaultConfigurationIsVisible = 0; 565 | defaultConfigurationName = Release; 566 | }; 567 | 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "TactileSlider_Example" */ = { 568 | isa = XCConfigurationList; 569 | buildConfigurations = ( 570 | 607FACF01AFB9204008FA782 /* Debug */, 571 | 607FACF11AFB9204008FA782 /* Release */, 572 | ); 573 | defaultConfigurationIsVisible = 0; 574 | defaultConfigurationName = Release; 575 | }; 576 | 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "TactileSlider_Tests" */ = { 577 | isa = XCConfigurationList; 578 | buildConfigurations = ( 579 | 607FACF31AFB9204008FA782 /* Debug */, 580 | 607FACF41AFB9204008FA782 /* Release */, 581 | ); 582 | defaultConfigurationIsVisible = 0; 583 | defaultConfigurationName = Release; 584 | }; 585 | /* End XCConfigurationList section */ 586 | }; 587 | rootObject = 607FACC81AFB9204008FA782 /* Project object */; 588 | } 589 | -------------------------------------------------------------------------------- /Example/TactileSlider.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/TactileSlider.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/TactileSlider.xcodeproj/xcshareddata/xcschemes/TactileSlider-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 51 | 52 | 53 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 76 | 78 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /Example/TactileSlider.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Example/TactileSlider.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/TactileSlider/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // TactileSlider 4 | // 5 | // Created by daprice on 01/22/2019. 6 | // Copyright (c) 2019 daprice. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // 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. 24 | // 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. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // 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. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // 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. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // 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. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /Example/TactileSlider/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/TactileSlider/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 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /Example/TactileSlider/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "size" : "1024x1024", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Example/TactileSlider/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UIApplicationSupportsIndirectInputEvents 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | UIInterfaceOrientationLandscapeRight 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /Example/TactileSlider/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // TactileSlider 4 | // 5 | // Created by daprice on 01/22/2019. 6 | // Copyright (c) 2019 daprice. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import TactileSlider 11 | 12 | class ViewController: UIViewController { 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | // Do any additional setup after loading the view, typically from a nib. 17 | 18 | if #available(iOS 13, *) { 19 | self.view.backgroundColor = UIColor.systemBackground 20 | } else { 21 | self.view.backgroundColor = UIColor.white 22 | } 23 | } 24 | 25 | override func didReceiveMemoryWarning() { 26 | super.didReceiveMemoryWarning() 27 | // Dispose of any resources that can be recreated. 28 | } 29 | 30 | } 31 | 32 | -------------------------------------------------------------------------------- /Example/Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Tests/Tests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import TactileSlider 3 | 4 | class Tests: XCTestCase { 5 | 6 | override func setUp() { 7 | super.setUp() 8 | // Put setup code here. This method is called before the invocation of each test method in the class. 9 | } 10 | 11 | override func tearDown() { 12 | // Put teardown code here. This method is called after the invocation of each test method in the class. 13 | super.tearDown() 14 | } 15 | 16 | func testExample() { 17 | // This is an example of a functional test case. 18 | XCTAssert(true, "Pass") 19 | } 20 | 21 | func testPerformanceExample() { 22 | // This is an example of a performance test case. 23 | self.measure() { 24 | // Put the code you want to measure the time of here. 25 | } 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020 Dale Price 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.2 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: "TactileSlider", 8 | platforms: [ 9 | .iOS(.v9), 10 | ], 11 | products: [ 12 | // Products define the executables and libraries produced by a package, and make them visible to other packages. 13 | .library( 14 | name: "TactileSlider", 15 | targets: ["TactileSlider"]), 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 which this package depends on. 24 | .target( 25 | name: "TactileSlider", 26 | dependencies: [], 27 | path: "TactileSlider/Classes"), 28 | ], 29 | swiftLanguageVersions: [ 30 | .v5 31 | ] 32 | ) 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TactileSlider 2 | 3 | ![CI Status](https://github.com/daprice/iOS-Tactile-Slider/actions/workflows/main.yml/badge.svg) 4 | ![Swift Package Manager compatible](https://img.shields.io/badge/Swift_Package_Manager-compatible-orange?style=flat) 5 | [![Version](https://img.shields.io/cocoapods/v/TactileSlider.svg?style=flat)](https://cocoapods.org/pods/TactileSlider) 6 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 7 | [![License](https://img.shields.io/cocoapods/l/TactileSlider.svg?style=flat)](https://cocoapods.org/pods/TactileSlider) 8 | [![Platform](https://img.shields.io/cocoapods/p/TactileSlider.svg?style=flat)](https://cocoapods.org/pods/TactileSlider) 9 | 10 | A slider control designed to be easy to grab and use because it can be dragged or tapped from anywhere along its track, similar to the sliders in Control Center and HomeKit. Because this type of slider graphically represents direct manipulation of a value, it should be used for live adjustment of values whose changes can be directly observed in real time (such as audio volume or the brightness of a light). 11 | 12 | Animation of TactileSliders in various orientations being clicked and dragged in the iOS simulator, followed by a transition from light to dark appearance 13 | 14 | ## Features 15 | 16 | - Can be dragged or (optionally) tapped to set a value 17 | - Supports horizontal and vertical orientation in either direction 18 | - IBDesignable – colors, values, rounded corners, and behavior can be customized in Interface Builder or programatically 19 | - Supports light & dark appearance using semantic system colors with borders that can automatically appear in low contrast situations (iOS 13+) 20 | - Adjustable haptic feedback (iOS 10+) 21 | - VoiceOver support 22 | - Supports pointer (e.g. trackpad or mouse) based scrolling on iPadOS (iOS 13.4+) 23 | 24 | ## Example 25 | 26 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 27 | 28 | ## Requirements 29 | 30 | iOS 9.0+ 31 | 32 | - iOS 10.0+ required for haptic feedback 33 | - iPadOS 13.4+ required for pointer use 34 | 35 | ## Installation 36 | 37 | TactileSlider is available as a Swift package or through [CocoaPods](https://cocoapods.org). 38 | 39 | To install it using CocoaPods, simply add the following line to your Podfile: 40 | 41 | ```ruby 42 | pod 'TactileSlider' 43 | ``` 44 | 45 | ## Usage 46 | 47 | For the full documentation using Xcode 13 or later, add TactileSlider as a dependency or download a local copy, then choose Product > Build Documentation. In previous versions of Xcode, symbol documentation will appear in Quick Help. 48 | 49 | ```swift 50 | let slider = TactileSlider(frame: someRect) 51 | 52 | slider.minimumValue = 1 53 | slider.maximumValue = 10 54 | 55 | slider.setValue(3.8, animated: true) 56 | ``` 57 | 58 | ### Setting orientation and direction 59 | 60 | ```swift 61 | slider.vertical = true 62 | slider.reverseValueAxis = true 63 | ``` 64 | 65 | ### Adjusting behavior 66 | 67 | ```swift 68 | slider.isContinuous = false // send events only at end of gesture vs continuously 69 | slider.enableTapping = false // allow or disallow tapping anywhere on the slider track to instantly set a value 70 | slider.feedbackStyle = .medium // customize haptic feedback when the slider reaches the end 71 | slider.isScrollingEnabled = false // allow or disallow scrolling to adjust the slider using a connected pointing device on iPadOS 72 | slider.precisionRampUpDistance = 10 // enable finer adjustment when moving the slider by amounts smaller than this distance (in screen points) 73 | ``` 74 | 75 | ### Changing colors and appearance 76 | 77 | ```swift 78 | slider.trackBackground = UIColor.black.withAlpha(0.8) // use translucent black for the slider track 79 | slider.tintColor = UIColor.systemGreen // use dynamic green for the slider thumb 80 | 81 | slider.outlineColor = UIColor.gray // color of outline around slider and thumb (if unset, will be determined automatically based on contrast between tintColor and current system appearance) 82 | slider.outlineColorProvider = { slider, suggestedColor -> UIColor? in … } // provide your own closure to set the outline color dynamically 83 | slider.outlineSize = 2 // set thickness of outline 84 | 85 | slider.cornerRadius = 12 // size of corner radius; defaults to automatic based on the slider's bounds 86 | 87 | slider.isPointerInteractionEnabled = true // display a hover effect when under the pointer on iPadOS 88 | ``` 89 | 90 | 91 | ### Fine tuning accessibility 92 | 93 | By default, the accessibility increment and decrement gestures change the value by 10% of the slider's range, matching the behavior of UISlider. This can be adjusted: 94 | 95 | ```swift 96 | slider.steppingMode = .percentage(5) // specify a percentage to increment/decrement the slider's value by 97 | ``` 98 | 99 | ```swift 100 | slider.steppingMode = .stepValue(0.1) // specify a fixed value to increment/decrement the slider's value by 101 | ``` 102 | 103 | ### Interface Builder 104 | 105 | screenshot of Xcode Interface Builder demonstrating a TactileSlider being customized using the graphical interface 106 | 107 | ## Author 108 | 109 | Dale Price ([@dale_price@mastodon.online](https://mastodon.online/@dale_price)) 110 | 111 | ## License 112 | 113 | TactileSlider is available under the MIT license. See the LICENSE file for more info. 114 | -------------------------------------------------------------------------------- /Screenshots/IBDesignable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daprice/iOS-Tactile-Slider/8f0261e96880aed7ce7cb9d7523e32644e664708/Screenshots/IBDesignable.png -------------------------------------------------------------------------------- /Screenshots/horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daprice/iOS-Tactile-Slider/8f0261e96880aed7ce7cb9d7523e32644e664708/Screenshots/horizontal.png -------------------------------------------------------------------------------- /Screenshots/in_use.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daprice/iOS-Tactile-Slider/8f0261e96880aed7ce7cb9d7523e32644e664708/Screenshots/in_use.gif -------------------------------------------------------------------------------- /Screenshots/vertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daprice/iOS-Tactile-Slider/8f0261e96880aed7ce7cb9d7523e32644e664708/Screenshots/vertical.png -------------------------------------------------------------------------------- /TactileSlider.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint TactileSlider.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'TactileSlider' 11 | s.version = '3.0.0' 12 | s.summary = 'Easy-to-grab slider control inspired by Control Center and HomeKit.' 13 | 14 | s.description = <<-DESC 15 | A slider control designed to be easy to grab and use because it can be dragged or tapped from anywhere along its track, similar to the sliders in Control Center and HomeKit. 16 | DESC 17 | 18 | s.homepage = 'https://github.com/daprice/iOS-Tactile-Slider' 19 | # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' 20 | s.license = { :type => 'MIT', :file => 'LICENSE' } 21 | s.author = { 'Dale Price' => 'daprice@mac.com' } 22 | s.source = { :git => 'https://github.com/daprice/iOS-Tactile-Slider.git', :tag => s.version.to_s } 23 | s.social_media_url = 'https://mastodon.online/@dale_price' 24 | 25 | s.ios.deployment_target = '9.0' 26 | s.swift_version = '5.0' 27 | 28 | s.source_files = 'TactileSlider/Classes/**/*' 29 | 30 | # s.resource_bundles = { 31 | # 'TactileSlider' => ['TactileSlider/Assets/*.png'] 32 | # } 33 | 34 | s.frameworks = 'UIKit' 35 | end 36 | -------------------------------------------------------------------------------- /TactileSlider/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daprice/iOS-Tactile-Slider/8f0261e96880aed7ce7cb9d7523e32644e664708/TactileSlider/Assets/.gitkeep -------------------------------------------------------------------------------- /TactileSlider/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daprice/iOS-Tactile-Slider/8f0261e96880aed7ce7cb9d7523e32644e664708/TactileSlider/Classes/.gitkeep -------------------------------------------------------------------------------- /TactileSlider/Classes/TactileSlider+UIPointerInteractionDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TactileSlider+UIPointerInteractionDelegate.swift 3 | // TactileSlider 4 | // 5 | // Created by Dale Price on 5/1/20. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | @available(iOS 13.4, *) 12 | @available(tvOS, unavailable) 13 | extension TactileSlider: UIPointerInteractionDelegate { 14 | 15 | internal func setUpPointerInteraction() { 16 | let pointerInteraction = UIPointerInteraction(delegate: self) 17 | self.addInteraction(pointerInteraction) 18 | } 19 | 20 | public func targetedPreview(for interaction: UIPointerInteraction) -> UITargetedPreview? { 21 | if let interactionView = interaction.view { 22 | let previewParameters = UIPreviewParameters() 23 | previewParameters.visiblePath = UIBezierPath(roundedRect: bounds, cornerRadius: automaticCornerRadius) 24 | previewParameters.backgroundColor = .clear 25 | 26 | return UITargetedPreview(view: interactionView, parameters: previewParameters) 27 | } 28 | 29 | return nil 30 | } 31 | 32 | /// override this to set a custom pointer interaction style 33 | open func pointerStyle(with targetedPreview: UITargetedPreview) -> UIPointerStyle { 34 | return UIPointerStyle( 35 | effect: UIPointerEffect.hover(targetedPreview, preferredTintMode: UIPointerEffect.TintMode.overlay, prefersShadow: false, prefersScaledContent: true) 36 | ) 37 | } 38 | 39 | open func pointerInteraction(_ interaction: UIPointerInteraction, regionFor request: UIPointerRegionRequest, defaultRegion: UIPointerRegion) -> UIPointerRegion? { 40 | return UIPointerRegion(rect: self.bounds) 41 | } 42 | 43 | open func pointerInteraction(_ interaction: UIPointerInteraction, styleFor region: UIPointerRegion) -> UIPointerStyle? { 44 | var style: UIPointerStyle? = nil 45 | 46 | if isPointerInteractionEnabled { 47 | if let targetedPreview = targetedPreview(for: interaction) { 48 | style = pointerStyle(with: targetedPreview) 49 | } 50 | } 51 | 52 | return style 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /TactileSlider/Classes/TactileSlider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TactileSlider.swift 3 | // Easy-to-grab slider control inspired by Control Center and HomeKit. 4 | // 5 | // Created by Dale Price on 1/22/19. 6 | // 7 | 8 | import UIKit 9 | 10 | /// A control for direct manipulation of a value that supports touch gestures anywhere within its track. 11 | /// 12 | /// Because this type of slider graphically represents direct manipulation of a value, it should be used for live adjustment of values whose changes can be directly observed in real time (such as audio volume or the brightness of a light). 13 | /// 14 | /// `TactileSlider` follows the same target-action pattern as [`UISlider`](https://developer.apple.com/documentation/uikit/uislider) for notifying your app of user interaction. 15 | /// 16 | /// ## Topics 17 | /// ### Accessing the slider's value 18 | /// - ``value`` 19 | /// - ``setValue(_:animated:)`` 20 | /// 21 | /// ### Accessing the slider's value limits 22 | /// - ``minimum`` 23 | /// - ``maximum`` 24 | /// 25 | /// ### Setting orientation and direction 26 | /// - ``vertical`` 27 | /// - ``reverseValueAxis`` 28 | /// 29 | /// ### Adjusting behavior 30 | /// - ``isContinuous`` 31 | /// - ``enableTapping`` 32 | /// - ``allowedTapTypes`` 33 | /// - ``feedbackStyle`` 34 | /// - ``isScrollingEnabled`` 35 | /// - ``precisionRampUpDistance`` 36 | /// - ``isPointerInteractionEnabled`` 37 | /// - ``scaleUpWhenInUse`` 38 | /// 39 | /// ### Changing colors and appearance 40 | /// - ``trackBackground`` 41 | /// - ``outlineColor`` 42 | /// - ``outlineColorProvider`` 43 | /// - ``outlineSize`` 44 | /// - ``cornerRadius`` 45 | /// 46 | /// ### Fine tuning accessibility 47 | /// - ``steppingMode-swift.property`` 48 | @available(iOS 9, *) 49 | @available(tvOS, unavailable) 50 | @available(macOS, unavailable) 51 | @IBDesignable open class TactileSlider: UIControl { 52 | 53 | /// Describes how a stepper-like object should step through a range of floating point values. 54 | public enum SteppingMode where Number:BinaryFloatingPoint { 55 | /// Specifies a percentage to increment/decrement by relative to the size of the range of possible values. 56 | /// 57 | /// For example, a ``TactileSlider`` with the stepping mode `percentage(5)`, a ``TactileSlider/minimum`` of `0`, and a ``TactileSlider/maximum`` of `10`, would change its value by `0.5` (i.e. 5% of the difference between 10 and 0) with each increment/decrement. 58 | case percentage(Number) 59 | 60 | /// Specifies an absolute value to increment/decrement by. 61 | /// 62 | /// For example, a ``TactileSlider`` with the stepping mode `stepValue(2)` would change its value by `2.0` with each increment/decrement, regardless of ``TactileSlider/minimum`` and ``TactileSlider/maximum``. 63 | case stepValue(Number) 64 | 65 | /// Calculates the size of an increment within the given range according to the ``SteppingMode`` instance. 66 | /// 67 | /// - Parameter range: The range in which to calculate the increment size. 68 | /// - Returns: Floating point value specifying the absolute value of an increment/decrement within the specified range. 69 | public func stepSize(in range: ClosedRange) -> Number { 70 | let rangeSize = range.upperBound - range.lowerBound 71 | switch self { 72 | case .percentage(let percentage): 73 | return rangeSize * (percentage/100) 74 | case .stepValue(let value): 75 | return value 76 | } 77 | } 78 | } 79 | 80 | private enum Direction { 81 | case rightToLeft 82 | case leftToRight 83 | case topToBottom 84 | case bottomToTop 85 | } 86 | 87 | /// Defines a closure that returns a color (or lack of a color) for the outline of a given TactileSlider. 88 | /// 89 | /// - Parameter tactileSlider: the ``TactileSlider`` instance requesting a color 90 | /// - Parameter proposedColor: the `UIColor` that the TactileSlider suggests, or nil if no outline is suggested 91 | /// - Returns: the `UIColor` to use for the outline color, or `nil` to disable the outline 92 | /// 93 | /// - Note: `proposedColor` will always be `nil` on iOS versions prior to 13. 94 | public typealias ColorProvider = (_ tactileSlider: TactileSlider, _ proposedColor: UIColor?) -> UIColor? 95 | 96 | // MARK: - Public properties 97 | 98 | /// Specifies the orientation of the slider's value axis. 99 | /// 100 | /// If true, the slider will move in the vertical direction; if false, horizontal. 101 | /// 102 | /// To reverse the direction of the slider along its axis, use ``reverseValueAxis``. 103 | /// 104 | /// - SeeAlso: `reverseValueAxis` 105 | /// 106 | /// - Note: Ensure that the dimensions/layout constraints on the control make sense for the orientation set here. 107 | @IBInspectable open var vertical: Bool = false { 108 | didSet { 109 | updateLayerFrames() 110 | } 111 | } 112 | 113 | /// Indicates the direction of the slider along its axis. 114 | /// 115 | /// If false (default), the minimum value will be at the bottom or left of the slider (depending on ``vertical``); if true, the minimum will be at the top or right. 116 | /// 117 | /// - SeeAlso: `vertical` 118 | @IBInspectable open var reverseValueAxis: Bool = false { 119 | didSet { 120 | updateLayerFrames() 121 | } 122 | } 123 | 124 | /// The minimum value for the slider. 125 | /// 126 | /// - Note: If you set this to greater than ``maximum`` or ``value``, those values will be changed to match. 127 | @IBInspectable open var minimum: Float = 0 { 128 | didSet { 129 | if maximum < minimum { maximum = minimum } 130 | if value < minimum { value = minimum } 131 | renderer.setValue(value) 132 | updateAccessibility() 133 | } 134 | } 135 | 136 | /// The maximum value for the slider. 137 | /// 138 | /// - Note: If you set this to less than ``minimum`` or ``value``, those values will be changed to match. 139 | @IBInspectable open var maximum: Float = 1 { 140 | didSet { 141 | if minimum > maximum { minimum = maximum } 142 | if value > maximum { value = maximum } 143 | renderer.setValue(value) 144 | updateAccessibility() 145 | } 146 | } 147 | 148 | /// The current (or starting) value for the slider. 149 | /// 150 | /// To change this value in your code, use ``setValue(_:animated:)``. 151 | @IBInspectable open private(set) var value: Float = 0.5 { 152 | didSet(oldValue) { 153 | if oldValue != value { 154 | if value < minimum { value = minimum } 155 | if value > maximum { value = maximum } 156 | updateAccessibility() 157 | } 158 | } 159 | } 160 | 161 | /// Specifies how the value should be incremented/decremented by VoiceOver actions. 162 | /// 163 | /// - Note: The default stepping mode, `.percentage(10)`, matches the behavior of `UISlider`: the value will be adjusted up or down by 10% of the difference between ``minimum`` and ``maximum``. 164 | /// 165 | /// - Warning: If ``SteppingMode-swift.enum/stepValue(_:)`` is specified with a value greater than the difference between ``minimum`` and ``maximum``, all incremental adjustments will be limited to only the minimum or maximum value. 166 | open var steppingMode: SteppingMode = .percentage(10) 167 | 168 | /// Size, in screen points, of the area in which the user's drags will be treated as if they are shorter, in order to make precise changes easier. 169 | /// 170 | /// This is intended for use cases where the user might want to adjust the value of the slider by very small, precise amounts. If `precisionRampUpDistance` is non-zero, the sensitivity for pan gestures will start out lower (i.e. higher precision; the value will change by less than the user moved their finger) and ramp up until the user has moved their finger by this distance, after which the precision will be 1:1. 171 | /// 172 | /// Setting this to `0` results in the same behavior as UISlider, where the value change exactly matches the user's finger movement. 173 | /// 174 | /// - Note: A value no larger than 5 to 10 points (or 10% of the length of the slider, whichever is smaller) is recommended. 175 | /// 176 | /// - Warning: If this is larger than the size of the slider's bounds, it will be difficult for the user to make large adjustments to the slider's value. 177 | @IBInspectable open var precisionRampUpDistance: Float = 0 178 | 179 | /// Indicates whether changse in the slider's value generate continuous update events. 180 | /// 181 | /// If true, will send `valueChanged` actions at every point during a movement of the slider; if false, will only send when the user lifts their finger. 182 | /// 183 | /// - Important: Because `TactileSlider` is designed to represent the direct, real-time manipulation of a value by the user, setting `isContinuous` to `false` could lead to suboptimal user experience – the user may expect to be able to watch the value change in real time while manipulating the slider, not only when lifting their finger. Only set `isContinuous` to `false` when absolutely necessary. 184 | @IBInspectable open var isContinuous: Bool = true 185 | 186 | /// Indicates whether a single tap within the slider's bounds will set its value by moving it to that location. 187 | /// 188 | /// If true, a single tap anywhere in the slider will set it to that value. 189 | /// 190 | /// On iOS 9 or later, whether to accept only direct taps or indirect (trackpad or mouse) clicks can be specified using the ``allowedTapTypes`` property. 191 | /// 192 | /// - Remark: Users trying to make very small adjustments may accidentally activate this feature. If the intended use case involves making very small, precise adjustments with the slider, consider disabling this feature or restricting it to indirect touches only using ``allowedTapTypes``. 193 | @IBInspectable open var enableTapping: Bool = true { 194 | didSet { 195 | setTapEnabled() 196 | } 197 | } 198 | 199 | /// An array of `UITouch.TouchType`s used to distinguish the type of touches for the ``enableTapping`` feature. 200 | /// 201 | /// This is a wrapper around the [UITapGestureRecognizer](https://developer.apple.com/documentation/uikit/uigesturerecognizer)'s [allowedTouchTypes](https://developer.apple.com/documentation/uikit/uigesturerecognizer/1624223-allowedtouchtypes) property. 202 | /// 203 | /// If ``enableTapping`` is `true`, this can be used to filter direct (e.g. finger) or indirect (e.g. trackpad) touches. 204 | /// 205 | /// - Requires: `enableTapping == true`, otherwise no effect 206 | open var allowedTapTypes: [NSNumber] { 207 | get { 208 | return tapGestureRecognizer.allowedTouchTypes 209 | } 210 | set(newAllowedTapTypes) { 211 | tapGestureRecognizer.allowedTouchTypes = newAllowedTapTypes 212 | } 213 | } 214 | 215 | /// Indicates whether to allow adjusting the slider's value by scrolling with a pointing device. 216 | /// 217 | /// If true, the slider can be adjusted by scrolling with a pointing device (e.g. two-finger scrolling with a trackpad or scrolling a mouse wheel). 218 | /// 219 | /// - Requires: iOS 13.4 220 | /// 221 | /// This setting only affects iPadOS with a connected pointing device. 222 | @IBInspectable open var isScrollingEnabled: Bool = true { 223 | didSet { 224 | if #available(iOS 13.4, *) { 225 | setScrollingEnabled() 226 | } 227 | } 228 | } 229 | 230 | /// Indicates whether to display a hover effect as the pointer hovers over the slider. 231 | /// 232 | /// Override ``pointerStyle(with:)`` to customize the effect. 233 | /// 234 | /// - Note: Enabling this option is intended to communicate to the user that they can easily perform an action using the pointer. Enabling ``isScrollingEnabled``, ``enableTapping``, __and__ allowing at least indirect touches using ``allowedTapTypes`` is recommended if this option is enabled. 235 | /// 236 | /// - Requires: iOS 13.4 237 | /// 238 | /// This setting only affects iPadOS with a connected pointing device. 239 | @IBInspectable open var isPointerInteractionEnabled: Bool = false 240 | 241 | /// Indicates whether the slider will animate its scale to "pop up" when it is being dragged. 242 | /// 243 | /// - Warning: Not recommended if ``isPointerInteractionEnabled`` is set to `true`. Enabling both options together will cause unintuitive behavior when using a pointing device. 244 | @available(iOS, deprecated: 13.4, message: "No longer recommended because it interferes with the UX of pointer interactions on iOS >= 13.4") 245 | @IBInspectable open var scaleUpWhenInUse: Bool = false 246 | 247 | /// The color of the slider's track. 248 | /// 249 | /// - Note: By default, this is set to `.tertiarySystemFill`, which is intended for filling large shapes. Be sure to [choose an appropriate fill color](https://developer.apple.com/documentation/uikit/uicolor/ui_element_colors) for the size of the control. 250 | /// 251 | /// - Important: On iOS versions prior to iOS 13 that do not support dynamic system colors, this defaults to `.lightGray`. 252 | @IBInspectable open var trackBackground: UIColor = { 253 | if #available(iOS 13, *) { 254 | return .tertiarySystemFill 255 | } else { 256 | return .lightGray 257 | } 258 | }() { 259 | didSet { 260 | renderer.trackBackground = trackBackground 261 | } 262 | } 263 | 264 | /// A closure that returns the color (if any) to use for the outline of the slider. 265 | /// 266 | /// To dynamically change the outline color of the TactileSlider (for example, to select an outline color dynamically based on the contrast between the slider tint color and background), create a closure that returns a UIColor (or `nil`) for the given TactileSlider, then assign that closure to `outlineColorProvider`. 267 | open var outlineColorProvider: ColorProvider? = nil { 268 | didSet { 269 | renderer.updateOutlineColors() 270 | } 271 | } 272 | 273 | /// Color to use for the outline of the slider. 274 | /// 275 | /// If this is set to `nil` (default), an appropriate outline color will be automatically determined based on color contrast. Setting this to a `UIColor` overrides this automatic behavior. 276 | /// 277 | /// - Note: `nil` here means "automatically choose a color" rather than "no color". If you want to disable the outline, set `outlineColor` to `UIColor.clear` or set ``outlineSize`` to `0`. 278 | /// 279 | /// - Note: If a custom ``outlineColorProvider`` is set, the `outlineColor` set here will be passed to it as the proposed color instead of a system suggested color. 280 | /// 281 | /// - SeeAlso: `TactileSlider.outlineColorProvider` 282 | @IBInspectable open var outlineColor: UIColor? = nil { 283 | didSet { 284 | renderer.updateOutlineColors() 285 | } 286 | } 287 | 288 | /// The thickness of the outline around the slider and thumb edge. 289 | /// 290 | /// Regardless of `outlineSize`, the outline will only be visible if one or more of the following is true: 291 | /// - contrast between `tintColor` and the system background color is deemed low (the default behavior) 292 | /// - ``outlineColor`` is non-`nil` 293 | /// - the ``outlineColorProvider`` returns a non-`nil` color with an alpha value above 0. 294 | @IBInspectable open var outlineSize: CGFloat = 1.5 { 295 | didSet { 296 | renderer.outlineSize = outlineSize 297 | } 298 | } 299 | 300 | /// The radius of the rounded corners of the slider. 301 | /// 302 | /// If this is set to a negative value (or left as default in Interface Builder), the corner radius will be automatically determined from the size of the slider's bounds. 303 | @IBInspectable open var cornerRadius: CGFloat = -1 { 304 | didSet { 305 | if cornerRadius < 0 { 306 | renderer.cornerRadius = automaticCornerRadius 307 | } else { 308 | renderer.cornerRadius = cornerRadius 309 | } 310 | } 311 | } 312 | 313 | /// See [`UIView.frame`](https://developer.apple.com/documentation/uikit/uiview/1622621-frame) 314 | override open var frame: CGRect { 315 | didSet { 316 | updateLayerFrames() 317 | } 318 | } 319 | 320 | /// See [`UIControl.isEnabled`](https://developer.apple.com/documentation/uikit/uicontrol/1618217-isenabled) 321 | override open var isEnabled: Bool { 322 | didSet { 323 | renderer.grayedOut = !isEnabled 324 | tintAdjustmentMode = isEnabled ? .automatic : .dimmed 325 | } 326 | } 327 | 328 | // MARK: - Private properties 329 | 330 | private var direction: Direction { 331 | switch (vertical, reverseValueAxis) { 332 | case (false, false): 333 | return .leftToRight 334 | case (false, true): 335 | return .rightToLeft 336 | case (true, false): 337 | return .bottomToTop 338 | case (true, true): 339 | return .topToBottom 340 | } 341 | } 342 | 343 | internal var automaticCornerRadius: CGFloat { 344 | if cornerRadius < 0 { 345 | return min(bounds.width, bounds.height) / 3.3 346 | } else { 347 | return cornerRadius 348 | } 349 | } 350 | 351 | private let renderer = TactileSliderLayerRenderer() 352 | 353 | private var dragGestureRecognizer: UIPanGestureRecognizer! 354 | private var tapGestureRecognizer: UITapGestureRecognizer! 355 | 356 | /// cumulative length of active pan gesture(s) 357 | private var accumulatedMovement: CGFloat = 0 358 | 359 | // gross workaround for not being able to use @available on stored properties, from https://www.klundberg.com/blog/Swift-2-and-@available-properties/ 360 | private var _minMaxFeedbackGenerator: AnyObject? 361 | @available(iOS 10.0, *) private var minMaxFeedbackGenerator: UIImpactFeedbackGenerator? { 362 | get { 363 | return _minMaxFeedbackGenerator as? UIImpactFeedbackGenerator 364 | } 365 | set(newValue) { 366 | _minMaxFeedbackGenerator = newValue 367 | } 368 | } 369 | 370 | private var _feedbackStyle: Int? 371 | 372 | /// The `UIImpactFeedbackGenerator.FeedbackStyle` used for haptic feedback when the slider reaches either end of its track. 373 | /// 374 | /// - Requires: iOS 10.0 or later 375 | /// 376 | /// - Note: Defaults to `.light` if not set 377 | @available(iOS 10.0, *) open var feedbackStyle: UIImpactFeedbackGenerator.FeedbackStyle { 378 | get { 379 | guard let _feedbackStyle = _feedbackStyle, 380 | let style = UIImpactFeedbackGenerator.FeedbackStyle(rawValue: _feedbackStyle) else { return .light } 381 | return style 382 | } 383 | set(newValue) { 384 | _feedbackStyle = newValue.rawValue 385 | } 386 | } 387 | 388 | /// The suggested outline color for the slider 389 | internal var suggestedOutlineColor: UIColor? { 390 | // If a manual outline color is set, suggest only that 391 | guard outlineColor == nil else { 392 | return outlineColor 393 | } 394 | 395 | // if possible, calculate whether a border is necessary for contrast with the current system background color 396 | if #available(iOS 13, *) { 397 | let contrastRatio = UIColor.contrastRatio(between: self.tintColor, and: .systemBackground) 398 | 399 | if contrastRatio < 1.25 { 400 | // if an outline is needed, return a color that is `.systemFill` by default or `.separator` if high contrast is enabled 401 | return UIColor { traitCollection in 402 | if traitCollection.accessibilityContrast == UIAccessibilityContrast.high { 403 | return UIColor.separator 404 | } else { 405 | return UIColor.systemFill 406 | } 407 | } 408 | } 409 | } 410 | 411 | return nil 412 | } 413 | 414 | /// The final decided outline color, taking into account `outlineColor` and `outlineColorProvider` 415 | internal var finalOutlineColor: UIColor? { 416 | if let colorProvider = outlineColorProvider { 417 | return colorProvider(self, suggestedOutlineColor) 418 | } else { 419 | return suggestedOutlineColor 420 | } 421 | } 422 | 423 | 424 | // MARK: - Initialization 425 | 426 | override public init(frame: CGRect) { 427 | super.init(frame: frame) 428 | setup() 429 | } 430 | 431 | required public init?(coder aDecoder: NSCoder) { 432 | super.init(coder: aDecoder) 433 | setup() 434 | } 435 | 436 | private func setup() { 437 | isAccessibilityElement = true 438 | accessibilityTraits.insert(UIAccessibilityTraits.adjustable) 439 | 440 | dragGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(didPan)) 441 | dragGestureRecognizer.cancelsTouchesInView = false 442 | addGestureRecognizer(dragGestureRecognizer) 443 | 444 | tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTap)) 445 | tapGestureRecognizer.numberOfTapsRequired = 1 446 | tapGestureRecognizer.numberOfTouchesRequired = 1 447 | tapGestureRecognizer.cancelsTouchesInView = false 448 | addGestureRecognizer(tapGestureRecognizer) 449 | 450 | setTapEnabled() 451 | if #available(iOS 13.4, *) { 452 | setScrollingEnabled() 453 | setUpPointerInteraction() 454 | } 455 | 456 | renderer.tactileSlider = self 457 | renderer.cornerRadius = automaticCornerRadius 458 | renderer.outlineSize = outlineSize 459 | traitCollectionDidChange(nil) 460 | 461 | layer.backgroundColor = UIColor.clear.cgColor 462 | layer.isOpaque = false 463 | layer.addSublayer(renderer.trackLayer) 464 | renderer.setupLayers() 465 | 466 | updateLayerFrames() 467 | } 468 | 469 | /// Sets the value of the slider. 470 | /// 471 | /// - Parameter newValue: the value to set the slider to. 472 | /// - Parameter animated: whether or not to perform an asynchronous visual animation of the slider transitioning to the new value. 473 | /// 474 | /// - Postcondition: If the value passed in is greater than ``minimum`` and less than ``maximum``, the ``value`` of the slider will be set to that value, otherwise it will be capped to within that range. 475 | open func setValue(_ newValue: Float, animated: Bool) { 476 | value = min(maximum, max(minimum, newValue)) 477 | renderer.setValue(value, animated: animated) 478 | } 479 | 480 | /// Sets the value of the slider and calls actions for `valueChanged` and `primaryActionTriggered`, indicating that this change is the result of a completed user action. 481 | /// 482 | /// - Note: If changing the value as a result of an *incomplete* user action such as a pan gesture when `isContinuous` is `false`, call `setValue(_:animated:)` directly instead 483 | internal func userSetValue(_ newValue: Float, animated: Bool) { 484 | setValue(newValue, animated: animated) 485 | sendActions(for: [.valueChanged, .primaryActionTriggered]) 486 | } 487 | 488 | 489 | // MARK: - Accessibility 490 | 491 | override open func accessibilityDecrement() { 492 | let newValue = value - steppingMode.stepSize(in: minimum...maximum) 493 | userSetValue(newValue, animated: true) 494 | } 495 | 496 | override open func accessibilityIncrement() { 497 | let newValue = value + steppingMode.stepSize(in: minimum...maximum) 498 | userSetValue(newValue, animated: true) 499 | } 500 | 501 | /// Returns a string containing the value of the slider as a percentage of its range. 502 | /// 503 | /// - Parameter locale: The `Locale` to format the value for; defaults to `Locale.current` 504 | open func valueAsPercentage(locale: Locale = Locale.current) -> String? { 505 | let valueNumber = (value - minimum) / (maximum - minimum) as NSNumber 506 | let valueFormatter = NumberFormatter() 507 | valueFormatter.numberStyle = .percent 508 | valueFormatter.maximumFractionDigits = 0 509 | valueFormatter.locale = locale 510 | 511 | return valueFormatter.string(from: valueNumber) 512 | } 513 | 514 | private func updateAccessibility() { 515 | accessibilityValue = valueAsPercentage() 516 | } 517 | 518 | 519 | // MARK: - gesture handling 520 | 521 | private func setTapEnabled() { 522 | tapGestureRecognizer.isEnabled = enableTapping 523 | } 524 | 525 | @available(iOS 13.4, *) 526 | private func setScrollingEnabled() { 527 | if isScrollingEnabled { 528 | dragGestureRecognizer.allowedScrollTypesMask = UIScrollTypeMask.all 529 | } else { 530 | dragGestureRecognizer.allowedScrollTypesMask = [] 531 | } 532 | } 533 | 534 | @objc func didPan(sender: UIPanGestureRecognizer) { 535 | let translationLengthAlongValueAxis = valueAxisFrom(sender.translation(in: self)) 536 | 537 | accumulatedMovement += translationLengthAlongValueAxis 538 | 539 | let adjustedTranslationLength = adjustForPrecision(precisionRampUpDistance, incrementLength: translationLengthAlongValueAxis, totalLength: accumulatedMovement) 540 | let requestedValueChange = valueChangeForTranslation(length: adjustedTranslationLength) 541 | 542 | if value == minimum && requestedValueChange < 0 { 543 | // already hit minimum, don't change the value 544 | } else if value == maximum && requestedValueChange > 0 { 545 | // already hit maximum, don't change the value 546 | } else { 547 | let newValue = value + requestedValueChange 548 | setValue(newValue, animated: false) // `setValue` clamps the actual value between min and max 549 | 550 | // control feedback generator according to state 551 | if #available(iOS 10.0, *) { 552 | switch sender.state { 553 | case .began: 554 | minMaxFeedbackGenerator = UIImpactFeedbackGenerator(style: feedbackStyle) 555 | minMaxFeedbackGenerator?.prepare() 556 | case .changed: 557 | if newValue != value { // if the requested value is outside min...max, these won't be equal 558 | minMaxFeedbackGenerator?.impactOccurred() 559 | minMaxFeedbackGenerator?.prepare() 560 | } 561 | case .cancelled, .ended, .failed: 562 | _minMaxFeedbackGenerator = nil 563 | default: 564 | break 565 | } 566 | } 567 | 568 | let remainingTranslationAmount: CGFloat 569 | if value == newValue { 570 | remainingTranslationAmount = 0 571 | } else if (reverseValueAxis && !vertical) || (!reverseValueAxis && vertical) { 572 | remainingTranslationAmount = positionDifferenceForValueDifference(value - newValue) 573 | } else { 574 | remainingTranslationAmount = positionDifferenceForValueDifference(newValue - value) 575 | } 576 | sender.setTranslation(CGPoint(x: remainingTranslationAmount, y: remainingTranslationAmount), in: self) 577 | } 578 | 579 | if isContinuous || sender.state == .ended || sender.state == .cancelled { 580 | sendActions(for: [.valueChanged, .primaryActionTriggered]) 581 | } 582 | 583 | if sender.state != .ended && sender.state != .cancelled && sender.state != .failed { 584 | renderer.popUp = scaleUpWhenInUse 585 | } else { 586 | renderer.popUp = false 587 | accumulatedMovement = 0 588 | } 589 | } 590 | 591 | @objc func didTap(sender: UITapGestureRecognizer) { 592 | if sender.state == .ended { 593 | let tapLocation: CGFloat 594 | if (reverseValueAxis && !vertical) || (!reverseValueAxis && vertical) { 595 | tapLocation = valueAxisFrom(CGPoint(x: bounds.width, y: bounds.height), accountForDirection: false) + valueAxisFrom(sender.location(in: self)) 596 | } 597 | else { 598 | tapLocation = valueAxisFrom(sender.location(in: self), accountForDirection: false) 599 | } 600 | let tappedValue = valueForPosition(tapLocation) 601 | userSetValue(tappedValue, animated: true) 602 | } 603 | } 604 | 605 | 606 | // MARK: - Graphics 607 | 608 | open override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { 609 | renderer.trackBackground = trackBackground 610 | renderer.updateOutlineColors() 611 | tintColorDidChange() 612 | } 613 | 614 | open override func tintColorDidChange() { 615 | renderer.thumbTint = tintColor 616 | renderer.updateOutlineColors() 617 | } 618 | 619 | override open func layoutSubviews() { 620 | super.layoutSubviews() 621 | self.setNeedsDisplay() 622 | } 623 | 624 | override open func draw(_ rect: CGRect) { 625 | super.draw(rect) 626 | updateLayerFrames() 627 | } 628 | 629 | private func updateLayerFrames() { 630 | if cornerRadius < 0 { 631 | renderer.cornerRadius = automaticCornerRadius 632 | } 633 | renderer.updateBounds(bounds) 634 | } 635 | 636 | /// returns the position along the value axis for a given control value 637 | internal func positionForValue(_ value: Float) -> CGFloat { 638 | switch direction { 639 | case .rightToLeft, .leftToRight: 640 | return bounds.width * CGFloat((value - minimum) / (maximum - minimum)) 641 | case .topToBottom, .bottomToTop: 642 | return bounds.height * CGFloat((value - minimum) / (maximum - minimum)) 643 | } 644 | } 645 | 646 | internal func positionDifferenceForValueDifference(_ valueDifference: Float) -> CGFloat { 647 | switch direction { 648 | case .rightToLeft, .leftToRight: 649 | return bounds.width * CGFloat((valueDifference) / (maximum - minimum)) 650 | case .topToBottom, .bottomToTop: 651 | return bounds.height * CGFloat((valueDifference) / (maximum - minimum)) 652 | } 653 | } 654 | 655 | /// returns the control value for a given position along the value axis 656 | internal func valueForPosition(_ position: CGFloat) -> Float { 657 | switch direction { 658 | case .rightToLeft, .leftToRight: 659 | return Float(position) / Float(bounds.width) * (maximum - minimum) + minimum 660 | case .topToBottom, .bottomToTop: 661 | return Float(position) / Float(bounds.height) * (maximum - minimum) + minimum 662 | } 663 | } 664 | 665 | /// returns whichever axis in a Point represents the value axis for this particular slider 666 | internal func valueAxisFrom(_ point: CGPoint, accountForDirection: Bool = true) -> CGFloat { 667 | switch direction { 668 | case .leftToRight: 669 | return point.x 670 | case .rightToLeft: 671 | return accountForDirection ? -point.x : point.x 672 | case .bottomToTop: 673 | return accountForDirection ? -point.y : point.y 674 | case .topToBottom: 675 | return point.y 676 | } 677 | } 678 | 679 | internal func offAxisFrom(_ point: CGPoint, accountForDirection: Bool = true) -> CGFloat { 680 | switch direction { 681 | case .leftToRight: 682 | return point.y 683 | case .rightToLeft: 684 | return accountForDirection ? -point.y : point.y 685 | case .bottomToTop: 686 | return accountForDirection ? -point.x : point.x 687 | case .topToBottom: 688 | return point.x 689 | } 690 | } 691 | 692 | internal func adjustForPrecision(_ rampUpDistance: Float, incrementLength: CGFloat, totalLength: CGFloat) -> CGFloat { 693 | if totalLength.magnitude < CGFloat(rampUpDistance) { 694 | let adjustmentRatio = totalLength.magnitude / CGFloat(rampUpDistance) 695 | return incrementLength * adjustmentRatio 696 | } else { 697 | return incrementLength 698 | } 699 | } 700 | 701 | internal func valueChangeForTranslation(length translationSizeAlongValueAxis: CGFloat) -> Float { 702 | let boundsSize = CGPoint(x: bounds.width, y: bounds.height) 703 | let boundsSizeAlongValueAxis = valueAxisFrom(boundsSize, accountForDirection: false) 704 | return Float(translationSizeAlongValueAxis / boundsSizeAlongValueAxis) * (maximum - minimum) 705 | } 706 | 707 | internal func pointOnSlider(valueAxisPosition: CGFloat, offAxisPosition: CGFloat) -> CGPoint { 708 | switch direction { 709 | case .leftToRight: 710 | return CGPoint(x: valueAxisPosition, y: offAxisPosition) 711 | case .rightToLeft: 712 | return CGPoint(x: bounds.width - valueAxisPosition, y: offAxisPosition) 713 | case .bottomToTop: 714 | return CGPoint(x: offAxisPosition, y: bounds.height - valueAxisPosition) 715 | case .topToBottom: 716 | return CGPoint(x: offAxisPosition, y: valueAxisPosition) 717 | } 718 | } 719 | 720 | } 721 | -------------------------------------------------------------------------------- /TactileSlider/Classes/TactileSliderLayerRenderer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TactileSliderLayerRenderer.swift 3 | // TactileSlider 4 | // 5 | // Created by Dale Price on 1/26/19. 6 | // 7 | 8 | import UIKit 9 | 10 | @available(iOS 9, *) 11 | @available(tvOS, unavailable) 12 | @available(macOS, unavailable) 13 | internal class TactileSliderLayerRenderer { 14 | 15 | private static var valueChangeTimingFunction = CAMediaTimingFunction(name: .default) 16 | 17 | weak var tactileSlider: TactileSlider? 18 | 19 | var trackBackground: UIColor = .darkGray { 20 | didSet { 21 | trackLayer.backgroundColor = trackBackground.cgColor 22 | } 23 | } 24 | 25 | var outlineSize: CGFloat = 1 { 26 | didSet { 27 | updateOutlineLayer() 28 | } 29 | } 30 | 31 | var thumbTint: UIColor = .white { 32 | didSet { 33 | thumbLayer.fillColor = thumbTint.cgColor 34 | } 35 | } 36 | 37 | var cornerRadius: CGFloat = 10 { 38 | didSet { 39 | updateMaskAndOutlineLayerPath() 40 | } 41 | } 42 | 43 | var grayedOut: Bool = false { 44 | didSet { 45 | updateGrayedOut() 46 | } 47 | } 48 | 49 | var popUp: Bool = false { 50 | didSet(oldValue) { 51 | if oldValue != popUp { 52 | updatePopUp() 53 | } 54 | } 55 | } 56 | 57 | let trackLayer = CALayer() 58 | let thumbLayer = CAShapeLayer() 59 | let maskLayer = CAShapeLayer() 60 | let outlineLayer = CAShapeLayer() 61 | let thumbOutlineLayer = CAShapeLayer() 62 | 63 | init() { 64 | trackLayer.backgroundColor = trackBackground.cgColor 65 | thumbLayer.fillColor = thumbTint.cgColor 66 | thumbLayer.masksToBounds = true 67 | maskLayer.fillColor = UIColor.white.cgColor 68 | maskLayer.backgroundColor = UIColor.clear.cgColor 69 | trackLayer.mask = maskLayer 70 | trackLayer.masksToBounds = true 71 | outlineLayer.backgroundColor = nil 72 | outlineLayer.fillColor = nil 73 | thumbOutlineLayer.backgroundColor = nil 74 | 75 | updateOutlineLayer(updateBounds: false) 76 | updateOutlineColors() 77 | } 78 | 79 | internal func setupLayers() { 80 | trackLayer.addSublayer(thumbLayer) 81 | trackLayer.addSublayer(outlineLayer) 82 | thumbLayer.addSublayer(thumbOutlineLayer) 83 | } 84 | 85 | private func updateThumbLayerPath() { 86 | CATransaction.begin() 87 | CATransaction.setDisableActions(true) 88 | 89 | thumbLayer.path = CGPath(rect: CGRect(x: 0, y: 0, width: thumbLayer.bounds.width, height: thumbLayer.bounds.height), transform: nil) 90 | 91 | updateThumbOutlineLayerPath() 92 | 93 | CATransaction.commit() 94 | } 95 | 96 | private func updateThumbOutlineLayerPath() { 97 | guard let slider = tactileSlider else { 98 | return 99 | } 100 | 101 | CATransaction.begin() 102 | CATransaction.setDisableActions(true) 103 | 104 | let edgeInsets: UIEdgeInsets 105 | switch (slider.vertical, slider.reverseValueAxis) { 106 | case (false, false): 107 | edgeInsets = UIEdgeInsets(top: 0, left: thumbLayer.bounds.width - outlineSize, bottom: 0, right: -1) 108 | case (false, true): 109 | edgeInsets = UIEdgeInsets(top: 0, left: -1, bottom: 0, right: thumbLayer.bounds.width - outlineSize) 110 | case (true, false): 111 | edgeInsets = UIEdgeInsets(top: -1, left: 0, bottom: thumbLayer.bounds.height - outlineSize, right: 0) 112 | case (true, true): 113 | edgeInsets = UIEdgeInsets(top: thumbLayer.bounds.height - outlineSize, left: 0, bottom: -1, right: 0) 114 | } 115 | 116 | let baseRect = CGRect(x: 0, y: 0, width: thumbLayer.bounds.width, height: thumbLayer.bounds.height) 117 | let insetRect = baseRect.inset(by: edgeInsets) 118 | thumbOutlineLayer.path = CGPath(rect: insetRect, transform: nil) 119 | 120 | CATransaction.commit() 121 | } 122 | 123 | private func updateMaskAndOutlineLayerPath() { 124 | CATransaction.begin() 125 | CATransaction.setDisableActions(true) 126 | 127 | let maskRect = CGRect(x: 0, y: 0, width: maskLayer.bounds.width, height: maskLayer.bounds.height) 128 | let maskPath = UIBezierPath(roundedRect: maskRect, cornerRadius: cornerRadius).cgPath 129 | maskLayer.path = maskPath 130 | outlineLayer.path = maskPath 131 | 132 | CATransaction.commit() 133 | } 134 | 135 | internal func updateOutlineColors() { 136 | let color: CGColor? 137 | if let slider = tactileSlider { 138 | color = slider.finalOutlineColor?.cgColor 139 | } else { 140 | color = nil 141 | } 142 | 143 | outlineLayer.strokeColor = color 144 | thumbOutlineLayer.fillColor = color 145 | } 146 | 147 | private func updateOutlineLayer(updateBounds: Bool = true) { 148 | outlineLayer.lineWidth = outlineSize * 2 149 | if updateBounds { updateThumbOutlineLayerPath() } 150 | } 151 | 152 | private func updateGrayedOut() { 153 | let alpha: Float = grayedOut ? 0.6 : 1 154 | trackLayer.opacity = alpha 155 | } 156 | 157 | private func updatePopUp() { 158 | CATransaction.begin() 159 | 160 | CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: .easeOut)) 161 | CATransaction.setAnimationDuration(0.1) 162 | 163 | let zPosition: CGFloat = popUp ? 1.025 : 1 164 | trackLayer.transform = CATransform3DScale(CATransform3DIdentity, zPosition, zPosition, zPosition) 165 | 166 | CATransaction.commit() 167 | } 168 | 169 | internal func updateBounds(_ bounds: CGRect) { 170 | CATransaction.begin() 171 | CATransaction.setDisableActions(true) 172 | 173 | trackLayer.bounds = bounds 174 | trackLayer.position = CGPoint(x: bounds.midX, y: bounds.midY) 175 | 176 | maskLayer.bounds = trackLayer.bounds 177 | maskLayer.position = trackLayer.position 178 | outlineLayer.bounds = trackLayer.bounds 179 | outlineLayer.position = trackLayer.position 180 | updateMaskAndOutlineLayerPath() 181 | 182 | thumbLayer.bounds = trackLayer.bounds 183 | thumbLayer.position = trackLayer.position 184 | thumbOutlineLayer.bounds = trackLayer.bounds 185 | thumbOutlineLayer.position = trackLayer.position 186 | updateThumbLayerPath() 187 | 188 | if let value = tactileSlider?.value { 189 | setValue(value) 190 | } 191 | 192 | CATransaction.commit() 193 | } 194 | 195 | internal func setValue(_ value: Float, animated: Bool = false) { 196 | CATransaction.begin() 197 | 198 | if animated { 199 | CATransaction.setAnimationTimingFunction(Self.valueChangeTimingFunction) 200 | } else { 201 | CATransaction.setDisableActions(true) 202 | } 203 | 204 | let valueAxisOffset = tactileSlider!.valueAxisFrom(CGPoint(x: thumbLayer.bounds.width, y: thumbLayer.bounds.height), accountForDirection: true) 205 | let valueAxisAmount = tactileSlider!.positionForValue(value) 206 | let reverseOffset = (tactileSlider!.reverseValueAxis && !tactileSlider!.vertical) || (!tactileSlider!.reverseValueAxis && tactileSlider!.vertical) 207 | let position = tactileSlider!.pointOnSlider(valueAxisPosition: valueAxisAmount - (reverseOffset ? 0 : valueAxisOffset), offAxisPosition: 0) 208 | 209 | thumbLayer.transform = CATransform3DTranslate(CATransform3DIdentity, position.x, position.y, 0) 210 | 211 | CATransaction.commit() 212 | } 213 | } 214 | -------------------------------------------------------------------------------- /TactileSlider/Classes/UIColor+ContrastRatio.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+ContrastRatio.swift 3 | // TactileSlider 4 | // 5 | // Created by Dale Price on 8/4/21 based on https://stackoverflow.com/questions/42355778/how-to-compute-color-contrast-ratio-between-two-uicolor-instances 6 | // 7 | 8 | import UIKit 9 | 10 | internal extension UIColor { 11 | 12 | static func contrastRatio(between color1: UIColor, and color2: UIColor) -> CGFloat { 13 | // https://www.w3.org/TR/WCAG20-TECHS/G18.html#G18-tests 14 | 15 | let luminance1 = color1.luminance() 16 | let luminance2 = color2.luminance() 17 | 18 | let luminanceDarker = min(luminance1, luminance2) 19 | let luminanceLighter = max(luminance1, luminance2) 20 | 21 | return (luminanceLighter + 0.05) / (luminanceDarker + 0.05) 22 | } 23 | 24 | func contrastRatio(with color: UIColor) -> CGFloat { 25 | return UIColor.contrastRatio(between: self, and: color) 26 | } 27 | 28 | func luminance() -> CGFloat { 29 | // https://www.w3.org/TR/WCAG20-TECHS/G18.html#G18-tests 30 | 31 | let ciColor = CIColor(color: self) 32 | 33 | func adjust(colorComponent: CGFloat) -> CGFloat { 34 | return (colorComponent < 0.04045) ? (colorComponent / 12.92) : pow((colorComponent + 0.055) / 1.055, 2.4) 35 | } 36 | 37 | return 0.2126 * adjust(colorComponent: ciColor.red) + 0.7152 * adjust(colorComponent: ciColor.green) + 0.0722 * adjust(colorComponent: ciColor.blue) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj --------------------------------------------------------------------------------