├── .swift-version ├── readme_images └── example.gif ├── THEPageControlApp ├── Podfile ├── Pods │ ├── Target Support Files │ │ ├── THEPageControl │ │ │ ├── THEPageControl.modulemap │ │ │ ├── THEPageControl-dummy.m │ │ │ ├── THEPageControl-prefix.pch │ │ │ ├── THEPageControl-umbrella.h │ │ │ ├── THEPageControl.debug.xcconfig │ │ │ ├── THEPageControl.release.xcconfig │ │ │ ├── THEPageControl.xcconfig │ │ │ ├── Info.plist │ │ │ └── THEPageControl-Info.plist │ │ └── Pods-THEPageControlApp │ │ │ ├── Pods-THEPageControlApp.modulemap │ │ │ ├── Pods-THEPageControlApp-dummy.m │ │ │ ├── Pods-THEPageControlApp-umbrella.h │ │ │ ├── Pods-THEPageControlApp.debug.xcconfig │ │ │ ├── Pods-THEPageControlApp.release.xcconfig │ │ │ ├── Info.plist │ │ │ ├── Pods-THEPageControlApp-Info.plist │ │ │ ├── Pods-THEPageControlApp-acknowledgements.markdown │ │ │ ├── Pods-THEPageControlApp-acknowledgements.plist │ │ │ ├── Pods-THEPageControlApp-resources.sh │ │ │ └── Pods-THEPageControlApp-frameworks.sh │ ├── Manifest.lock │ ├── Local Podspecs │ │ └── THEPageControl.podspec.json │ └── Pods.xcodeproj │ │ └── project.pbxproj ├── THEPageControlApp.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── project.pbxproj ├── THEPageControlApp.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Podfile.lock └── THEPageControlApp │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Info.plist │ ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.storyboard │ └── ViewController.swift ├── THEPageControl ├── THEPageControl.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── THEPageControl.xcscheme │ └── project.pbxproj ├── Tests │ ├── Info.plist │ └── THEPageControlTests.swift └── Source │ ├── Info.plist │ ├── THEPageControl.h │ └── THEPageControl.swift ├── scripts ├── test.sh └── build_app.sh ├── .github └── workflows │ └── swift.yml ├── .gitignore ├── THEPageControl.podspec ├── LICENSE └── README.md /.swift-version: -------------------------------------------------------------------------------- 1 | 3.0.2 2 | -------------------------------------------------------------------------------- /readme_images/example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/badoo/THEPageControl/HEAD/readme_images/example.gif -------------------------------------------------------------------------------- /THEPageControlApp/Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '8.0' 2 | use_frameworks! 3 | 4 | target 'THEPageControlApp' do 5 | pod 'THEPageControl', :path => ".." 6 | end 7 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/THEPageControl/THEPageControl.modulemap: -------------------------------------------------------------------------------- 1 | framework module THEPageControl { 2 | umbrella header "THEPageControl-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/THEPageControl/THEPageControl-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_THEPageControl : NSObject 3 | @end 4 | @implementation PodsDummy_THEPageControl 5 | @end 6 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_THEPageControlApp { 2 | umbrella header "Pods-THEPageControlApp-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /THEPageControl/THEPageControl.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_THEPageControlApp : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_THEPageControlApp 5 | @end 6 | -------------------------------------------------------------------------------- /THEPageControlApp/THEPageControlApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /scripts/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -o pipefail 4 | 5 | xcodebuild clean test \ 6 | -project THEPageControl/THEPageControl.xcodeproj \ 7 | -scheme THEPageControl \ 8 | -sdk iphonesimulator \ 9 | -destination 'platform=iOS Simulator,name=iPhone 11' \ 10 | -configuration Debug | xcpretty 11 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/THEPageControl/THEPageControl-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 | -------------------------------------------------------------------------------- /scripts/build_app.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -o pipefail 4 | 5 | xcodebuild clean build \ 6 | -workspace THEPageControlApp/THEPageControlApp.xcworkspace \ 7 | -scheme THEPageControlApp \ 8 | -sdk iphonesimulator \ 9 | -destination 'platform=iOS Simulator,name=iPhone 11' \ 10 | -configuration Debug | xcpretty 11 | -------------------------------------------------------------------------------- /THEPageControlApp/THEPageControlApp.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /THEPageControlApp/THEPageControlApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /THEPageControlApp/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - THEPageControl (1.2.0) 3 | 4 | DEPENDENCIES: 5 | - THEPageControl (from `..`) 6 | 7 | EXTERNAL SOURCES: 8 | THEPageControl: 9 | :path: ".." 10 | 11 | SPEC CHECKSUMS: 12 | THEPageControl: ebadbffb35e41eea007cd4005c2f040780c51521 13 | 14 | PODFILE CHECKSUM: 34ad8db1298bbbffa013c98cbd189cc583f3ba63 15 | 16 | COCOAPODS: 1.9.0 17 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - THEPageControl (1.2.0) 3 | 4 | DEPENDENCIES: 5 | - THEPageControl (from `..`) 6 | 7 | EXTERNAL SOURCES: 8 | THEPageControl: 9 | :path: ".." 10 | 11 | SPEC CHECKSUMS: 12 | THEPageControl: ebadbffb35e41eea007cd4005c2f040780c51521 13 | 14 | PODFILE CHECKSUM: 34ad8db1298bbbffa013c98cbd189cc583f3ba63 15 | 16 | COCOAPODS: 1.9.0 17 | -------------------------------------------------------------------------------- /.github/workflows/swift.yml: -------------------------------------------------------------------------------- 1 | name: Swift 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | test: 11 | runs-on: macos-latest 12 | steps: 13 | - uses: actions/checkout@v2 14 | - name: Test THEPageControl 15 | run: ./scripts/test.sh 16 | - name: Build THEPageControlApp 17 | run: ./scripts/build_app.sh 18 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp-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_THEPageControlAppVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_THEPageControlAppVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/THEPageControl/THEPageControl-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 | #import "THEPageControl.h" 14 | 15 | FOUNDATION_EXPORT double THEPageControlVersionNumber; 16 | FOUNDATION_EXPORT const unsigned char THEPageControlVersionString[]; 17 | 18 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/THEPageControl/THEPageControl.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/THEPageControl 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 11 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/THEPageControl/THEPageControl.release.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/THEPageControl 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 11 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/THEPageControl/THEPageControl.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/THEPageControl 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /THEPageControl/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 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | *.xccheckout 14 | *.moved-aside 15 | DerivedData 16 | *.hmap 17 | *.ipa 18 | *.xcuserstate 19 | .DS_Store 20 | 21 | # CocoaPods 22 | # 23 | # We recommend against adding the Pods directory to your .gitignore. However 24 | # you should judge for yourself, the pros and cons are mentioned at: 25 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 26 | # 27 | # Pods/ 28 | 29 | # Carthage 30 | # 31 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 32 | # Carthage/Checkouts 33 | 34 | Carthage/Build 35 | -------------------------------------------------------------------------------- /THEPageControl/Source/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 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/THEPageControl" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/THEPageControl/THEPageControl.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "THEPageControl" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/THEPageControl" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/THEPageControl/THEPageControl.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "THEPageControl" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Local Podspecs/THEPageControl.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "THEPageControl", 3 | "version": "1.2.0", 4 | "summary": "Simple and flexible page control", 5 | "description": "Simple to use page control written in Swift. Provides full customization per dot.\nIncludes automatic intermediate state resolution for smooth transitions.", 6 | "homepage": "https://github.com/badoo/THEPageControl", 7 | "screenshots": "https://raw.githubusercontent.com/badoo/THEPageControl/master/readme_images/example.gif", 8 | "license": { 9 | "type": "MIT" 10 | }, 11 | "authors": { 12 | "Igor Kashkuta": "ikashkuta@gmail.com" 13 | }, 14 | "platforms": { 15 | "ios": "8.0" 16 | }, 17 | "source": { 18 | "git": "https://github.com/badoo/THEPageControl.git", 19 | "tag": "1.2.0" 20 | }, 21 | "source_files": "THEPageControl/Source/**/*.{h,m,swift}", 22 | "public_header_files": "THEPageControl/Source/**/*.h", 23 | "requires_arc": true 24 | } 25 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/THEPageControl/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 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/Pods-THEPageControlApp/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 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/THEPageControl/THEPageControl-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.2.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp-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 | -------------------------------------------------------------------------------- /THEPageControl.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "THEPageControl" 3 | s.version = "1.2.0" 4 | s.summary = "Simple and flexible page control" 5 | s.description = <<-DESC 6 | Simple to use page control written in Swift. Provides full customization per dot. 7 | Includes automatic intermediate state resolution for smooth transitions. 8 | DESC 9 | s.homepage = "https://github.com/badoo/THEPageControl" 10 | s.screenshots = "https://raw.githubusercontent.com/badoo/THEPageControl/master/readme_images/example.gif" 11 | s.license = { :type => "MIT" } 12 | s.authors = { "Igor Kashkuta" => "ikashkuta@gmail.com" } 13 | s.platform = :ios, "8.0" 14 | s.source = { :path => "./" } 15 | s.source = { :git => "https://github.com/badoo/THEPageControl.git", :tag => "#{s.version}" } 16 | s.source_files = "THEPageControl/Source/**/*.{h,m,swift}" 17 | s.public_header_files = "THEPageControl/Source/**/*.h" 18 | s.requires_arc = true 19 | end 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Badoo Development 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## THEPageControl 5 | 6 | The MIT License (MIT) 7 | 8 | Copyright (c) 2017 Badoo Development 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | Generated by CocoaPods - https://cocoapods.org 29 | -------------------------------------------------------------------------------- /THEPageControlApp/THEPageControlApp/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /THEPageControlApp/THEPageControlApp/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | /* 2 | The MIT License (MIT) 3 | Copyright (c) 2015-present Badoo Trading Limited. 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 17 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 18 | THE SOFTWARE. 19 | */ 20 | 21 | import UIKit 22 | 23 | @UIApplicationMain 24 | class AppDelegate: UIResponder, UIApplicationDelegate { 25 | 26 | var window: UIWindow? 27 | 28 | func application( 29 | _ application: UIApplication, 30 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 31 | ) -> Bool { 32 | return true 33 | } 34 | } 35 | 36 | -------------------------------------------------------------------------------- /THEPageControlApp/THEPageControlApp/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 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /THEPageControl/Source/THEPageControl.h: -------------------------------------------------------------------------------- 1 | /* 2 | The MIT License (MIT) 3 | Copyright (c) 2015-present Badoo Trading Limited. 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 17 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 18 | THE SOFTWARE. 19 | */ 20 | 21 | @import UIKit; 22 | 23 | //! Project version number for THEPageControl. 24 | FOUNDATION_EXPORT double THEPageControlVersionNumber; 25 | 26 | //! Project version string for THEPageControl. 27 | FOUNDATION_EXPORT const unsigned char THEPageControlVersionString[]; 28 | 29 | // In this header, you should import all the public headers of your framework using statements like #import 30 | 31 | 32 | -------------------------------------------------------------------------------- /THEPageControlApp/THEPageControlApp/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 | -------------------------------------------------------------------------------- /THEPageControlApp/THEPageControlApp/Base.lproj/LaunchScreen.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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # THEPageControl 2 | 3 | *THEPageControl* is a nice page control written in Swift. 4 | 5 |
6 | 7 |
8 | 9 | ## Features 10 | - Full control over each dot. 11 | - Horizontal & vertical layouts with optional paddings. Works well with Auto Layout. 12 | - Interactive non-discrete active index change so you can do nice transitions. 13 | 14 | ## How to use 15 | 16 | ```swift 17 | let pageControl = PageControl() 18 | pageControl.dots = Array(repeating: .default, count: 10) 19 | pageControl.configuration.spacing = 10 20 | 21 | // If you want to customize dots you usually create a new dot style: 22 | 23 | extension PageControl.Dot { 24 | 25 | static var customStyle: PageControl.Dot { 26 | return PageControl.Dot( 27 | regularStyle: .init( 28 | radius: 10, 29 | fillColor: .red, 30 | strokeColor: .black, 31 | strokeWidth: 10 32 | ), 33 | activeStyle: .init( 34 | radius: 10, 35 | fillColor: .red, 36 | strokeColor: .black, 37 | strokeWidth: 5 38 | ) 39 | ) 40 | } 41 | } 42 | 43 | // And then you can use the new style to fill `dots` array: 44 | 45 | let pageControl = PageControl() 46 | pageControl.dots = [ .default, .customStyle, .default ] 47 | ``` 48 | 49 | ## How to install 50 | 51 | ### Manually 52 | THEPageControl is a single-file component - just copy it into your project! 53 | 54 | ### CocoaPods 55 | 1. Make sure `use_frameworks!` is added to your `Podfile`. 56 | 2. Include the following in your `Podfile`: 57 | ``` 58 | pod 'THEPageControl', '= 1.0.0' 59 | ``` 60 | If you like living on the bleeding edge, you can use the `master` branch with: 61 | ``` 62 | pod 'THEPageControl', :git => 'https://github.com/badoo/THEPageControl', :branch => 'master' 63 | ``` 64 | 3. Run `pod install` 65 | 66 | ## License 67 | Source code is distributed under MIT license. 68 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp-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 | The MIT License (MIT) 18 | 19 | Copyright (c) 2017 Badoo Development 20 | 21 | Permission is hereby granted, free of charge, to any person obtaining a copy 22 | of this software and associated documentation files (the "Software"), to deal 23 | in the Software without restriction, including without limitation the rights 24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 25 | copies of the Software, and to permit persons to whom the Software is 26 | furnished to do so, subject to the following conditions: 27 | 28 | The above copyright notice and this permission notice shall be included in all 29 | copies or substantial portions of the Software. 30 | 31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 37 | SOFTWARE. 38 | 39 | License 40 | MIT 41 | Title 42 | THEPageControl 43 | Type 44 | PSGroupSpecifier 45 | 46 | 47 | FooterText 48 | Generated by CocoaPods - https://cocoapods.org 49 | Title 50 | 51 | Type 52 | PSGroupSpecifier 53 | 54 | 55 | StringsTable 56 | Acknowledgements 57 | Title 58 | Acknowledgements 59 | 60 | 61 | -------------------------------------------------------------------------------- /THEPageControl/THEPageControl.xcodeproj/xcshareddata/xcschemes/THEPageControl.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 54 | 60 | 61 | 67 | 68 | 69 | 70 | 72 | 73 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /THEPageControl/Tests/THEPageControlTests.swift: -------------------------------------------------------------------------------- 1 | /* 2 | The MIT License (MIT) 3 | Copyright (c) 2015-present Badoo Trading Limited. 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 17 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 18 | THE SOFTWARE. 19 | */ 20 | 21 | import XCTest 22 | @testable import THEPageControl 23 | 24 | class PageControlTests: XCTestCase { 25 | 26 | var pageControl: PageControl! 27 | 28 | override func setUp() { 29 | super.setUp() 30 | self.pageControl = PageControl() 31 | } 32 | 33 | override func tearDown() { 34 | self.pageControl = nil 35 | super.tearDown() 36 | } 37 | 38 | func test_PageControl_ClampsIndex() { 39 | self.pageControl.dots = Array(repeating: .default, count: 5) 40 | 41 | self.pageControl.activeDotIndex = -1 42 | XCTAssertEqual(self.pageControl.activeDotIndex, 0) 43 | 44 | self.pageControl.activeDotIndex = 100 45 | XCTAssertEqual(self.pageControl.activeDotIndex, Float(self.pageControl.dots.count - 1)) 46 | } 47 | 48 | func test_PageControl_SetIndexCorrectly() { 49 | self.pageControl.dots = Array(repeating: .default, count: 5) 50 | let index: Float = 3 51 | self.pageControl.setActiveDotIndex(index, animated: false) 52 | XCTAssertEqual(self.pageControl.activeDotIndex, index) 53 | } 54 | 55 | func test_PageControl_DoesHorizontalSizingCorrectly() { 56 | let configuration = PageControl.Configuration.default 57 | let dot = PageControl.Dot.default 58 | let dots: [PageControl.Dot] = Array(repeating: dot, count: 3) 59 | 60 | var expectedWidth: CGFloat = configuration.paddings.left 61 | expectedWidth += configuration.spacing * CGFloat(dots.count - 1) 62 | expectedWidth += CGFloat(dot.regularStyle.radius) * 2 * CGFloat(dots.count - 1) 63 | expectedWidth += CGFloat(dot.activeStyle.radius) * 2 64 | expectedWidth += configuration.paddings.right 65 | 66 | var expectedHeight: CGFloat = configuration.paddings.top 67 | expectedHeight += CGFloat(dot.activeStyle.radius) * 2 68 | expectedHeight += configuration.paddings.bottom 69 | 70 | self.pageControl.dots = dots 71 | self.pageControl.configuration = configuration 72 | self.pageControl.layoutIfNeeded() 73 | 74 | XCTAssertEqual(self.pageControl.frame.size.width, expectedWidth) 75 | XCTAssertEqual(self.pageControl.frame.size.height, expectedHeight) 76 | } 77 | 78 | func test_PageControl_DoesVerticalSizingCorrectly() { 79 | var configuration = PageControl.Configuration.default 80 | configuration.layoutAxis = .vertical 81 | let dot = PageControl.Dot.default 82 | let dots: [PageControl.Dot] = Array(repeating: dot, count: 3) 83 | 84 | var expectedHeight: CGFloat = configuration.paddings.top 85 | expectedHeight += configuration.spacing * CGFloat(dots.count - 1) 86 | expectedHeight += CGFloat(dot.regularStyle.radius) * 2 * CGFloat(dots.count - 1) 87 | expectedHeight += CGFloat(dot.activeStyle.radius) * 2 88 | expectedHeight += configuration.paddings.bottom 89 | 90 | var expectedWidth: CGFloat = configuration.paddings.left 91 | expectedWidth += CGFloat(dot.activeStyle.radius) * 2 92 | expectedWidth += configuration.paddings.right 93 | 94 | self.pageControl.dots = dots 95 | self.pageControl.configuration = configuration 96 | self.pageControl.layoutIfNeeded() 97 | 98 | XCTAssertEqual(self.pageControl.frame.size.width, expectedWidth) 99 | XCTAssertEqual(self.pageControl.frame.size.height, expectedHeight) 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 12 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 13 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 14 | 15 | case "${TARGETED_DEVICE_FAMILY}" in 16 | 1,2) 17 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 18 | ;; 19 | 1) 20 | TARGET_DEVICE_ARGS="--target-device iphone" 21 | ;; 22 | 2) 23 | TARGET_DEVICE_ARGS="--target-device ipad" 24 | ;; 25 | 3) 26 | TARGET_DEVICE_ARGS="--target-device tv" 27 | ;; 28 | 4) 29 | TARGET_DEVICE_ARGS="--target-device watch" 30 | ;; 31 | *) 32 | TARGET_DEVICE_ARGS="--target-device mac" 33 | ;; 34 | esac 35 | 36 | install_resource() 37 | { 38 | if [[ "$1" = /* ]] ; then 39 | RESOURCE_PATH="$1" 40 | else 41 | RESOURCE_PATH="${PODS_ROOT}/$1" 42 | fi 43 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 44 | cat << EOM 45 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 46 | EOM 47 | exit 1 48 | fi 49 | case $RESOURCE_PATH in 50 | *.storyboard) 51 | 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 52 | 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} 53 | ;; 54 | *.xib) 55 | 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 56 | 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} 57 | ;; 58 | *.framework) 59 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 60 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 61 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 62 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 63 | ;; 64 | *.xcdatamodel) 65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 67 | ;; 68 | *.xcdatamodeld) 69 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 70 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 71 | ;; 72 | *.xcmappingmodel) 73 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 74 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 75 | ;; 76 | *.xcassets) 77 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 78 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 79 | ;; 80 | *) 81 | echo "$RESOURCE_PATH" || true 82 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 83 | ;; 84 | esac 85 | } 86 | 87 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 88 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 89 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 90 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 91 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 92 | fi 93 | rm -f "$RESOURCES_TO_COPY" 94 | 95 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 96 | then 97 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 98 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 99 | while read line; do 100 | if [[ $line != "${PODS_ROOT}*" ]]; then 101 | XCASSET_FILES+=("$line") 102 | fi 103 | done <<<"$OTHER_XCASSETS" 104 | 105 | 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}" 106 | fi 107 | -------------------------------------------------------------------------------- /THEPageControlApp/THEPageControlApp/ViewController.swift: -------------------------------------------------------------------------------- 1 | /* 2 | The MIT License (MIT) 3 | Copyright (c) 2015-present Badoo Trading Limited. 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 17 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 18 | THE SOFTWARE. 19 | */ 20 | 21 | import UIKit 22 | import THEPageControl 23 | 24 | extension PageControl.Dot { 25 | 26 | static var customStyle1: PageControl.Dot { 27 | let regularStyle = PageControl.Dot.Style( 28 | radius: 10, 29 | fillColor: .red, 30 | strokeColor: .black, 31 | strokeWidth: 10 32 | ) 33 | 34 | let activeStyle = PageControl.Dot.Style( 35 | radius: 10, 36 | fillColor: .red, 37 | strokeColor: .black, 38 | strokeWidth: 5 39 | ) 40 | 41 | return PageControl.Dot( 42 | regularStyle: regularStyle, 43 | activeStyle: activeStyle 44 | ) 45 | } 46 | 47 | static var customStyle2: PageControl.Dot { 48 | let regularStyle = PageControl.Dot.Style( 49 | radius: 10, 50 | fillColor: (UIColor.gray).withAlphaComponent(0.5), 51 | strokeColor: .clear, 52 | strokeWidth: 0 53 | ) 54 | 55 | let activeStyle = PageControl.Dot.Style( 56 | radius: 15, 57 | fillColor: .gray, 58 | strokeColor: .clear, 59 | strokeWidth: 0 60 | ) 61 | 62 | return PageControl.Dot( 63 | regularStyle: regularStyle, 64 | activeStyle: activeStyle 65 | ) 66 | } 67 | 68 | static var customStyle3: PageControl.Dot { 69 | let regularStyle = PageControl.Dot.Style( 70 | radius: 10, 71 | fillColor: (UIColor.orange).withAlphaComponent(0.5), 72 | strokeColor: .clear, 73 | strokeWidth: 0 74 | ) 75 | 76 | let activeStyle = PageControl.Dot.Style( 77 | radius: 15, 78 | fillColor: .orange, 79 | strokeColor: .clear, 80 | strokeWidth: 0 81 | ) 82 | 83 | return PageControl.Dot( 84 | regularStyle: regularStyle, 85 | activeStyle: activeStyle 86 | ) 87 | } 88 | } 89 | 90 | struct DotPresets { 91 | 92 | static var presets: [[PageControl.Dot]] { 93 | return [ 94 | self.preset1, 95 | self.preset2, 96 | self.preset3 97 | ] 98 | } 99 | 100 | static var preset1: [PageControl.Dot] { 101 | return Array(repeating: .default, count: 10) 102 | } 103 | 104 | static var preset2: [PageControl.Dot] { 105 | return Array(repeating: .customStyle1, count: 10) 106 | } 107 | 108 | static var preset3: [PageControl.Dot] { 109 | var result = Array(repeating: PageControl.Dot.customStyle2, count: 9) 110 | result.insert(.customStyle3, at: 0) 111 | return result 112 | } 113 | } 114 | 115 | class ViewController: UIViewController { 116 | 117 | @objc var pageControls = [PageControl]() 118 | @objc var slider: UISlider? 119 | 120 | override func viewDidLoad() { 121 | super.viewDidLoad() 122 | 123 | self.view.backgroundColor = .white 124 | 125 | let slider = UISlider() 126 | slider.frame.size = CGSize(width: 300, height: 50) 127 | slider.center = self.view.center 128 | slider.center.y += 200 129 | slider.addTarget(self, action: #selector(self.onSliderChange), for: .valueChanged) 130 | slider.minimumValue = 0 131 | slider.maximumValue = 10 132 | self.view.addSubview(slider) 133 | self.slider = slider 134 | 135 | var centerY: CGFloat = -200 136 | for preset in DotPresets.presets { 137 | let pageControl = self.makePageControl(dots: preset) 138 | pageControl.translatesAutoresizingMaskIntoConstraints = true 139 | pageControl.center = self.view.center 140 | pageControl.center.y += centerY 141 | self.view.addSubview(pageControl) 142 | centerY += 50 143 | } 144 | } 145 | 146 | private func makePageControl(dots: [PageControl.Dot]) -> PageControl { 147 | let pageControl = PageControl() 148 | pageControl.configuration.paddings = .init(top: 20, left: 20, bottom: 20, right: 20) 149 | pageControl.dots = dots 150 | pageControl.onActiveDotIndexChanged = { [weak self] in 151 | self?.slider?.value = $0 152 | self?.updatePageControls(with: $0, animated: true) 153 | } 154 | self.pageControls.append(pageControl) 155 | return pageControl 156 | } 157 | 158 | @objc 159 | private func onSliderChange(slider: UISlider) { 160 | self.updatePageControls(with: slider.value, animated: false) 161 | } 162 | 163 | private func updatePageControls(with index: Float, animated: Bool) { 164 | self.pageControls.forEach { $0.setActiveDotIndex(index, animated: animated) } 165 | } 166 | } 167 | -------------------------------------------------------------------------------- /THEPageControlApp/Pods/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | warn_missing_arch=${2:-true} 88 | if [ -r "$source" ]; then 89 | # Copy the dSYM into the targets temp dir. 90 | 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}\"" 91 | 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}" 92 | 93 | local basename 94 | basename="$(basename -s .dSYM "$source")" 95 | binary_name="$(ls "$source/Contents/Resources/DWARF")" 96 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" 97 | 98 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 99 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 100 | strip_invalid_archs "$binary" "$warn_missing_arch" 101 | fi 102 | 103 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 104 | # Move the stripped file into its final destination. 105 | 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}\"" 106 | 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}" 107 | else 108 | # 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. 109 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" 110 | fi 111 | fi 112 | } 113 | 114 | # Copies the bcsymbolmap files of a vendored framework 115 | install_bcsymbolmap() { 116 | local bcsymbolmap_path="$1" 117 | local destination="${BUILT_PRODUCTS_DIR}" 118 | 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}"" 119 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 120 | } 121 | 122 | # Signs a framework with the provided identity 123 | code_sign_if_enabled() { 124 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 125 | # Use the current code_sign_identity 126 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 127 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 128 | 129 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 130 | code_sign_cmd="$code_sign_cmd &" 131 | fi 132 | echo "$code_sign_cmd" 133 | eval "$code_sign_cmd" 134 | fi 135 | } 136 | 137 | # Strip invalid architectures 138 | strip_invalid_archs() { 139 | binary="$1" 140 | warn_missing_arch=${2:-true} 141 | # Get architectures for current target binary 142 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 143 | # Intersect them with the architectures we are building for 144 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 145 | # If there are no archs supported by this binary then warn the user 146 | if [[ -z "$intersected_archs" ]]; then 147 | if [[ "$warn_missing_arch" == "true" ]]; then 148 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 149 | fi 150 | STRIP_BINARY_RETVAL=0 151 | return 152 | fi 153 | stripped="" 154 | for arch in $binary_archs; do 155 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 156 | # Strip non-valid architectures in-place 157 | lipo -remove "$arch" -output "$binary" "$binary" 158 | stripped="$stripped $arch" 159 | fi 160 | done 161 | if [[ "$stripped" ]]; then 162 | echo "Stripped $binary of architectures:$stripped" 163 | fi 164 | STRIP_BINARY_RETVAL=1 165 | } 166 | 167 | install_artifact() { 168 | artifact="$1" 169 | base="$(basename "$artifact")" 170 | case $base in 171 | *.framework) 172 | install_framework "$artifact" 173 | ;; 174 | *.dSYM) 175 | # Suppress arch warnings since XCFrameworks will include many dSYM files 176 | install_dsym "$artifact" "false" 177 | ;; 178 | *.bcsymbolmap) 179 | install_bcsymbolmap "$artifact" 180 | ;; 181 | *) 182 | echo "error: Unrecognized artifact "$artifact"" 183 | ;; 184 | esac 185 | } 186 | 187 | copy_artifacts() { 188 | file_list="$1" 189 | while read artifact; do 190 | install_artifact "$artifact" 191 | done <$file_list 192 | } 193 | 194 | ARTIFACT_LIST_FILE="${BUILT_PRODUCTS_DIR}/cocoapods-artifacts-${CONFIGURATION}.txt" 195 | if [ -r "${ARTIFACT_LIST_FILE}" ]; then 196 | copy_artifacts "${ARTIFACT_LIST_FILE}" 197 | fi 198 | 199 | if [[ "$CONFIGURATION" == "Debug" ]]; then 200 | install_framework "${BUILT_PRODUCTS_DIR}/THEPageControl/THEPageControl.framework" 201 | fi 202 | if [[ "$CONFIGURATION" == "Release" ]]; then 203 | install_framework "${BUILT_PRODUCTS_DIR}/THEPageControl/THEPageControl.framework" 204 | fi 205 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 206 | wait 207 | fi 208 | -------------------------------------------------------------------------------- /THEPageControl/THEPageControl.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | A026D9121E6488CE00DD21A7 /* THEPageControl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A026D9081E6488CE00DD21A7 /* THEPageControl.framework */; }; 11 | A026D9171E6488CE00DD21A7 /* THEPageControlTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A026D9161E6488CE00DD21A7 /* THEPageControlTests.swift */; }; 12 | A026D9191E6488CE00DD21A7 /* THEPageControl.h in Headers */ = {isa = PBXBuildFile; fileRef = A026D90B1E6488CE00DD21A7 /* THEPageControl.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | A026D9231E6488E400DD21A7 /* THEPageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A026D9221E6488E400DD21A7 /* THEPageControl.swift */; }; 14 | /* End PBXBuildFile section */ 15 | 16 | /* Begin PBXContainerItemProxy section */ 17 | A026D9131E6488CE00DD21A7 /* PBXContainerItemProxy */ = { 18 | isa = PBXContainerItemProxy; 19 | containerPortal = A026D8FF1E6488CE00DD21A7 /* Project object */; 20 | proxyType = 1; 21 | remoteGlobalIDString = A026D9071E6488CE00DD21A7; 22 | remoteInfo = PageControl; 23 | }; 24 | /* End PBXContainerItemProxy section */ 25 | 26 | /* Begin PBXFileReference section */ 27 | A026D9081E6488CE00DD21A7 /* THEPageControl.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = THEPageControl.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | A026D90B1E6488CE00DD21A7 /* THEPageControl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = THEPageControl.h; sourceTree = ""; }; 29 | A026D90C1E6488CE00DD21A7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 30 | A026D9111E6488CE00DD21A7 /* THEPageControlTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = THEPageControlTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 31 | A026D9161E6488CE00DD21A7 /* THEPageControlTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = THEPageControlTests.swift; sourceTree = ""; }; 32 | A026D9181E6488CE00DD21A7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 33 | A026D9221E6488E400DD21A7 /* THEPageControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = THEPageControl.swift; sourceTree = ""; }; 34 | /* End PBXFileReference section */ 35 | 36 | /* Begin PBXFrameworksBuildPhase section */ 37 | A026D9041E6488CE00DD21A7 /* Frameworks */ = { 38 | isa = PBXFrameworksBuildPhase; 39 | buildActionMask = 2147483647; 40 | files = ( 41 | ); 42 | runOnlyForDeploymentPostprocessing = 0; 43 | }; 44 | A026D90E1E6488CE00DD21A7 /* Frameworks */ = { 45 | isa = PBXFrameworksBuildPhase; 46 | buildActionMask = 2147483647; 47 | files = ( 48 | A026D9121E6488CE00DD21A7 /* THEPageControl.framework in Frameworks */, 49 | ); 50 | runOnlyForDeploymentPostprocessing = 0; 51 | }; 52 | /* End PBXFrameworksBuildPhase section */ 53 | 54 | /* Begin PBXGroup section */ 55 | A026D8FE1E6488CE00DD21A7 = { 56 | isa = PBXGroup; 57 | children = ( 58 | A026D90A1E6488CE00DD21A7 /* Source */, 59 | A026D9151E6488CE00DD21A7 /* Tests */, 60 | A026D9091E6488CE00DD21A7 /* Products */, 61 | ); 62 | sourceTree = ""; 63 | }; 64 | A026D9091E6488CE00DD21A7 /* Products */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | A026D9081E6488CE00DD21A7 /* THEPageControl.framework */, 68 | A026D9111E6488CE00DD21A7 /* THEPageControlTests.xctest */, 69 | ); 70 | name = Products; 71 | sourceTree = ""; 72 | }; 73 | A026D90A1E6488CE00DD21A7 /* Source */ = { 74 | isa = PBXGroup; 75 | children = ( 76 | A026D9221E6488E400DD21A7 /* THEPageControl.swift */, 77 | A026D90B1E6488CE00DD21A7 /* THEPageControl.h */, 78 | A026D90C1E6488CE00DD21A7 /* Info.plist */, 79 | ); 80 | path = Source; 81 | sourceTree = SOURCE_ROOT; 82 | }; 83 | A026D9151E6488CE00DD21A7 /* Tests */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | A026D9161E6488CE00DD21A7 /* THEPageControlTests.swift */, 87 | A026D9181E6488CE00DD21A7 /* Info.plist */, 88 | ); 89 | path = Tests; 90 | sourceTree = SOURCE_ROOT; 91 | }; 92 | /* End PBXGroup section */ 93 | 94 | /* Begin PBXHeadersBuildPhase section */ 95 | A026D9051E6488CE00DD21A7 /* Headers */ = { 96 | isa = PBXHeadersBuildPhase; 97 | buildActionMask = 2147483647; 98 | files = ( 99 | A026D9191E6488CE00DD21A7 /* THEPageControl.h in Headers */, 100 | ); 101 | runOnlyForDeploymentPostprocessing = 0; 102 | }; 103 | /* End PBXHeadersBuildPhase section */ 104 | 105 | /* Begin PBXNativeTarget section */ 106 | A026D9071E6488CE00DD21A7 /* THEPageControl */ = { 107 | isa = PBXNativeTarget; 108 | buildConfigurationList = A026D91C1E6488CE00DD21A7 /* Build configuration list for PBXNativeTarget "THEPageControl" */; 109 | buildPhases = ( 110 | A026D9031E6488CE00DD21A7 /* Sources */, 111 | A026D9041E6488CE00DD21A7 /* Frameworks */, 112 | A026D9051E6488CE00DD21A7 /* Headers */, 113 | A026D9061E6488CE00DD21A7 /* Resources */, 114 | ); 115 | buildRules = ( 116 | ); 117 | dependencies = ( 118 | ); 119 | name = THEPageControl; 120 | productName = PageControl; 121 | productReference = A026D9081E6488CE00DD21A7 /* THEPageControl.framework */; 122 | productType = "com.apple.product-type.framework"; 123 | }; 124 | A026D9101E6488CE00DD21A7 /* THEPageControlTests */ = { 125 | isa = PBXNativeTarget; 126 | buildConfigurationList = A026D91F1E6488CE00DD21A7 /* Build configuration list for PBXNativeTarget "THEPageControlTests" */; 127 | buildPhases = ( 128 | A026D90D1E6488CE00DD21A7 /* Sources */, 129 | A026D90E1E6488CE00DD21A7 /* Frameworks */, 130 | A026D90F1E6488CE00DD21A7 /* Resources */, 131 | ); 132 | buildRules = ( 133 | ); 134 | dependencies = ( 135 | A026D9141E6488CE00DD21A7 /* PBXTargetDependency */, 136 | ); 137 | name = THEPageControlTests; 138 | productName = PageControlTests; 139 | productReference = A026D9111E6488CE00DD21A7 /* THEPageControlTests.xctest */; 140 | productType = "com.apple.product-type.bundle.unit-test"; 141 | }; 142 | /* End PBXNativeTarget section */ 143 | 144 | /* Begin PBXProject section */ 145 | A026D8FF1E6488CE00DD21A7 /* Project object */ = { 146 | isa = PBXProject; 147 | attributes = { 148 | LastSwiftUpdateCheck = 0820; 149 | LastUpgradeCheck = 0820; 150 | ORGANIZATIONNAME = Badoo; 151 | TargetAttributes = { 152 | A026D9071E6488CE00DD21A7 = { 153 | CreatedOnToolsVersion = 8.2.1; 154 | LastSwiftMigration = 0820; 155 | ProvisioningStyle = Automatic; 156 | }; 157 | A026D9101E6488CE00DD21A7 = { 158 | CreatedOnToolsVersion = 8.2.1; 159 | ProvisioningStyle = Automatic; 160 | }; 161 | }; 162 | }; 163 | buildConfigurationList = A026D9021E6488CE00DD21A7 /* Build configuration list for PBXProject "THEPageControl" */; 164 | compatibilityVersion = "Xcode 3.2"; 165 | developmentRegion = English; 166 | hasScannedForEncodings = 0; 167 | knownRegions = ( 168 | en, 169 | ); 170 | mainGroup = A026D8FE1E6488CE00DD21A7; 171 | productRefGroup = A026D9091E6488CE00DD21A7 /* Products */; 172 | projectDirPath = ""; 173 | projectRoot = ""; 174 | targets = ( 175 | A026D9071E6488CE00DD21A7 /* THEPageControl */, 176 | A026D9101E6488CE00DD21A7 /* THEPageControlTests */, 177 | ); 178 | }; 179 | /* End PBXProject section */ 180 | 181 | /* Begin PBXResourcesBuildPhase section */ 182 | A026D9061E6488CE00DD21A7 /* Resources */ = { 183 | isa = PBXResourcesBuildPhase; 184 | buildActionMask = 2147483647; 185 | files = ( 186 | ); 187 | runOnlyForDeploymentPostprocessing = 0; 188 | }; 189 | A026D90F1E6488CE00DD21A7 /* Resources */ = { 190 | isa = PBXResourcesBuildPhase; 191 | buildActionMask = 2147483647; 192 | files = ( 193 | ); 194 | runOnlyForDeploymentPostprocessing = 0; 195 | }; 196 | /* End PBXResourcesBuildPhase section */ 197 | 198 | /* Begin PBXSourcesBuildPhase section */ 199 | A026D9031E6488CE00DD21A7 /* Sources */ = { 200 | isa = PBXSourcesBuildPhase; 201 | buildActionMask = 2147483647; 202 | files = ( 203 | A026D9231E6488E400DD21A7 /* THEPageControl.swift in Sources */, 204 | ); 205 | runOnlyForDeploymentPostprocessing = 0; 206 | }; 207 | A026D90D1E6488CE00DD21A7 /* Sources */ = { 208 | isa = PBXSourcesBuildPhase; 209 | buildActionMask = 2147483647; 210 | files = ( 211 | A026D9171E6488CE00DD21A7 /* THEPageControlTests.swift in Sources */, 212 | ); 213 | runOnlyForDeploymentPostprocessing = 0; 214 | }; 215 | /* End PBXSourcesBuildPhase section */ 216 | 217 | /* Begin PBXTargetDependency section */ 218 | A026D9141E6488CE00DD21A7 /* PBXTargetDependency */ = { 219 | isa = PBXTargetDependency; 220 | target = A026D9071E6488CE00DD21A7 /* THEPageControl */; 221 | targetProxy = A026D9131E6488CE00DD21A7 /* PBXContainerItemProxy */; 222 | }; 223 | /* End PBXTargetDependency section */ 224 | 225 | /* Begin XCBuildConfiguration section */ 226 | A026D91A1E6488CE00DD21A7 /* Debug */ = { 227 | isa = XCBuildConfiguration; 228 | buildSettings = { 229 | ALWAYS_SEARCH_USER_PATHS = NO; 230 | CLANG_ANALYZER_NONNULL = YES; 231 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 232 | CLANG_CXX_LIBRARY = "libc++"; 233 | CLANG_ENABLE_MODULES = YES; 234 | CLANG_ENABLE_OBJC_ARC = YES; 235 | CLANG_WARN_BOOL_CONVERSION = YES; 236 | CLANG_WARN_CONSTANT_CONVERSION = YES; 237 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 238 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 239 | CLANG_WARN_EMPTY_BODY = YES; 240 | CLANG_WARN_ENUM_CONVERSION = YES; 241 | CLANG_WARN_INFINITE_RECURSION = YES; 242 | CLANG_WARN_INT_CONVERSION = YES; 243 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 244 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 245 | CLANG_WARN_UNREACHABLE_CODE = YES; 246 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 247 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 248 | COPY_PHASE_STRIP = NO; 249 | CURRENT_PROJECT_VERSION = 1; 250 | DEBUG_INFORMATION_FORMAT = dwarf; 251 | ENABLE_STRICT_OBJC_MSGSEND = YES; 252 | ENABLE_TESTABILITY = YES; 253 | GCC_C_LANGUAGE_STANDARD = gnu99; 254 | GCC_DYNAMIC_NO_PIC = NO; 255 | GCC_NO_COMMON_BLOCKS = YES; 256 | GCC_OPTIMIZATION_LEVEL = 0; 257 | GCC_PREPROCESSOR_DEFINITIONS = ( 258 | "DEBUG=1", 259 | "$(inherited)", 260 | ); 261 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 262 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 263 | GCC_WARN_UNDECLARED_SELECTOR = YES; 264 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 265 | GCC_WARN_UNUSED_FUNCTION = YES; 266 | GCC_WARN_UNUSED_VARIABLE = YES; 267 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 268 | MTL_ENABLE_DEBUG_INFO = YES; 269 | ONLY_ACTIVE_ARCH = YES; 270 | SDKROOT = iphoneos; 271 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 272 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 273 | TARGETED_DEVICE_FAMILY = "1,2"; 274 | VERSIONING_SYSTEM = "apple-generic"; 275 | VERSION_INFO_PREFIX = ""; 276 | }; 277 | name = Debug; 278 | }; 279 | A026D91B1E6488CE00DD21A7 /* Release */ = { 280 | isa = XCBuildConfiguration; 281 | buildSettings = { 282 | ALWAYS_SEARCH_USER_PATHS = NO; 283 | CLANG_ANALYZER_NONNULL = YES; 284 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 285 | CLANG_CXX_LIBRARY = "libc++"; 286 | CLANG_ENABLE_MODULES = YES; 287 | CLANG_ENABLE_OBJC_ARC = YES; 288 | CLANG_WARN_BOOL_CONVERSION = YES; 289 | CLANG_WARN_CONSTANT_CONVERSION = YES; 290 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 291 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 292 | CLANG_WARN_EMPTY_BODY = YES; 293 | CLANG_WARN_ENUM_CONVERSION = YES; 294 | CLANG_WARN_INFINITE_RECURSION = YES; 295 | CLANG_WARN_INT_CONVERSION = YES; 296 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 297 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 298 | CLANG_WARN_UNREACHABLE_CODE = YES; 299 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 300 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 301 | COPY_PHASE_STRIP = NO; 302 | CURRENT_PROJECT_VERSION = 1; 303 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 304 | ENABLE_NS_ASSERTIONS = NO; 305 | ENABLE_STRICT_OBJC_MSGSEND = YES; 306 | GCC_C_LANGUAGE_STANDARD = gnu99; 307 | GCC_NO_COMMON_BLOCKS = YES; 308 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 309 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 310 | GCC_WARN_UNDECLARED_SELECTOR = YES; 311 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 312 | GCC_WARN_UNUSED_FUNCTION = YES; 313 | GCC_WARN_UNUSED_VARIABLE = YES; 314 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 315 | MTL_ENABLE_DEBUG_INFO = NO; 316 | SDKROOT = iphoneos; 317 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 318 | TARGETED_DEVICE_FAMILY = "1,2"; 319 | VALIDATE_PRODUCT = YES; 320 | VERSIONING_SYSTEM = "apple-generic"; 321 | VERSION_INFO_PREFIX = ""; 322 | }; 323 | name = Release; 324 | }; 325 | A026D91D1E6488CE00DD21A7 /* Debug */ = { 326 | isa = XCBuildConfiguration; 327 | buildSettings = { 328 | CLANG_ENABLE_MODULES = YES; 329 | CODE_SIGN_IDENTITY = ""; 330 | DEFINES_MODULE = YES; 331 | DYLIB_COMPATIBILITY_VERSION = 1; 332 | DYLIB_CURRENT_VERSION = 1; 333 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 334 | INFOPLIST_FILE = Source/Info.plist; 335 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 336 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 337 | PRODUCT_BUNDLE_IDENTIFIER = com.badoo.PageControl; 338 | PRODUCT_NAME = "$(TARGET_NAME)"; 339 | SKIP_INSTALL = YES; 340 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 341 | SWIFT_VERSION = 5.0; 342 | }; 343 | name = Debug; 344 | }; 345 | A026D91E1E6488CE00DD21A7 /* Release */ = { 346 | isa = XCBuildConfiguration; 347 | buildSettings = { 348 | CLANG_ENABLE_MODULES = YES; 349 | CODE_SIGN_IDENTITY = ""; 350 | DEFINES_MODULE = YES; 351 | DYLIB_COMPATIBILITY_VERSION = 1; 352 | DYLIB_CURRENT_VERSION = 1; 353 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 354 | INFOPLIST_FILE = Source/Info.plist; 355 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 356 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 357 | PRODUCT_BUNDLE_IDENTIFIER = com.badoo.PageControl; 358 | PRODUCT_NAME = "$(TARGET_NAME)"; 359 | SKIP_INSTALL = YES; 360 | SWIFT_VERSION = 5.0; 361 | }; 362 | name = Release; 363 | }; 364 | A026D9201E6488CE00DD21A7 /* Debug */ = { 365 | isa = XCBuildConfiguration; 366 | buildSettings = { 367 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 368 | INFOPLIST_FILE = Tests/Info.plist; 369 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 370 | PRODUCT_BUNDLE_IDENTIFIER = com.badoo.PageControlTests; 371 | PRODUCT_NAME = "$(TARGET_NAME)"; 372 | SWIFT_VERSION = 5.0; 373 | }; 374 | name = Debug; 375 | }; 376 | A026D9211E6488CE00DD21A7 /* Release */ = { 377 | isa = XCBuildConfiguration; 378 | buildSettings = { 379 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 380 | INFOPLIST_FILE = Tests/Info.plist; 381 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 382 | PRODUCT_BUNDLE_IDENTIFIER = com.badoo.PageControlTests; 383 | PRODUCT_NAME = "$(TARGET_NAME)"; 384 | SWIFT_VERSION = 5.0; 385 | }; 386 | name = Release; 387 | }; 388 | /* End XCBuildConfiguration section */ 389 | 390 | /* Begin XCConfigurationList section */ 391 | A026D9021E6488CE00DD21A7 /* Build configuration list for PBXProject "THEPageControl" */ = { 392 | isa = XCConfigurationList; 393 | buildConfigurations = ( 394 | A026D91A1E6488CE00DD21A7 /* Debug */, 395 | A026D91B1E6488CE00DD21A7 /* Release */, 396 | ); 397 | defaultConfigurationIsVisible = 0; 398 | defaultConfigurationName = Release; 399 | }; 400 | A026D91C1E6488CE00DD21A7 /* Build configuration list for PBXNativeTarget "THEPageControl" */ = { 401 | isa = XCConfigurationList; 402 | buildConfigurations = ( 403 | A026D91D1E6488CE00DD21A7 /* Debug */, 404 | A026D91E1E6488CE00DD21A7 /* Release */, 405 | ); 406 | defaultConfigurationIsVisible = 0; 407 | defaultConfigurationName = Release; 408 | }; 409 | A026D91F1E6488CE00DD21A7 /* Build configuration list for PBXNativeTarget "THEPageControlTests" */ = { 410 | isa = XCConfigurationList; 411 | buildConfigurations = ( 412 | A026D9201E6488CE00DD21A7 /* Debug */, 413 | A026D9211E6488CE00DD21A7 /* Release */, 414 | ); 415 | defaultConfigurationIsVisible = 0; 416 | defaultConfigurationName = Release; 417 | }; 418 | /* End XCConfigurationList section */ 419 | }; 420 | rootObject = A026D8FF1E6488CE00DD21A7 /* Project object */; 421 | } 422 | -------------------------------------------------------------------------------- /THEPageControlApp/THEPageControlApp.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0E782C727C57A5E5B59E1F05 /* Pods_THEPageControlApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78B3C7952916327F87FCD26B /* Pods_THEPageControlApp.framework */; }; 11 | A0DFADA81E64909E00CB7ECB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0DFADA71E64909E00CB7ECB /* AppDelegate.swift */; }; 12 | A0DFADAA1E64909E00CB7ECB /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0DFADA91E64909E00CB7ECB /* ViewController.swift */; }; 13 | A0DFADAD1E64909E00CB7ECB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A0DFADAB1E64909E00CB7ECB /* Main.storyboard */; }; 14 | A0DFADAF1E64909E00CB7ECB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A0DFADAE1E64909E00CB7ECB /* Assets.xcassets */; }; 15 | A0DFADB21E64909E00CB7ECB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A0DFADB01E64909E00CB7ECB /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXFileReference section */ 19 | 78B3C7952916327F87FCD26B /* Pods_THEPageControlApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_THEPageControlApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 20 | A0DFADA41E64909E00CB7ECB /* THEPageControlApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = THEPageControlApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 21 | A0DFADA71E64909E00CB7ECB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 22 | A0DFADA91E64909E00CB7ECB /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 23 | A0DFADAC1E64909E00CB7ECB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 24 | A0DFADAE1E64909E00CB7ECB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 25 | A0DFADB11E64909E00CB7ECB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 26 | A0DFADB31E64909E00CB7ECB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 27 | BAFD7F0ACF26E5106BB17D50 /* Pods-THEPageControlApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-THEPageControlApp.debug.xcconfig"; path = "Pods/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp.debug.xcconfig"; sourceTree = ""; }; 28 | F67E14EC3CC8AEC5A7D0712A /* Pods-THEPageControlApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-THEPageControlApp.release.xcconfig"; path = "Pods/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp.release.xcconfig"; sourceTree = ""; }; 29 | /* End PBXFileReference section */ 30 | 31 | /* Begin PBXFrameworksBuildPhase section */ 32 | A0DFADA11E64909E00CB7ECB /* Frameworks */ = { 33 | isa = PBXFrameworksBuildPhase; 34 | buildActionMask = 2147483647; 35 | files = ( 36 | 0E782C727C57A5E5B59E1F05 /* Pods_THEPageControlApp.framework in Frameworks */, 37 | ); 38 | runOnlyForDeploymentPostprocessing = 0; 39 | }; 40 | /* End PBXFrameworksBuildPhase section */ 41 | 42 | /* Begin PBXGroup section */ 43 | 27DF03FFBE1D0A1F2378683E /* Frameworks */ = { 44 | isa = PBXGroup; 45 | children = ( 46 | 78B3C7952916327F87FCD26B /* Pods_THEPageControlApp.framework */, 47 | ); 48 | name = Frameworks; 49 | sourceTree = ""; 50 | }; 51 | A0DFAD9B1E64909E00CB7ECB = { 52 | isa = PBXGroup; 53 | children = ( 54 | A0DFADA61E64909E00CB7ECB /* THEPageControlApp */, 55 | A0DFADA51E64909E00CB7ECB /* Products */, 56 | B8BE7108ABAE9CE9BF747B90 /* Pods */, 57 | 27DF03FFBE1D0A1F2378683E /* Frameworks */, 58 | ); 59 | sourceTree = ""; 60 | }; 61 | A0DFADA51E64909E00CB7ECB /* Products */ = { 62 | isa = PBXGroup; 63 | children = ( 64 | A0DFADA41E64909E00CB7ECB /* THEPageControlApp.app */, 65 | ); 66 | name = Products; 67 | sourceTree = ""; 68 | }; 69 | A0DFADA61E64909E00CB7ECB /* THEPageControlApp */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | A0DFADA71E64909E00CB7ECB /* AppDelegate.swift */, 73 | A0DFADA91E64909E00CB7ECB /* ViewController.swift */, 74 | A0DFADAB1E64909E00CB7ECB /* Main.storyboard */, 75 | A0DFADAE1E64909E00CB7ECB /* Assets.xcassets */, 76 | A0DFADB01E64909E00CB7ECB /* LaunchScreen.storyboard */, 77 | A0DFADB31E64909E00CB7ECB /* Info.plist */, 78 | ); 79 | path = THEPageControlApp; 80 | sourceTree = ""; 81 | }; 82 | B8BE7108ABAE9CE9BF747B90 /* Pods */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | BAFD7F0ACF26E5106BB17D50 /* Pods-THEPageControlApp.debug.xcconfig */, 86 | F67E14EC3CC8AEC5A7D0712A /* Pods-THEPageControlApp.release.xcconfig */, 87 | ); 88 | name = Pods; 89 | sourceTree = ""; 90 | }; 91 | /* End PBXGroup section */ 92 | 93 | /* Begin PBXNativeTarget section */ 94 | A0DFADA31E64909E00CB7ECB /* THEPageControlApp */ = { 95 | isa = PBXNativeTarget; 96 | buildConfigurationList = A0DFADB61E64909E00CB7ECB /* Build configuration list for PBXNativeTarget "THEPageControlApp" */; 97 | buildPhases = ( 98 | 9828ABFDD132D11F76E758C1 /* [CP] Check Pods Manifest.lock */, 99 | A0DFADA01E64909E00CB7ECB /* Sources */, 100 | A0DFADA11E64909E00CB7ECB /* Frameworks */, 101 | A0DFADA21E64909E00CB7ECB /* Resources */, 102 | DFDE91D55E6ECE2FEF6C5B91 /* [CP] Embed Pods Frameworks */, 103 | ); 104 | buildRules = ( 105 | ); 106 | dependencies = ( 107 | ); 108 | name = THEPageControlApp; 109 | productName = PageControlApp; 110 | productReference = A0DFADA41E64909E00CB7ECB /* THEPageControlApp.app */; 111 | productType = "com.apple.product-type.application"; 112 | }; 113 | /* End PBXNativeTarget section */ 114 | 115 | /* Begin PBXProject section */ 116 | A0DFAD9C1E64909E00CB7ECB /* Project object */ = { 117 | isa = PBXProject; 118 | attributes = { 119 | LastSwiftUpdateCheck = 0820; 120 | LastUpgradeCheck = 0910; 121 | ORGANIZATIONNAME = Badoo; 122 | TargetAttributes = { 123 | A0DFADA31E64909E00CB7ECB = { 124 | CreatedOnToolsVersion = 8.2.1; 125 | LastSwiftMigration = 0910; 126 | ProvisioningStyle = Automatic; 127 | }; 128 | }; 129 | }; 130 | buildConfigurationList = A0DFAD9F1E64909E00CB7ECB /* Build configuration list for PBXProject "THEPageControlApp" */; 131 | compatibilityVersion = "Xcode 3.2"; 132 | developmentRegion = English; 133 | hasScannedForEncodings = 0; 134 | knownRegions = ( 135 | English, 136 | en, 137 | Base, 138 | ); 139 | mainGroup = A0DFAD9B1E64909E00CB7ECB; 140 | productRefGroup = A0DFADA51E64909E00CB7ECB /* Products */; 141 | projectDirPath = ""; 142 | projectRoot = ""; 143 | targets = ( 144 | A0DFADA31E64909E00CB7ECB /* THEPageControlApp */, 145 | ); 146 | }; 147 | /* End PBXProject section */ 148 | 149 | /* Begin PBXResourcesBuildPhase section */ 150 | A0DFADA21E64909E00CB7ECB /* Resources */ = { 151 | isa = PBXResourcesBuildPhase; 152 | buildActionMask = 2147483647; 153 | files = ( 154 | A0DFADB21E64909E00CB7ECB /* LaunchScreen.storyboard in Resources */, 155 | A0DFADAF1E64909E00CB7ECB /* Assets.xcassets in Resources */, 156 | A0DFADAD1E64909E00CB7ECB /* Main.storyboard in Resources */, 157 | ); 158 | runOnlyForDeploymentPostprocessing = 0; 159 | }; 160 | /* End PBXResourcesBuildPhase section */ 161 | 162 | /* Begin PBXShellScriptBuildPhase section */ 163 | 9828ABFDD132D11F76E758C1 /* [CP] Check Pods Manifest.lock */ = { 164 | isa = PBXShellScriptBuildPhase; 165 | buildActionMask = 2147483647; 166 | files = ( 167 | ); 168 | inputPaths = ( 169 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 170 | "${PODS_ROOT}/Manifest.lock", 171 | ); 172 | name = "[CP] Check Pods Manifest.lock"; 173 | outputPaths = ( 174 | "$(DERIVED_FILE_DIR)/Pods-THEPageControlApp-checkManifestLockResult.txt", 175 | ); 176 | runOnlyForDeploymentPostprocessing = 0; 177 | shellPath = /bin/sh; 178 | 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"; 179 | showEnvVarsInLog = 0; 180 | }; 181 | DFDE91D55E6ECE2FEF6C5B91 /* [CP] Embed Pods Frameworks */ = { 182 | isa = PBXShellScriptBuildPhase; 183 | buildActionMask = 2147483647; 184 | files = ( 185 | ); 186 | inputPaths = ( 187 | "${PODS_ROOT}/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp-frameworks.sh", 188 | "${BUILT_PRODUCTS_DIR}/THEPageControl/THEPageControl.framework", 189 | ); 190 | name = "[CP] Embed Pods Frameworks"; 191 | outputPaths = ( 192 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/THEPageControl.framework", 193 | ); 194 | runOnlyForDeploymentPostprocessing = 0; 195 | shellPath = /bin/sh; 196 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp-frameworks.sh\"\n"; 197 | showEnvVarsInLog = 0; 198 | }; 199 | /* End PBXShellScriptBuildPhase section */ 200 | 201 | /* Begin PBXSourcesBuildPhase section */ 202 | A0DFADA01E64909E00CB7ECB /* Sources */ = { 203 | isa = PBXSourcesBuildPhase; 204 | buildActionMask = 2147483647; 205 | files = ( 206 | A0DFADAA1E64909E00CB7ECB /* ViewController.swift in Sources */, 207 | A0DFADA81E64909E00CB7ECB /* AppDelegate.swift in Sources */, 208 | ); 209 | runOnlyForDeploymentPostprocessing = 0; 210 | }; 211 | /* End PBXSourcesBuildPhase section */ 212 | 213 | /* Begin PBXVariantGroup section */ 214 | A0DFADAB1E64909E00CB7ECB /* Main.storyboard */ = { 215 | isa = PBXVariantGroup; 216 | children = ( 217 | A0DFADAC1E64909E00CB7ECB /* Base */, 218 | ); 219 | name = Main.storyboard; 220 | sourceTree = ""; 221 | }; 222 | A0DFADB01E64909E00CB7ECB /* LaunchScreen.storyboard */ = { 223 | isa = PBXVariantGroup; 224 | children = ( 225 | A0DFADB11E64909E00CB7ECB /* Base */, 226 | ); 227 | name = LaunchScreen.storyboard; 228 | sourceTree = ""; 229 | }; 230 | /* End PBXVariantGroup section */ 231 | 232 | /* Begin XCBuildConfiguration section */ 233 | A0DFADB41E64909E00CB7ECB /* Debug */ = { 234 | isa = XCBuildConfiguration; 235 | buildSettings = { 236 | ALWAYS_SEARCH_USER_PATHS = NO; 237 | CLANG_ANALYZER_NONNULL = YES; 238 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 239 | CLANG_CXX_LIBRARY = "libc++"; 240 | CLANG_ENABLE_MODULES = YES; 241 | CLANG_ENABLE_OBJC_ARC = YES; 242 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 243 | CLANG_WARN_BOOL_CONVERSION = YES; 244 | CLANG_WARN_COMMA = YES; 245 | CLANG_WARN_CONSTANT_CONVERSION = YES; 246 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 247 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 248 | CLANG_WARN_EMPTY_BODY = YES; 249 | CLANG_WARN_ENUM_CONVERSION = YES; 250 | CLANG_WARN_INFINITE_RECURSION = YES; 251 | CLANG_WARN_INT_CONVERSION = YES; 252 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 253 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 254 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 255 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 256 | CLANG_WARN_STRICT_PROTOTYPES = YES; 257 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 258 | CLANG_WARN_UNREACHABLE_CODE = YES; 259 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 260 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 261 | COPY_PHASE_STRIP = NO; 262 | DEBUG_INFORMATION_FORMAT = dwarf; 263 | ENABLE_STRICT_OBJC_MSGSEND = YES; 264 | ENABLE_TESTABILITY = YES; 265 | GCC_C_LANGUAGE_STANDARD = gnu99; 266 | GCC_DYNAMIC_NO_PIC = NO; 267 | GCC_NO_COMMON_BLOCKS = YES; 268 | GCC_OPTIMIZATION_LEVEL = 0; 269 | GCC_PREPROCESSOR_DEFINITIONS = ( 270 | "DEBUG=1", 271 | "$(inherited)", 272 | ); 273 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 274 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 275 | GCC_WARN_UNDECLARED_SELECTOR = YES; 276 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 277 | GCC_WARN_UNUSED_FUNCTION = YES; 278 | GCC_WARN_UNUSED_VARIABLE = YES; 279 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 280 | MTL_ENABLE_DEBUG_INFO = YES; 281 | ONLY_ACTIVE_ARCH = YES; 282 | SDKROOT = iphoneos; 283 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 284 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 285 | TARGETED_DEVICE_FAMILY = "1,2"; 286 | }; 287 | name = Debug; 288 | }; 289 | A0DFADB51E64909E00CB7ECB /* Release */ = { 290 | isa = XCBuildConfiguration; 291 | buildSettings = { 292 | ALWAYS_SEARCH_USER_PATHS = NO; 293 | CLANG_ANALYZER_NONNULL = YES; 294 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 295 | CLANG_CXX_LIBRARY = "libc++"; 296 | CLANG_ENABLE_MODULES = YES; 297 | CLANG_ENABLE_OBJC_ARC = YES; 298 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 299 | CLANG_WARN_BOOL_CONVERSION = YES; 300 | CLANG_WARN_COMMA = YES; 301 | CLANG_WARN_CONSTANT_CONVERSION = YES; 302 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 303 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 304 | CLANG_WARN_EMPTY_BODY = YES; 305 | CLANG_WARN_ENUM_CONVERSION = YES; 306 | CLANG_WARN_INFINITE_RECURSION = YES; 307 | CLANG_WARN_INT_CONVERSION = YES; 308 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 309 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 310 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 311 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 312 | CLANG_WARN_STRICT_PROTOTYPES = YES; 313 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 314 | CLANG_WARN_UNREACHABLE_CODE = YES; 315 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 316 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 317 | COPY_PHASE_STRIP = NO; 318 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 319 | ENABLE_NS_ASSERTIONS = NO; 320 | ENABLE_STRICT_OBJC_MSGSEND = YES; 321 | GCC_C_LANGUAGE_STANDARD = gnu99; 322 | GCC_NO_COMMON_BLOCKS = YES; 323 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 324 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 325 | GCC_WARN_UNDECLARED_SELECTOR = YES; 326 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 327 | GCC_WARN_UNUSED_FUNCTION = YES; 328 | GCC_WARN_UNUSED_VARIABLE = YES; 329 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 330 | MTL_ENABLE_DEBUG_INFO = NO; 331 | SDKROOT = iphoneos; 332 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 333 | TARGETED_DEVICE_FAMILY = "1,2"; 334 | VALIDATE_PRODUCT = YES; 335 | }; 336 | name = Release; 337 | }; 338 | A0DFADB71E64909E00CB7ECB /* Debug */ = { 339 | isa = XCBuildConfiguration; 340 | baseConfigurationReference = BAFD7F0ACF26E5106BB17D50 /* Pods-THEPageControlApp.debug.xcconfig */; 341 | buildSettings = { 342 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 343 | INFOPLIST_FILE = "$(SRCROOT)/THEPageControlApp/Info.plist"; 344 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 345 | PRODUCT_BUNDLE_IDENTIFIER = com.badoo.PageControlApp; 346 | PRODUCT_NAME = "$(TARGET_NAME)"; 347 | SWIFT_VERSION = 5.0; 348 | }; 349 | name = Debug; 350 | }; 351 | A0DFADB81E64909E00CB7ECB /* Release */ = { 352 | isa = XCBuildConfiguration; 353 | baseConfigurationReference = F67E14EC3CC8AEC5A7D0712A /* Pods-THEPageControlApp.release.xcconfig */; 354 | buildSettings = { 355 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 356 | INFOPLIST_FILE = "$(SRCROOT)/THEPageControlApp/Info.plist"; 357 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 358 | PRODUCT_BUNDLE_IDENTIFIER = com.badoo.PageControlApp; 359 | PRODUCT_NAME = "$(TARGET_NAME)"; 360 | SWIFT_VERSION = 5.0; 361 | }; 362 | name = Release; 363 | }; 364 | /* End XCBuildConfiguration section */ 365 | 366 | /* Begin XCConfigurationList section */ 367 | A0DFAD9F1E64909E00CB7ECB /* Build configuration list for PBXProject "THEPageControlApp" */ = { 368 | isa = XCConfigurationList; 369 | buildConfigurations = ( 370 | A0DFADB41E64909E00CB7ECB /* Debug */, 371 | A0DFADB51E64909E00CB7ECB /* Release */, 372 | ); 373 | defaultConfigurationIsVisible = 0; 374 | defaultConfigurationName = Release; 375 | }; 376 | A0DFADB61E64909E00CB7ECB /* Build configuration list for PBXNativeTarget "THEPageControlApp" */ = { 377 | isa = XCConfigurationList; 378 | buildConfigurations = ( 379 | A0DFADB71E64909E00CB7ECB /* Debug */, 380 | A0DFADB81E64909E00CB7ECB /* Release */, 381 | ); 382 | defaultConfigurationIsVisible = 0; 383 | defaultConfigurationName = Release; 384 | }; 385 | /* End XCConfigurationList section */ 386 | }; 387 | rootObject = A0DFAD9C1E64909E00CB7ECB /* Project object */; 388 | } 389 | -------------------------------------------------------------------------------- /THEPageControl/Source/THEPageControl.swift: -------------------------------------------------------------------------------- 1 | /* 2 | The MIT License (MIT) 3 | Copyright (c) 2015-present Badoo Trading Limited. 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 17 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 18 | THE SOFTWARE. 19 | */ 20 | 21 | import Foundation 22 | import UIKit 23 | 24 | public class PageControl: UIView { 25 | 26 | // MARK: - Public 27 | 28 | public struct Dot { 29 | public struct Style { 30 | 31 | public enum Shape { 32 | case circle 33 | case square 34 | } 35 | 36 | public var radius: Float 37 | public var fillColor: UIColor 38 | public var strokeColor: UIColor 39 | public var strokeWidth: Float 40 | public var shape: Shape 41 | 42 | public init(radius: Float, 43 | fillColor: UIColor, 44 | strokeColor: UIColor, 45 | strokeWidth: Float, 46 | shape: Shape = .circle) { 47 | self.radius = radius 48 | self.fillColor = fillColor 49 | self.strokeColor = strokeColor 50 | self.strokeWidth = strokeWidth 51 | self.shape = shape 52 | } 53 | } 54 | 55 | public var regularStyle: Style 56 | public var activeStyle: Style 57 | 58 | public init(regularStyle: Style, activeStyle: Style) { 59 | self.regularStyle = regularStyle 60 | self.activeStyle = activeStyle 61 | } 62 | } 63 | 64 | public var dots = [Dot]() { 65 | didSet { 66 | self.reloadDotViews() 67 | } 68 | } 69 | 70 | /// [0..self.dots.count-1] interval, non-integer values will interpolate between sibling dots. Default is 0 71 | @objc public var activeDotIndex: Float = 0 { 72 | didSet { 73 | self.activeDotIndex = self.activeDotIndex.clamped(0, Float(self.dots.count - 1)) 74 | self.updateDotViews() 75 | } 76 | } 77 | 78 | @objc public var onActiveDotIndexChanged: ((Float) -> Void)? = nil 79 | 80 | @objc public func setActiveDotIndex(_ index: Float, animated: Bool) { 81 | if !animated { 82 | self.activeDotIndex = index 83 | return 84 | } 85 | 86 | let oldIndex = self.activeDotIndex 87 | self.activeDotIndexAnimator?.cancel() 88 | self.activeDotIndexAnimator = Animator.animate( 89 | duration: self.configuration.animationDuration, 90 | work: { lerpValue in 91 | self.activeDotIndex = oldIndex + (index - oldIndex) * lerpValue 92 | } 93 | ) 94 | } 95 | 96 | public struct Configuration { 97 | public enum LayoutAxis { 98 | case horizontal 99 | case vertical 100 | } 101 | 102 | public var layoutAxis: LayoutAxis 103 | public var spacing: CGFloat 104 | public var paddings: UIEdgeInsets 105 | public var changesActiveDotOnTap: Bool 106 | public var animationDuration: TimeInterval 107 | 108 | public init(layoutAxis: LayoutAxis, 109 | spacing: CGFloat, 110 | paddings: UIEdgeInsets, 111 | changesActiveDotOnTap: Bool, 112 | animationDuration: TimeInterval) { 113 | self.layoutAxis = layoutAxis 114 | self.spacing = spacing 115 | self.paddings = paddings 116 | self.changesActiveDotOnTap = changesActiveDotOnTap 117 | self.animationDuration = animationDuration 118 | } 119 | } 120 | 121 | /// Default is .default 122 | public var configuration: Configuration = .default { 123 | didSet { 124 | self.reloadTapGestureRecognizer() 125 | self.reloadDotViews() 126 | } 127 | } 128 | 129 | // MARK: - UIView 130 | 131 | public override init(frame: CGRect) { 132 | super.init(frame: frame) 133 | self.commonInit() 134 | } 135 | 136 | public required init?(coder aDecoder: NSCoder) { 137 | super.init(coder: aDecoder) 138 | self.commonInit() 139 | } 140 | 141 | public override func layoutSubviews() { 142 | super.layoutSubviews() 143 | if self.dots.count < 1 { return } 144 | 145 | let rectW: (CGRect) -> CGFloat 146 | let rectH: (CGRect) -> CGFloat 147 | let pointX: (CGPoint) -> CGFloat 148 | let pointY: (CGPoint) -> CGFloat 149 | let pointSetX: (inout CGPoint, CGFloat) -> Void 150 | let pointSetY: (inout CGPoint, CGFloat) -> Void 151 | 152 | switch self.configuration.layoutAxis { 153 | case .horizontal: 154 | rectW = { $0.width } 155 | rectH = { $0.height } 156 | pointX = { $0.x } 157 | pointY = { $0.y } 158 | pointSetX = { $0.x = $1 } 159 | pointSetY = { $0.y = $1 } 160 | case .vertical: 161 | rectW = { $0.height } 162 | rectH = { $0.width } 163 | pointX = { $0.y } 164 | pointY = { $0.x } 165 | pointSetX = { $0.y = $1 } 166 | pointSetY = { $0.x = $1 } 167 | } 168 | 169 | // The algorithm is written for horizontal left-to-right case, any else are just mirroring 170 | 171 | let spacing = self.configuration.spacing 172 | let paddings = self.configuration.paddings 173 | let contentRect = CGRect(x: paddings.left, 174 | y: paddings.top, 175 | width: self.bounds.width - paddings.left - paddings.right, 176 | height: self.bounds.height - paddings.top - paddings.bottom) 177 | var center: CGPoint = contentRect.origin 178 | pointSetX(¢er, pointX(center) - spacing) 179 | pointSetY(¢er, pointY(center) + rectH(contentRect) / 2) 180 | for dotView in self.dotViews { 181 | pointSetX(¢er, pointX(center) + spacing) 182 | 183 | pointSetX(&dotView.center, pointX(center) + rectW(dotView.frame) / 2) 184 | pointSetY(&dotView.center, pointY(center)) 185 | 186 | pointSetX(¢er, pointX(center) + rectW(dotView.frame)) 187 | } 188 | } 189 | 190 | public override func sizeThatFits(_ size: CGSize) -> CGSize { 191 | let spacing = self.configuration.spacing 192 | let initialSize = CGSize(width: -spacing, height: -spacing) 193 | let result = self.dotViews.reduce(initialSize) { result, dotView -> CGSize in 194 | switch self.configuration.layoutAxis { 195 | case .horizontal: return CGSize( 196 | width: result.width + spacing + dotView.frame.size.width, 197 | height: max(result.height, dotView.frame.height) 198 | ) 199 | case .vertical: return CGSize( 200 | width: max(result.width, dotView.frame.size.width), 201 | height: result.height + spacing + dotView.frame.size.height 202 | ) 203 | } 204 | } 205 | let paddings = self.configuration.paddings 206 | return CGSize( 207 | width: paddings.left + result.width + paddings.right, 208 | height: paddings.top + result.height + paddings.bottom 209 | ) 210 | } 211 | 212 | public override func sizeToFit() { 213 | self.frame.size = self.sizeThatFits(self.frame.size) 214 | self.invalidateIntrinsicContentSize() 215 | self.setNeedsLayout() 216 | } 217 | 218 | public override var intrinsicContentSize: CGSize { 219 | return self.sizeThatFits(self.frame.size) 220 | } 221 | 222 | // MARK: - Private 223 | 224 | private var dotViews = [DotView]() 225 | private weak var activeDotIndexAnimator: Animator? = nil 226 | 227 | private lazy var tapGestureRecognizer: UITapGestureRecognizer = { 228 | let recognizer = UITapGestureRecognizer() 229 | recognizer.numberOfTapsRequired = 1 230 | recognizer.numberOfTouchesRequired = 1 231 | recognizer.addTarget(self, action: #selector(self.handleTap)) 232 | return recognizer 233 | }() 234 | 235 | private func commonInit() { 236 | self.translatesAutoresizingMaskIntoConstraints = false 237 | self.activeDotIndex = 0 238 | self.configuration = .default 239 | self.accessibilityIdentifier = "page_control" 240 | } 241 | 242 | private func reloadTapGestureRecognizer() { 243 | if self.configuration.changesActiveDotOnTap { 244 | self.addGestureRecognizer(self.tapGestureRecognizer) 245 | } else { 246 | self.removeGestureRecognizer(self.tapGestureRecognizer) 247 | } 248 | } 249 | 250 | @objc 251 | private func handleTap(recognizer: UITapGestureRecognizer) { 252 | let tapLocation = recognizer.location(in: self) 253 | let paddings = self.configuration.paddings 254 | let center = CGPoint( 255 | x: (self.bounds.width + paddings.left - paddings.right) / 2, 256 | y: (self.bounds.height + paddings.top - paddings.bottom) / 2 257 | ) 258 | 259 | let diff: CGFloat 260 | switch self.configuration.layoutAxis { 261 | case .horizontal: 262 | diff = tapLocation.x - center.x 263 | case .vertical: 264 | diff = tapLocation.y - center.y 265 | } 266 | 267 | let newIndex = round(self.activeDotIndex) + ((diff > 0) ? 1 : -1) 268 | self.setActiveDotIndex(newIndex, animated: true) 269 | self.onActiveDotIndexChanged?(newIndex) 270 | } 271 | 272 | private func reloadDotViews() { 273 | self.dotViews.forEach { $0.removeFromSuperview() } 274 | self.dotViews = self.dots.map { DotView(dot: $0) } 275 | self.dotViews.forEach { self.addSubview($0) } 276 | self.updateDotViews() 277 | self.sizeToFit() 278 | } 279 | 280 | private func updateDotViews() { 281 | self.dotViews.forEach { $0.applyRegularStyle() } 282 | 283 | let floorIdx = Int(floor(self.activeDotIndex)) 284 | let ceilIdx = Int(ceil(self.activeDotIndex)) 285 | let lerpValue = self.activeDotIndex - Float(floorIdx) 286 | 287 | if 0 <= ceilIdx && ceilIdx < self.dotViews.count { 288 | self.dotViews[ceilIdx].applyIntermediateStyle(lerpValue: lerpValue) 289 | } 290 | 291 | if 0 <= floorIdx && floorIdx < self.dotViews.count { 292 | self.dotViews[floorIdx].applyIntermediateStyle(lerpValue: 1 - lerpValue) 293 | } 294 | 295 | self.setNeedsLayout() 296 | } 297 | } 298 | 299 | private class Animator: NSObject { 300 | 301 | @objc @discardableResult 302 | static func animate(duration: TimeInterval, work: @escaping (Float) -> Void) -> Animator { 303 | let animator = Animator(duration: duration, work: work) 304 | animator.run() 305 | return animator 306 | } 307 | 308 | private let duration: TimeInterval 309 | private let work: (Float) -> Void 310 | private var initialTimestamp: TimeInterval? = nil 311 | private var selfHolder: Animator? = nil 312 | private var displayLink: CADisplayLink? = nil 313 | 314 | @objc func cancel() { 315 | self.displayLink?.invalidate() 316 | self.selfHolder = nil 317 | } 318 | 319 | private init(duration: TimeInterval, work: @escaping (Float) -> Void) { 320 | self.duration = duration 321 | self.work = work 322 | super.init() 323 | self.selfHolder = self 324 | } 325 | 326 | private func run() { 327 | self.displayLink = CADisplayLink(target: self, selector: #selector(self.onFire)) 328 | self.displayLink?.add(to: RunLoop.main, forMode: .common) 329 | self.work(0) 330 | } 331 | 332 | @objc 333 | private func onFire(displayLink: CADisplayLink) { 334 | if self.initialTimestamp == nil { 335 | self.initialTimestamp = displayLink.timestamp 336 | } 337 | 338 | let initialTimestamp = self.initialTimestamp! 339 | let lerpValue = (displayLink.timestamp - initialTimestamp) / self.duration 340 | self.work(Float(lerpValue).clamped(0, 1)) 341 | 342 | if displayLink.timestamp - initialTimestamp > self.duration { 343 | self.cancel() 344 | } 345 | } 346 | } 347 | 348 | private extension PageControl { 349 | 350 | class DotView: UIView { 351 | 352 | required init?(coder aDecoder: NSCoder) { 353 | self.dot = .default 354 | super.init(coder: aDecoder) 355 | self.commonInit() 356 | } 357 | 358 | init(dot: Dot) { 359 | self.dot = dot 360 | super.init(frame: .zero) 361 | self.commonInit() 362 | } 363 | 364 | @objc func applyRegularStyle() { 365 | self.applyStyle(style: self.dot.regularStyle) 366 | } 367 | 368 | @objc func applyActiveStyle() { 369 | self.applyStyle(style: self.dot.activeStyle) 370 | } 371 | 372 | /// [0..1] means [regular..active] 373 | @objc func applyIntermediateStyle(lerpValue: Float) { 374 | let blendedStyle = lerpValue.clamped(0, 1).lerp(self.dot.regularStyle, self.dot.activeStyle) 375 | self.applyStyle(style: blendedStyle) 376 | } 377 | 378 | private let dot: Dot 379 | 380 | private func commonInit() { 381 | self.applyRegularStyle() 382 | self.accessibilityIdentifier = "page_control.dot" 383 | } 384 | 385 | private func applyStyle(style: Dot.Style) { 386 | self.frame.size = CGSize(width: CGFloat(style.radius * 2), height: CGFloat(style.radius * 2)) 387 | self.backgroundColor = style.fillColor 388 | switch style.shape { 389 | case .circle: 390 | self.layer.cornerRadius = CGFloat(style.radius) 391 | case .square: 392 | self.layer.cornerRadius = 0 393 | } 394 | self.layer.borderWidth = CGFloat(style.strokeWidth) 395 | self.layer.borderColor = style.strokeColor.cgColor 396 | } 397 | } 398 | } 399 | 400 | private extension Float { 401 | 402 | func clamped(_ min: Float, _ max: Float) -> Float { 403 | return Swift.max(min, Swift.min(self, max)) 404 | } 405 | 406 | func lerp(_ from: Float, _ to: Float) -> Float { 407 | return from + (self.clamped(0, 1) * (to - from)) 408 | } 409 | 410 | func lerp(_ from: CGFloat, _ to: CGFloat) -> CGFloat { 411 | return from + (CGFloat(self.clamped(0, 1)) * (to - from)) 412 | } 413 | 414 | func lerp(_ from: UIColor, _ to: UIColor) -> UIColor { 415 | var (fromRed, fromGreen, fromBlue, fromAlpha): (CGFloat, CGFloat, CGFloat, CGFloat) = (0, 0, 0, 0) 416 | from.getRed(&fromRed, green: &fromGreen, blue: &fromBlue, alpha: &fromAlpha) 417 | 418 | var (toRed, toGreen, toBlue, toAlpha): (CGFloat, CGFloat, CGFloat, CGFloat) = (0, 0, 0, 0) 419 | to.getRed(&toRed, green: &toGreen, blue: &toBlue, alpha: &toAlpha) 420 | 421 | if fromAlpha == 0 { 422 | (fromRed, fromGreen, fromBlue) = (toRed, toGreen, toBlue) 423 | } 424 | 425 | if toAlpha == 0 { 426 | (toRed, toGreen, toBlue) = (fromRed, fromGreen, fromBlue) 427 | } 428 | 429 | return UIColor( 430 | red: self.lerp(fromRed, toRed), 431 | green: self.lerp(fromGreen, toGreen), 432 | blue: self.lerp(fromBlue, toBlue), 433 | alpha: self.lerp(fromAlpha, toAlpha) 434 | ) 435 | } 436 | 437 | func lerp(_ from: PageControl.Dot.Style, _ to: PageControl.Dot.Style) -> PageControl.Dot.Style { 438 | return PageControl.Dot.Style( 439 | radius: self.lerp(from.radius, to.radius), 440 | fillColor: self.lerp(from.fillColor, to.fillColor), 441 | strokeColor: self.lerp(from.strokeColor, to.strokeColor), 442 | strokeWidth: self.lerp(from.strokeWidth, to.strokeWidth), 443 | shape: to.shape 444 | ) 445 | } 446 | } 447 | 448 | extension PageControl.Configuration { 449 | 450 | public static var `default`: PageControl.Configuration { 451 | return PageControl.Configuration( 452 | layoutAxis: .horizontal, 453 | spacing: 5, 454 | paddings: .zero, 455 | changesActiveDotOnTap: true, 456 | animationDuration: 0.15 457 | ) 458 | } 459 | } 460 | 461 | extension PageControl.Dot { 462 | 463 | public static var `default`: PageControl.Dot { 464 | let regularStyle = PageControl.Dot.Style( 465 | radius: 10, 466 | fillColor: .clear, 467 | strokeColor: .black, 468 | strokeWidth: 2 469 | ) 470 | 471 | let activeStyle = PageControl.Dot.Style( 472 | radius: 10, 473 | fillColor: .black, 474 | strokeColor: .clear, 475 | strokeWidth: 0 476 | ) 477 | 478 | return PageControl.Dot( 479 | regularStyle: regularStyle, 480 | activeStyle: activeStyle 481 | ) 482 | } 483 | } 484 | -------------------------------------------------------------------------------- /THEPageControlApp/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 | 8570DD0A77C6C734BBB0CE0EABDEE017 /* Pods-THEPageControlApp-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8EF2ACE4CC45C3425DA14BF0BF6FDCB9 /* Pods-THEPageControlApp-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 8EF8E44129835F53AC67F11239289DB3 /* THEPageControl-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C400F5FCD41E486F3A4C3B13D584C0A6 /* THEPageControl-dummy.m */; }; 12 | 9F4C1FA3FA2E8B44399B13D9A5102DA5 /* THEPageControl-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2535CA40EC412816E1C21BE6508A6932 /* THEPageControl-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | A0FFCFD2F4D3945471CA293FE0A01E19 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; 14 | AE635479F7E8ACB62F1B45CA0C2B1B95 /* THEPageControl.h in Headers */ = {isa = PBXBuildFile; fileRef = 05CAD5E19C4FC0D28B135D19D434353C /* THEPageControl.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | E184900CE836A32974218BEE226E3AA7 /* THEPageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6713D59403E50593F7AD4044C234D961 /* THEPageControl.swift */; }; 16 | ECD82B346157C0B949332F07B5362446 /* Pods-THEPageControlApp-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 69C57A4B4D14E8E6EF8FBF91C301AC3F /* Pods-THEPageControlApp-dummy.m */; }; 17 | F94370343BBC7A26F8726269140CE21F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | 2E54DAF0992F260718EF4A4E1120E05C /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = 86F8C4B2FA7AF93968293C8714C632BD; 26 | remoteInfo = THEPageControl; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 05CAD5E19C4FC0D28B135D19D434353C /* THEPageControl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = THEPageControl.h; path = THEPageControl/Source/THEPageControl.h; sourceTree = ""; }; 32 | 1561902458271B0A06B3F05ABD41EE18 /* THEPageControl.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = THEPageControl.framework; path = THEPageControl.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | 1DB026910F761C07A6CB990BB24348BE /* Pods-THEPageControlApp-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-THEPageControlApp-frameworks.sh"; sourceTree = ""; }; 34 | 2535CA40EC412816E1C21BE6508A6932 /* THEPageControl-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "THEPageControl-umbrella.h"; sourceTree = ""; }; 35 | 2F3BC7945F012519DC2C0AF6264CB1FE /* Pods-THEPageControlApp.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-THEPageControlApp.modulemap"; sourceTree = ""; }; 36 | 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 37 | 427C9E91A2634E64C16557B0FFF78056 /* Pods-THEPageControlApp-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-THEPageControlApp-acknowledgements.plist"; sourceTree = ""; }; 38 | 48F00F905B4441016DD5FAD3E901C436 /* THEPageControl.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = THEPageControl.debug.xcconfig; sourceTree = ""; }; 39 | 49C40DF5CB5334A2F1E8C2C48C93E3BC /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 40 | 5F1AB0E2AD308C21481668A23901CEDF /* THEPageControl.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = THEPageControl.modulemap; sourceTree = ""; }; 41 | 619D6DE0819D5F901EB7C5BA344B832E /* THEPageControl.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = THEPageControl.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 42 | 6713D59403E50593F7AD4044C234D961 /* THEPageControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = THEPageControl.swift; path = THEPageControl/Source/THEPageControl.swift; sourceTree = ""; }; 43 | 69C57A4B4D14E8E6EF8FBF91C301AC3F /* Pods-THEPageControlApp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-THEPageControlApp-dummy.m"; sourceTree = ""; }; 44 | 796F74DE9A9E6BADD0A9E204A3F1F197 /* THEPageControl-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "THEPageControl-prefix.pch"; sourceTree = ""; }; 45 | 82C923B6FDD91499A0D95F0D81368E6E /* THEPageControl.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = THEPageControl.release.xcconfig; sourceTree = ""; }; 46 | 878D36437F2D1CF658AB9A3F37F1BF41 /* Pods-THEPageControlApp-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-THEPageControlApp-Info.plist"; sourceTree = ""; }; 47 | 8EF2ACE4CC45C3425DA14BF0BF6FDCB9 /* Pods-THEPageControlApp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-THEPageControlApp-umbrella.h"; sourceTree = ""; }; 48 | 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; }; 49 | A13ACB43F5CE955A1D9A6C085F4F0F55 /* Pods-THEPageControlApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-THEPageControlApp.debug.xcconfig"; sourceTree = ""; }; 50 | ACD52383F70DFD9F9940CB4CB9491552 /* Pods-THEPageControlApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-THEPageControlApp.release.xcconfig"; sourceTree = ""; }; 51 | B3FD70D1DB44EB449A2F90C6085E7567 /* Pods-THEPageControlApp-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-THEPageControlApp-acknowledgements.markdown"; sourceTree = ""; }; 52 | C400F5FCD41E486F3A4C3B13D584C0A6 /* THEPageControl-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "THEPageControl-dummy.m"; sourceTree = ""; }; 53 | CEAFCA85EFAA924B1B9148D3669C6A61 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 54 | D715E079DF260C9C8E28DAB601EF16D3 /* THEPageControl-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "THEPageControl-Info.plist"; sourceTree = ""; }; 55 | F49C7A6E50189E1776142D64B68E2669 /* Pods_THEPageControlApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_THEPageControlApp.framework; path = "Pods-THEPageControlApp.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | /* End PBXFileReference section */ 57 | 58 | /* Begin PBXFrameworksBuildPhase section */ 59 | A393DEA602C415AA5C2893FE3E98A6D7 /* Frameworks */ = { 60 | isa = PBXFrameworksBuildPhase; 61 | buildActionMask = 2147483647; 62 | files = ( 63 | F94370343BBC7A26F8726269140CE21F /* Foundation.framework in Frameworks */, 64 | ); 65 | runOnlyForDeploymentPostprocessing = 0; 66 | }; 67 | E805D82252EB4DCBF650BBC007BA2BD0 /* Frameworks */ = { 68 | isa = PBXFrameworksBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | A0FFCFD2F4D3945471CA293FE0A01E19 /* Foundation.framework in Frameworks */, 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | /* End PBXFrameworksBuildPhase section */ 76 | 77 | /* Begin PBXGroup section */ 78 | 2AC0ABC16D6A8ADDF230AD78C18A37E4 /* Targets Support Files */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | D89E5AB5F8BE99EDB32A5C479303A57E /* Pods-THEPageControlApp */, 82 | ); 83 | name = "Targets Support Files"; 84 | sourceTree = ""; 85 | }; 86 | 3AC325681B0826C4A351895D34D1254F /* Products */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | F49C7A6E50189E1776142D64B68E2669 /* Pods_THEPageControlApp.framework */, 90 | 1561902458271B0A06B3F05ABD41EE18 /* THEPageControl.framework */, 91 | ); 92 | name = Products; 93 | sourceTree = ""; 94 | }; 95 | 7CBE9DB81CDCF7050A0E906E73AFD9DB /* THEPageControl */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | 05CAD5E19C4FC0D28B135D19D434353C /* THEPageControl.h */, 99 | 6713D59403E50593F7AD4044C234D961 /* THEPageControl.swift */, 100 | FC2D5FA4A39BE608FE5CF31300B8FD7B /* Pod */, 101 | FC1F1A7C34AF0E6856A0730B428E9625 /* Support Files */, 102 | ); 103 | name = THEPageControl; 104 | path = ../..; 105 | sourceTree = ""; 106 | }; 107 | C0834CEBB1379A84116EF29F93051C60 /* iOS */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */, 111 | ); 112 | name = iOS; 113 | sourceTree = ""; 114 | }; 115 | CF1408CF629C7361332E53B88F7BD30C = { 116 | isa = PBXGroup; 117 | children = ( 118 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 119 | DEE41862C0890CB4BDDE26BB24B76035 /* Development Pods */, 120 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, 121 | 3AC325681B0826C4A351895D34D1254F /* Products */, 122 | 2AC0ABC16D6A8ADDF230AD78C18A37E4 /* Targets Support Files */, 123 | ); 124 | sourceTree = ""; 125 | }; 126 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | C0834CEBB1379A84116EF29F93051C60 /* iOS */, 130 | ); 131 | name = Frameworks; 132 | sourceTree = ""; 133 | }; 134 | D89E5AB5F8BE99EDB32A5C479303A57E /* Pods-THEPageControlApp */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 2F3BC7945F012519DC2C0AF6264CB1FE /* Pods-THEPageControlApp.modulemap */, 138 | B3FD70D1DB44EB449A2F90C6085E7567 /* Pods-THEPageControlApp-acknowledgements.markdown */, 139 | 427C9E91A2634E64C16557B0FFF78056 /* Pods-THEPageControlApp-acknowledgements.plist */, 140 | 69C57A4B4D14E8E6EF8FBF91C301AC3F /* Pods-THEPageControlApp-dummy.m */, 141 | 1DB026910F761C07A6CB990BB24348BE /* Pods-THEPageControlApp-frameworks.sh */, 142 | 878D36437F2D1CF658AB9A3F37F1BF41 /* Pods-THEPageControlApp-Info.plist */, 143 | 8EF2ACE4CC45C3425DA14BF0BF6FDCB9 /* Pods-THEPageControlApp-umbrella.h */, 144 | A13ACB43F5CE955A1D9A6C085F4F0F55 /* Pods-THEPageControlApp.debug.xcconfig */, 145 | ACD52383F70DFD9F9940CB4CB9491552 /* Pods-THEPageControlApp.release.xcconfig */, 146 | ); 147 | name = "Pods-THEPageControlApp"; 148 | path = "Target Support Files/Pods-THEPageControlApp"; 149 | sourceTree = ""; 150 | }; 151 | DEE41862C0890CB4BDDE26BB24B76035 /* Development Pods */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | 7CBE9DB81CDCF7050A0E906E73AFD9DB /* THEPageControl */, 155 | ); 156 | name = "Development Pods"; 157 | sourceTree = ""; 158 | }; 159 | FC1F1A7C34AF0E6856A0730B428E9625 /* Support Files */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | 5F1AB0E2AD308C21481668A23901CEDF /* THEPageControl.modulemap */, 163 | C400F5FCD41E486F3A4C3B13D584C0A6 /* THEPageControl-dummy.m */, 164 | D715E079DF260C9C8E28DAB601EF16D3 /* THEPageControl-Info.plist */, 165 | 796F74DE9A9E6BADD0A9E204A3F1F197 /* THEPageControl-prefix.pch */, 166 | 2535CA40EC412816E1C21BE6508A6932 /* THEPageControl-umbrella.h */, 167 | 48F00F905B4441016DD5FAD3E901C436 /* THEPageControl.debug.xcconfig */, 168 | 82C923B6FDD91499A0D95F0D81368E6E /* THEPageControl.release.xcconfig */, 169 | ); 170 | name = "Support Files"; 171 | path = "THEPageControlApp/Pods/Target Support Files/THEPageControl"; 172 | sourceTree = ""; 173 | }; 174 | FC2D5FA4A39BE608FE5CF31300B8FD7B /* Pod */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | CEAFCA85EFAA924B1B9148D3669C6A61 /* LICENSE */, 178 | 49C40DF5CB5334A2F1E8C2C48C93E3BC /* README.md */, 179 | 619D6DE0819D5F901EB7C5BA344B832E /* THEPageControl.podspec */, 180 | ); 181 | name = Pod; 182 | sourceTree = ""; 183 | }; 184 | /* End PBXGroup section */ 185 | 186 | /* Begin PBXHeadersBuildPhase section */ 187 | 43B80E810BEF2B7CEE3C9B2BEB5E4CE4 /* Headers */ = { 188 | isa = PBXHeadersBuildPhase; 189 | buildActionMask = 2147483647; 190 | files = ( 191 | 8570DD0A77C6C734BBB0CE0EABDEE017 /* Pods-THEPageControlApp-umbrella.h in Headers */, 192 | ); 193 | runOnlyForDeploymentPostprocessing = 0; 194 | }; 195 | 71CAC668831AC8541CA44A70887ACE67 /* Headers */ = { 196 | isa = PBXHeadersBuildPhase; 197 | buildActionMask = 2147483647; 198 | files = ( 199 | 9F4C1FA3FA2E8B44399B13D9A5102DA5 /* THEPageControl-umbrella.h in Headers */, 200 | AE635479F7E8ACB62F1B45CA0C2B1B95 /* THEPageControl.h in Headers */, 201 | ); 202 | runOnlyForDeploymentPostprocessing = 0; 203 | }; 204 | /* End PBXHeadersBuildPhase section */ 205 | 206 | /* Begin PBXNativeTarget section */ 207 | 86F8C4B2FA7AF93968293C8714C632BD /* THEPageControl */ = { 208 | isa = PBXNativeTarget; 209 | buildConfigurationList = C61B1204B7EE03A9356E9BDD1CC01072 /* Build configuration list for PBXNativeTarget "THEPageControl" */; 210 | buildPhases = ( 211 | 71CAC668831AC8541CA44A70887ACE67 /* Headers */, 212 | 745BCAB0D02E4D759B4B74F835458480 /* Sources */, 213 | A393DEA602C415AA5C2893FE3E98A6D7 /* Frameworks */, 214 | 3E8A18A10CCF3DD5B6ECFB3F4A69B51D /* Resources */, 215 | ); 216 | buildRules = ( 217 | ); 218 | dependencies = ( 219 | ); 220 | name = THEPageControl; 221 | productName = THEPageControl; 222 | productReference = 1561902458271B0A06B3F05ABD41EE18 /* THEPageControl.framework */; 223 | productType = "com.apple.product-type.framework"; 224 | }; 225 | D7804F5000AA8909482198E24F494299 /* Pods-THEPageControlApp */ = { 226 | isa = PBXNativeTarget; 227 | buildConfigurationList = 89CEDB884D908213408A752D6598FCF2 /* Build configuration list for PBXNativeTarget "Pods-THEPageControlApp" */; 228 | buildPhases = ( 229 | 43B80E810BEF2B7CEE3C9B2BEB5E4CE4 /* Headers */, 230 | FD2A33994F8609DABEC24DBA765B1E81 /* Sources */, 231 | E805D82252EB4DCBF650BBC007BA2BD0 /* Frameworks */, 232 | D0BA12690BBE3DA1EFC584E7A5C03A0F /* Resources */, 233 | ); 234 | buildRules = ( 235 | ); 236 | dependencies = ( 237 | 37FBD92C9EA3337A5A1B16444B4F86D9 /* PBXTargetDependency */, 238 | ); 239 | name = "Pods-THEPageControlApp"; 240 | productName = "Pods-THEPageControlApp"; 241 | productReference = F49C7A6E50189E1776142D64B68E2669 /* Pods_THEPageControlApp.framework */; 242 | productType = "com.apple.product-type.framework"; 243 | }; 244 | /* End PBXNativeTarget section */ 245 | 246 | /* Begin PBXProject section */ 247 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 248 | isa = PBXProject; 249 | attributes = { 250 | LastSwiftUpdateCheck = 1100; 251 | LastUpgradeCheck = 1100; 252 | }; 253 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 254 | compatibilityVersion = "Xcode 3.2"; 255 | developmentRegion = en; 256 | hasScannedForEncodings = 0; 257 | knownRegions = ( 258 | en, 259 | Base, 260 | ); 261 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 262 | productRefGroup = 3AC325681B0826C4A351895D34D1254F /* Products */; 263 | projectDirPath = ""; 264 | projectRoot = ""; 265 | targets = ( 266 | D7804F5000AA8909482198E24F494299 /* Pods-THEPageControlApp */, 267 | 86F8C4B2FA7AF93968293C8714C632BD /* THEPageControl */, 268 | ); 269 | }; 270 | /* End PBXProject section */ 271 | 272 | /* Begin PBXResourcesBuildPhase section */ 273 | 3E8A18A10CCF3DD5B6ECFB3F4A69B51D /* Resources */ = { 274 | isa = PBXResourcesBuildPhase; 275 | buildActionMask = 2147483647; 276 | files = ( 277 | ); 278 | runOnlyForDeploymentPostprocessing = 0; 279 | }; 280 | D0BA12690BBE3DA1EFC584E7A5C03A0F /* Resources */ = { 281 | isa = PBXResourcesBuildPhase; 282 | buildActionMask = 2147483647; 283 | files = ( 284 | ); 285 | runOnlyForDeploymentPostprocessing = 0; 286 | }; 287 | /* End PBXResourcesBuildPhase section */ 288 | 289 | /* Begin PBXSourcesBuildPhase section */ 290 | 745BCAB0D02E4D759B4B74F835458480 /* Sources */ = { 291 | isa = PBXSourcesBuildPhase; 292 | buildActionMask = 2147483647; 293 | files = ( 294 | 8EF8E44129835F53AC67F11239289DB3 /* THEPageControl-dummy.m in Sources */, 295 | E184900CE836A32974218BEE226E3AA7 /* THEPageControl.swift in Sources */, 296 | ); 297 | runOnlyForDeploymentPostprocessing = 0; 298 | }; 299 | FD2A33994F8609DABEC24DBA765B1E81 /* Sources */ = { 300 | isa = PBXSourcesBuildPhase; 301 | buildActionMask = 2147483647; 302 | files = ( 303 | ECD82B346157C0B949332F07B5362446 /* Pods-THEPageControlApp-dummy.m in Sources */, 304 | ); 305 | runOnlyForDeploymentPostprocessing = 0; 306 | }; 307 | /* End PBXSourcesBuildPhase section */ 308 | 309 | /* Begin PBXTargetDependency section */ 310 | 37FBD92C9EA3337A5A1B16444B4F86D9 /* PBXTargetDependency */ = { 311 | isa = PBXTargetDependency; 312 | name = THEPageControl; 313 | target = 86F8C4B2FA7AF93968293C8714C632BD /* THEPageControl */; 314 | targetProxy = 2E54DAF0992F260718EF4A4E1120E05C /* PBXContainerItemProxy */; 315 | }; 316 | /* End PBXTargetDependency section */ 317 | 318 | /* Begin XCBuildConfiguration section */ 319 | 3E2D12478FBCD4A08C83162232F15A15 /* Release */ = { 320 | isa = XCBuildConfiguration; 321 | baseConfigurationReference = 82C923B6FDD91499A0D95F0D81368E6E /* THEPageControl.release.xcconfig */; 322 | buildSettings = { 323 | CODE_SIGN_IDENTITY = ""; 324 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 325 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 326 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 327 | CURRENT_PROJECT_VERSION = 1; 328 | DEFINES_MODULE = YES; 329 | DYLIB_COMPATIBILITY_VERSION = 1; 330 | DYLIB_CURRENT_VERSION = 1; 331 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 332 | GCC_PREFIX_HEADER = "Target Support Files/THEPageControl/THEPageControl-prefix.pch"; 333 | INFOPLIST_FILE = "Target Support Files/THEPageControl/THEPageControl-Info.plist"; 334 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 335 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 336 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 337 | MODULEMAP_FILE = "Target Support Files/THEPageControl/THEPageControl.modulemap"; 338 | PRODUCT_MODULE_NAME = THEPageControl; 339 | PRODUCT_NAME = THEPageControl; 340 | SDKROOT = iphoneos; 341 | SKIP_INSTALL = YES; 342 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 343 | SWIFT_VERSION = 5.0; 344 | TARGETED_DEVICE_FAMILY = "1,2"; 345 | VALIDATE_PRODUCT = YES; 346 | VERSIONING_SYSTEM = "apple-generic"; 347 | VERSION_INFO_PREFIX = ""; 348 | }; 349 | name = Release; 350 | }; 351 | 48B073E7A3E120018528A00326BD9674 /* Debug */ = { 352 | isa = XCBuildConfiguration; 353 | baseConfigurationReference = A13ACB43F5CE955A1D9A6C085F4F0F55 /* Pods-THEPageControlApp.debug.xcconfig */; 354 | buildSettings = { 355 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 356 | CODE_SIGN_IDENTITY = ""; 357 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 358 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 359 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 360 | CURRENT_PROJECT_VERSION = 1; 361 | DEFINES_MODULE = YES; 362 | DYLIB_COMPATIBILITY_VERSION = 1; 363 | DYLIB_CURRENT_VERSION = 1; 364 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 365 | INFOPLIST_FILE = "Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp-Info.plist"; 366 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 367 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 368 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 369 | MACH_O_TYPE = staticlib; 370 | MODULEMAP_FILE = "Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp.modulemap"; 371 | OTHER_LDFLAGS = ""; 372 | OTHER_LIBTOOLFLAGS = ""; 373 | PODS_ROOT = "$(SRCROOT)"; 374 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 375 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 376 | SDKROOT = iphoneos; 377 | SKIP_INSTALL = YES; 378 | TARGETED_DEVICE_FAMILY = "1,2"; 379 | VERSIONING_SYSTEM = "apple-generic"; 380 | VERSION_INFO_PREFIX = ""; 381 | }; 382 | name = Debug; 383 | }; 384 | 4BE66A09A74FD25164AAB3C2645B9B93 /* Release */ = { 385 | isa = XCBuildConfiguration; 386 | buildSettings = { 387 | ALWAYS_SEARCH_USER_PATHS = NO; 388 | CLANG_ANALYZER_NONNULL = YES; 389 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 390 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 391 | CLANG_CXX_LIBRARY = "libc++"; 392 | CLANG_ENABLE_MODULES = YES; 393 | CLANG_ENABLE_OBJC_ARC = YES; 394 | CLANG_ENABLE_OBJC_WEAK = YES; 395 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 396 | CLANG_WARN_BOOL_CONVERSION = YES; 397 | CLANG_WARN_COMMA = YES; 398 | CLANG_WARN_CONSTANT_CONVERSION = YES; 399 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 400 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 401 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 402 | CLANG_WARN_EMPTY_BODY = YES; 403 | CLANG_WARN_ENUM_CONVERSION = YES; 404 | CLANG_WARN_INFINITE_RECURSION = YES; 405 | CLANG_WARN_INT_CONVERSION = YES; 406 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 407 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 408 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 409 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 410 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 411 | CLANG_WARN_STRICT_PROTOTYPES = YES; 412 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 413 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 414 | CLANG_WARN_UNREACHABLE_CODE = YES; 415 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 416 | COPY_PHASE_STRIP = NO; 417 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 418 | ENABLE_NS_ASSERTIONS = NO; 419 | ENABLE_STRICT_OBJC_MSGSEND = YES; 420 | GCC_C_LANGUAGE_STANDARD = gnu11; 421 | GCC_NO_COMMON_BLOCKS = YES; 422 | GCC_PREPROCESSOR_DEFINITIONS = ( 423 | "POD_CONFIGURATION_RELEASE=1", 424 | "$(inherited)", 425 | ); 426 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 427 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 428 | GCC_WARN_UNDECLARED_SELECTOR = YES; 429 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 430 | GCC_WARN_UNUSED_FUNCTION = YES; 431 | GCC_WARN_UNUSED_VARIABLE = YES; 432 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 433 | MTL_ENABLE_DEBUG_INFO = NO; 434 | MTL_FAST_MATH = YES; 435 | PRODUCT_NAME = "$(TARGET_NAME)"; 436 | STRIP_INSTALLED_PRODUCT = NO; 437 | SWIFT_COMPILATION_MODE = wholemodule; 438 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 439 | SWIFT_VERSION = 5.0; 440 | SYMROOT = "${SRCROOT}/../build"; 441 | }; 442 | name = Release; 443 | }; 444 | 782572E447C64B7D67FB98B5502D4BFB /* Debug */ = { 445 | isa = XCBuildConfiguration; 446 | baseConfigurationReference = 48F00F905B4441016DD5FAD3E901C436 /* THEPageControl.debug.xcconfig */; 447 | buildSettings = { 448 | CODE_SIGN_IDENTITY = ""; 449 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 450 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 451 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 452 | CURRENT_PROJECT_VERSION = 1; 453 | DEFINES_MODULE = YES; 454 | DYLIB_COMPATIBILITY_VERSION = 1; 455 | DYLIB_CURRENT_VERSION = 1; 456 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 457 | GCC_PREFIX_HEADER = "Target Support Files/THEPageControl/THEPageControl-prefix.pch"; 458 | INFOPLIST_FILE = "Target Support Files/THEPageControl/THEPageControl-Info.plist"; 459 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 460 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 461 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 462 | MODULEMAP_FILE = "Target Support Files/THEPageControl/THEPageControl.modulemap"; 463 | PRODUCT_MODULE_NAME = THEPageControl; 464 | PRODUCT_NAME = THEPageControl; 465 | SDKROOT = iphoneos; 466 | SKIP_INSTALL = YES; 467 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 468 | SWIFT_VERSION = 5.0; 469 | TARGETED_DEVICE_FAMILY = "1,2"; 470 | VERSIONING_SYSTEM = "apple-generic"; 471 | VERSION_INFO_PREFIX = ""; 472 | }; 473 | name = Debug; 474 | }; 475 | 7EF7227D9B20A1D549000096ACCB23D7 /* Debug */ = { 476 | isa = XCBuildConfiguration; 477 | buildSettings = { 478 | ALWAYS_SEARCH_USER_PATHS = NO; 479 | CLANG_ANALYZER_NONNULL = YES; 480 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 481 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 482 | CLANG_CXX_LIBRARY = "libc++"; 483 | CLANG_ENABLE_MODULES = YES; 484 | CLANG_ENABLE_OBJC_ARC = YES; 485 | CLANG_ENABLE_OBJC_WEAK = YES; 486 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 487 | CLANG_WARN_BOOL_CONVERSION = YES; 488 | CLANG_WARN_COMMA = YES; 489 | CLANG_WARN_CONSTANT_CONVERSION = YES; 490 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 491 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 492 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 493 | CLANG_WARN_EMPTY_BODY = YES; 494 | CLANG_WARN_ENUM_CONVERSION = YES; 495 | CLANG_WARN_INFINITE_RECURSION = YES; 496 | CLANG_WARN_INT_CONVERSION = YES; 497 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 498 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 499 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 500 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 501 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 502 | CLANG_WARN_STRICT_PROTOTYPES = YES; 503 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 504 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 505 | CLANG_WARN_UNREACHABLE_CODE = YES; 506 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 507 | COPY_PHASE_STRIP = NO; 508 | DEBUG_INFORMATION_FORMAT = dwarf; 509 | ENABLE_STRICT_OBJC_MSGSEND = YES; 510 | ENABLE_TESTABILITY = YES; 511 | GCC_C_LANGUAGE_STANDARD = gnu11; 512 | GCC_DYNAMIC_NO_PIC = NO; 513 | GCC_NO_COMMON_BLOCKS = YES; 514 | GCC_OPTIMIZATION_LEVEL = 0; 515 | GCC_PREPROCESSOR_DEFINITIONS = ( 516 | "POD_CONFIGURATION_DEBUG=1", 517 | "DEBUG=1", 518 | "$(inherited)", 519 | ); 520 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 521 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 522 | GCC_WARN_UNDECLARED_SELECTOR = YES; 523 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 524 | GCC_WARN_UNUSED_FUNCTION = YES; 525 | GCC_WARN_UNUSED_VARIABLE = YES; 526 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 527 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 528 | MTL_FAST_MATH = YES; 529 | ONLY_ACTIVE_ARCH = YES; 530 | PRODUCT_NAME = "$(TARGET_NAME)"; 531 | STRIP_INSTALLED_PRODUCT = NO; 532 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 533 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 534 | SWIFT_VERSION = 5.0; 535 | SYMROOT = "${SRCROOT}/../build"; 536 | }; 537 | name = Debug; 538 | }; 539 | E497DF9A3FE4917CB0E43905FF6698FD /* Release */ = { 540 | isa = XCBuildConfiguration; 541 | baseConfigurationReference = ACD52383F70DFD9F9940CB4CB9491552 /* Pods-THEPageControlApp.release.xcconfig */; 542 | buildSettings = { 543 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 544 | CODE_SIGN_IDENTITY = ""; 545 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 546 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 547 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 548 | CURRENT_PROJECT_VERSION = 1; 549 | DEFINES_MODULE = YES; 550 | DYLIB_COMPATIBILITY_VERSION = 1; 551 | DYLIB_CURRENT_VERSION = 1; 552 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 553 | INFOPLIST_FILE = "Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp-Info.plist"; 554 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 555 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 556 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 557 | MACH_O_TYPE = staticlib; 558 | MODULEMAP_FILE = "Target Support Files/Pods-THEPageControlApp/Pods-THEPageControlApp.modulemap"; 559 | OTHER_LDFLAGS = ""; 560 | OTHER_LIBTOOLFLAGS = ""; 561 | PODS_ROOT = "$(SRCROOT)"; 562 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 563 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 564 | SDKROOT = iphoneos; 565 | SKIP_INSTALL = YES; 566 | TARGETED_DEVICE_FAMILY = "1,2"; 567 | VALIDATE_PRODUCT = YES; 568 | VERSIONING_SYSTEM = "apple-generic"; 569 | VERSION_INFO_PREFIX = ""; 570 | }; 571 | name = Release; 572 | }; 573 | /* End XCBuildConfiguration section */ 574 | 575 | /* Begin XCConfigurationList section */ 576 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 577 | isa = XCConfigurationList; 578 | buildConfigurations = ( 579 | 7EF7227D9B20A1D549000096ACCB23D7 /* Debug */, 580 | 4BE66A09A74FD25164AAB3C2645B9B93 /* Release */, 581 | ); 582 | defaultConfigurationIsVisible = 0; 583 | defaultConfigurationName = Release; 584 | }; 585 | 89CEDB884D908213408A752D6598FCF2 /* Build configuration list for PBXNativeTarget "Pods-THEPageControlApp" */ = { 586 | isa = XCConfigurationList; 587 | buildConfigurations = ( 588 | 48B073E7A3E120018528A00326BD9674 /* Debug */, 589 | E497DF9A3FE4917CB0E43905FF6698FD /* Release */, 590 | ); 591 | defaultConfigurationIsVisible = 0; 592 | defaultConfigurationName = Release; 593 | }; 594 | C61B1204B7EE03A9356E9BDD1CC01072 /* Build configuration list for PBXNativeTarget "THEPageControl" */ = { 595 | isa = XCConfigurationList; 596 | buildConfigurations = ( 597 | 782572E447C64B7D67FB98B5502D4BFB /* Debug */, 598 | 3E2D12478FBCD4A08C83162232F15A15 /* Release */, 599 | ); 600 | defaultConfigurationIsVisible = 0; 601 | defaultConfigurationName = Release; 602 | }; 603 | /* End XCConfigurationList section */ 604 | }; 605 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 606 | } 607 | --------------------------------------------------------------------------------