├── CBPinEntryView ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ ├── CBPinEntryViewDefaults.swift │ └── CBPinEntryView.swift ├── _Pods.xcodeproj ├── Example ├── .DS_Store ├── Pods │ ├── Target Support Files │ │ ├── CBPinEntryView │ │ │ ├── CBPinEntryView.modulemap │ │ │ ├── CBPinEntryView-dummy.m │ │ │ ├── CBPinEntryView-prefix.pch │ │ │ ├── CBPinEntryView-umbrella.h │ │ │ ├── CBPinEntryView.xcconfig │ │ │ ├── Info.plist │ │ │ └── CBPinEntryView-Info.plist │ │ ├── Pods-CBPinEntryView_Tests │ │ │ ├── Pods-CBPinEntryView_Tests-acknowledgements.markdown │ │ │ ├── Pods-CBPinEntryView_Tests.modulemap │ │ │ ├── Pods-CBPinEntryView_Tests-dummy.m │ │ │ ├── Pods-CBPinEntryView_Tests-umbrella.h │ │ │ ├── Pods-CBPinEntryView_Tests.debug.xcconfig │ │ │ ├── Pods-CBPinEntryView_Tests.release.xcconfig │ │ │ ├── Info.plist │ │ │ ├── Pods-CBPinEntryView_Tests-Info.plist │ │ │ ├── Pods-CBPinEntryView_Tests-acknowledgements.plist │ │ │ ├── Pods-CBPinEntryView_Tests-frameworks.sh │ │ │ └── Pods-CBPinEntryView_Tests-resources.sh │ │ └── Pods-CBPinEntryView_Example │ │ │ ├── Pods-CBPinEntryView_Example.modulemap │ │ │ ├── Pods-CBPinEntryView_Example-dummy.m │ │ │ ├── Pods-CBPinEntryView_Example-umbrella.h │ │ │ ├── Pods-CBPinEntryView_Example.debug.xcconfig │ │ │ ├── Pods-CBPinEntryView_Example.release.xcconfig │ │ │ ├── Info.plist │ │ │ ├── Pods-CBPinEntryView_Example-Info.plist │ │ │ ├── Pods-CBPinEntryView_Example-acknowledgements.markdown │ │ │ ├── Pods-CBPinEntryView_Example-acknowledgements.plist │ │ │ ├── Pods-CBPinEntryView_Example-resources.sh │ │ │ └── Pods-CBPinEntryView_Example-frameworks.sh │ ├── Manifest.lock │ ├── Local Podspecs │ │ └── CBPinEntryView.podspec.json │ └── Pods.xcodeproj │ │ └── project.pbxproj ├── Podfile ├── CBPinEntryView.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── CBPinEntryView-Example.xcscheme │ └── project.pbxproj ├── CBPinEntryView.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Podfile.lock ├── CBPinEntryView │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ ├── ViewController.swift │ ├── AppDelegate.swift │ └── Base.lproj │ │ ├── LaunchScreen.xib │ │ └── Main.storyboard └── Tests │ ├── Info.plist │ └── Tests.swift ├── Package.swift ├── .travis.yml ├── LICENSE ├── .gitignore ├── Sources └── CBPinEntryView │ ├── CBPinEntryViewDefaults.swift │ └── CBPinEntryView.swift ├── CBPinEntryView.podspec └── README.md /CBPinEntryView/Assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /CBPinEntryView/Classes/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /Example/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fawxy/CBPinEntryView/HEAD/Example/.DS_Store -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CBPinEntryView/CBPinEntryView.modulemap: -------------------------------------------------------------------------------- 1 | framework module CBPinEntryView { 2 | umbrella header "CBPinEntryView-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CBPinEntryView/CBPinEntryView-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_CBPinEntryView : NSObject 3 | @end 4 | @implementation PodsDummy_CBPinEntryView 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'CBPinEntryView_Example' do 4 | pod 'CBPinEntryView', :path => '../' 5 | 6 | target 'CBPinEntryView_Tests' do 7 | inherit! :search_paths 8 | 9 | 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_CBPinEntryView_Tests { 2 | umbrella header "Pods-CBPinEntryView_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/CBPinEntryView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_CBPinEntryView_Example { 2 | umbrella header "Pods-CBPinEntryView_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_CBPinEntryView_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_CBPinEntryView_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_CBPinEntryView_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_CBPinEntryView_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CBPinEntryView/CBPinEntryView-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/CBPinEntryView.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/CBPinEntryView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - CBPinEntryView (1.6.1) 3 | 4 | DEPENDENCIES: 5 | - CBPinEntryView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | CBPinEntryView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | CBPinEntryView: 9837797ee263a05dbe501e8ccbf3e992e758410b 13 | 14 | PODFILE CHECKSUM: 7a55927a68b2086774c487cb21b7cb4d074c5945 15 | 16 | COCOAPODS: 1.6.0.beta.2 17 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - CBPinEntryView (1.6.1) 3 | 4 | DEPENDENCIES: 5 | - CBPinEntryView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | CBPinEntryView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | CBPinEntryView: 9837797ee263a05dbe501e8ccbf3e992e758410b 13 | 14 | PODFILE CHECKSUM: 7a55927a68b2086774c487cb21b7cb4d074c5945 15 | 16 | COCOAPODS: 1.6.0.beta.2 17 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.3 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "CBPinEntryView", 8 | products: [ 9 | .library(name: "CBPinEntryView", targets: ["CBPinEntryView"]), 10 | ], 11 | targets: [ 12 | .target(name: "CBPinEntryView") 13 | ] 14 | ) 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CBPinEntryView/CBPinEntryView-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 CBPinEntryViewVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char CBPinEntryViewVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_CBPinEntryView_TestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_CBPinEntryView_TestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_CBPinEntryView_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_CBPinEntryView_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CBPinEntryView/CBPinEntryView.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/CBPinEntryView 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 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * http://www.objc.io/issue-6/travis-ci.html 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode7.3 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | # before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | # - pod install --project-directory=Example 12 | script: 13 | - set -o pipefail && xcodebuild test -workspace Example/CBPinEntryView.xcworkspace -scheme CBPinEntryView-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty 14 | - pod lib lint 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CBPinEntryView" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CBPinEntryView/CBPinEntryView.framework/Headers" 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_LDFLAGS = $(inherited) -framework "CBPinEntryView" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CBPinEntryView" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CBPinEntryView/CBPinEntryView.framework/Headers" 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_LDFLAGS = $(inherited) -framework "CBPinEntryView" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /Example/CBPinEntryView/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CBPinEntryView" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CBPinEntryView/CBPinEntryView.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "CBPinEntryView" 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 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CBPinEntryView" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CBPinEntryView/CBPinEntryView.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "CBPinEntryView" 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 | -------------------------------------------------------------------------------- /Example/Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Tests/Tests.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import XCTest 3 | import CBPinEntryView 4 | 5 | class Tests: XCTestCase { 6 | 7 | override func setUp() { 8 | super.setUp() 9 | // Put setup code here. This method is called before the invocation of each test method in the class. 10 | } 11 | 12 | override func tearDown() { 13 | // Put teardown code here. This method is called after the invocation of each test method in the class. 14 | super.tearDown() 15 | } 16 | 17 | func testExample() { 18 | // This is an example of a functional test case. 19 | XCTAssert(true, "Pass") 20 | } 21 | 22 | func testPerformanceExample() { 23 | // This is an example of a performance test case. 24 | self.measure() { 25 | // Put the code you want to measure the time of here. 26 | } 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CBPinEntryView/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.3.2 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CBPinEntryView/CBPinEntryView-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.6.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/CBPinEntryView.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "CBPinEntryView", 3 | "version": "1.6.1", 4 | "summary": "A view for entering arbitrary length pins, codes or passwords written in Swift 4.2. Supports one time codes.", 5 | "description": "This view allows a user to enter a pin or code (for security/mobile verification etc) of any length. It allows deletion, continuation, secure entry, and allows you to get the entire entered code as a single String or Int without having to join Strings from multiple text fields. It's fast, looks nice (I think) and is customisable! Requires iOS 9+.", 6 | "homepage": "https://github.com/Fawxy/CBPinEntryView", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "Chris Byatt": "byatt.chris@gmail.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com/Fawxy/CBPinEntryView.git", 16 | "tag": "1.6.1" 17 | }, 18 | "social_media_url": "https://twitter.com/ChrisByatt", 19 | "platforms": { 20 | "ios": "9.0" 21 | }, 22 | "source_files": "CBPinEntryView/Classes/**/*" 23 | } 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 Chris Byatt 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Example/CBPinEntryView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## CBPinEntryView 5 | 6 | Copyright (c) 2017 Chris Byatt 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xcuserstate 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | *.ipa 27 | *.dSYM.zip 28 | *.dSYM 29 | 30 | ## Playgrounds 31 | timeline.xctimeline 32 | playground.xcworkspace 33 | 34 | # Swift Package Manager 35 | # 36 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 37 | # Packages/ 38 | .build/ 39 | 40 | # CocoaPods 41 | # 42 | # We recommend against adding the Pods directory to your .gitignore. However 43 | # you should judge for yourself, the pros and cons are mentioned at: 44 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 45 | # 46 | # Pods/ 47 | 48 | # Carthage 49 | # 50 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 51 | # Carthage/Checkouts 52 | 53 | Carthage/Build 54 | 55 | # fastlane 56 | # 57 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 58 | # screenshots whenever they are needed. 59 | # For more information about the recommended setup visit: 60 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 61 | 62 | fastlane/report.xml 63 | fastlane/Preview.html 64 | fastlane/screenshots 65 | fastlane/test_output 66 | -------------------------------------------------------------------------------- /CBPinEntryView/Classes/CBPinEntryViewDefaults.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CBPinEntryViewDefaults.swift 3 | // Pods 4 | // 5 | // Created by Chris Byatt on 18/03/2017. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | struct CBPinEntryViewDefaults { 12 | 13 | // Default number of fields 14 | static let length: Int = 4 15 | 16 | // Default spacing between fields 17 | static let spacing: CGFloat = 10 18 | 19 | // Default backgorund colour of pin entry field 20 | static let entryBackgroundColour: UIColor = UIColor.white 21 | 22 | // Default border width 23 | static let entryBorderWidth: CGFloat = 1 24 | 25 | // Default border colour of fields before selection 26 | static let entryDefaultBorderColour: UIColor = UIColor.clear 27 | 28 | // Default border colour of currently editing field 29 | static let entryBorderColour: UIColor = UIColor(red: 69/255, green: 78/255, blue: 86/255, alpha: 1.0) 30 | 31 | // Default background colour of currently editing field 32 | static let entryEditingBackgroundColour: UIColor = UIColor(red: 135/255, green: 154/255, blue: 168/255, alpha: 1.0) 33 | 34 | // Default border colour for error state 35 | static let entryErrorColour: UIColor = UIColor.red 36 | 37 | // Default corner radius of entry fields 38 | static let entryCornerRadius: CGFloat = 3.0 39 | 40 | // Default text colour for the entry label 41 | static let entryTextColour: UIColor = UIColor.darkText 42 | 43 | // Default font for entry fields 44 | static let entryFont: UIFont = UIFont.systemFont(ofSize: 16) 45 | 46 | static let isSecure: Bool = false 47 | 48 | static let secureCharacter: String = "●" 49 | 50 | static let keyboardType: Int = 4 51 | } 52 | -------------------------------------------------------------------------------- /Sources/CBPinEntryView/CBPinEntryViewDefaults.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CBPinEntryViewDefaults.swift 3 | // Pods 4 | // 5 | // Created by Chris Byatt on 18/03/2017. 6 | // 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | struct CBPinEntryViewDefaults { 13 | 14 | // Default number of fields 15 | static let length: Int = 4 16 | 17 | // Default spacing between fields 18 | static let spacing: CGFloat = 10 19 | 20 | // Default backgorund colour of pin entry field 21 | static let entryBackgroundColour: UIColor = UIColor.white 22 | 23 | // Default border width 24 | static let entryBorderWidth: CGFloat = 1 25 | 26 | // Default border colour of fields before selection 27 | static let entryDefaultBorderColour: UIColor = UIColor.clear 28 | 29 | // Default border colour of currently editing field 30 | static let entryBorderColour: UIColor = UIColor(red: 69/255, green: 78/255, blue: 86/255, alpha: 1.0) 31 | 32 | // Default background colour of currently editing field 33 | static let entryEditingBackgroundColour: UIColor = UIColor(red: 135/255, green: 154/255, blue: 168/255, alpha: 1.0) 34 | 35 | // Default border colour for error state 36 | static let entryErrorColour: UIColor = UIColor.red 37 | 38 | // Default corner radius of entry fields 39 | static let entryCornerRadius: CGFloat = 3.0 40 | 41 | // Default text colour for the entry label 42 | static let entryTextColour: UIColor = UIColor.darkText 43 | 44 | // Default font for entry fields 45 | static let entryFont: UIFont = UIFont.systemFont(ofSize: 16) 46 | 47 | static let isSecure: Bool = false 48 | 49 | static let secureCharacter: String = "●" 50 | 51 | static let keyboardType: Int = 4 52 | } 53 | -------------------------------------------------------------------------------- /CBPinEntryView.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint CBPinEntryView.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'CBPinEntryView' 11 | s.version = '1.7.1' 12 | s.summary = 'A view for entering arbitrary length pins, codes or passwords written in Swift 4.2. Supports one time codes.' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | This view allows a user to enter a pin or code (for security/mobile verification etc) of any length. It allows deletion, continuation, secure entry, and allows you to get the entire entered code as a single String or Int without having to join Strings from multiple text fields. It's fast, looks nice (I think) and is customisable! Requires iOS 9+. 22 | DESC 23 | 24 | s.homepage = 'https://github.com/Fawxy/CBPinEntryView' 25 | s.license = { :type => 'MIT', :file => 'LICENSE' } 26 | s.author = { 'Chris Byatt' => 'byatt.chris@gmail.com' } 27 | s.source = { :git => 'https://github.com/Fawxy/CBPinEntryView.git', :tag => s.version.to_s } 28 | s.social_media_url = 'https://twitter.com/ChrisByatt' 29 | s.swift_version = '5.0' 30 | 31 | s.ios.deployment_target = '9.0' 32 | 33 | s.source_files = 'CBPinEntryView/Classes/**/*' 34 | end 35 | -------------------------------------------------------------------------------- /Example/CBPinEntryView/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // CBPinEntryView 4 | // 5 | // Created by Chris Byatt on 03/18/2017. 6 | // Copyright (c) 2017 Chris Byatt. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import CBPinEntryView 11 | 12 | class ViewController: UIViewController { 13 | var isUnderlined = false 14 | 15 | @IBOutlet var pinEntryView: CBPinEntryView! { 16 | didSet { 17 | pinEntryView.delegate = self 18 | } 19 | } 20 | @IBOutlet var stringOutputLabel: UILabel! 21 | 22 | override func viewWillAppear(_ animated: Bool) { 23 | super.viewWillAppear(animated) 24 | if #available(iOS 12, *) { 25 | pinEntryView.textContentType = .oneTimeCode 26 | } 27 | } 28 | 29 | @IBAction func pressedGetCode(_ sender: UIButton) { 30 | stringOutputLabel.text = pinEntryView.getPinAsString() 31 | print(pinEntryView.getPinAsInt() ?? "Not an int") 32 | pinEntryView.resignFirstResponder() 33 | } 34 | 35 | @IBAction func toggleError(_ sender: UIButton) { 36 | if !pinEntryView.errorMode { 37 | pinEntryView.setError(isError: true) 38 | } else { 39 | pinEntryView.setError(isError: false) 40 | } 41 | } 42 | 43 | @IBAction func pressedClear(_ sender: UIButton) { 44 | pinEntryView.clearEntry() 45 | } 46 | @IBAction func pressedUnderline(_ sender: UIButton) { 47 | if pinEntryView.isUnderlined { 48 | pinEntryView.isUnderlined = false 49 | } else { 50 | pinEntryView.isUnderlined = true 51 | } 52 | } 53 | } 54 | 55 | extension ViewController: CBPinEntryViewDelegate { 56 | func entryCompleted(with entry: String?) { 57 | print(entry) 58 | } 59 | 60 | func entryChanged(_ completed: Bool) { 61 | if completed { 62 | print(pinEntryView.getPinAsString()) 63 | } 64 | } 65 | } 66 | 67 | -------------------------------------------------------------------------------- /Example/CBPinEntryView/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // CBPinEntryView 4 | // 5 | // Created by Chris Byatt on 03/18/2017. 6 | // Copyright (c) 2017 Chris Byatt. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2017 Chris Byatt <byatt.chris@gmail.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | License 38 | MIT 39 | Title 40 | CBPinEntryView 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /Example/CBPinEntryView/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | elif [ -r "$1" ]; then 16 | local source="$1" 17 | fi 18 | 19 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 20 | 21 | if [ -L "${source}" ]; then 22 | echo "Symlinked..." 23 | source="$(readlink "${source}")" 24 | fi 25 | 26 | # use filter instead of exclude so missing patterns dont' throw errors 27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 29 | 30 | local basename 31 | basename="$(basename -s .framework "$1")" 32 | binary="${destination}/${basename}.framework/${basename}" 33 | if ! [ -r "$binary" ]; then 34 | binary="${destination}/${basename}" 35 | fi 36 | 37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 39 | strip_invalid_archs "$binary" 40 | fi 41 | 42 | # Resign the code if required by the build settings to avoid unstable apps 43 | code_sign_if_enabled "${destination}/$(basename "$1")" 44 | 45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 47 | local swift_runtime_libs 48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 49 | for lib in $swift_runtime_libs; do 50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 52 | code_sign_if_enabled "${destination}/${lib}" 53 | done 54 | fi 55 | } 56 | 57 | # Signs a framework with the provided identity 58 | code_sign_if_enabled() { 59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 60 | # Use the current code_sign_identitiy 61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 62 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" 63 | 64 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 65 | code_sign_cmd="$code_sign_cmd &" 66 | fi 67 | echo "$code_sign_cmd" 68 | eval "$code_sign_cmd" 69 | fi 70 | } 71 | 72 | # Strip invalid architectures 73 | strip_invalid_archs() { 74 | binary="$1" 75 | # Get architectures for current file 76 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 77 | stripped="" 78 | for arch in $archs; do 79 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then 80 | # Strip non-valid architectures in-place 81 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 82 | stripped="$stripped $arch" 83 | fi 84 | done 85 | if [[ "$stripped" ]]; then 86 | echo "Stripped $binary of architectures:$stripped" 87 | fi 88 | } 89 | 90 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 91 | wait 92 | fi 93 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CBPinEntryView 2 | 3 | [![Version](https://img.shields.io/cocoapods/v/CBPinEntryView.svg?style=flat)](http://cocoapods.org/pods/CBPinEntryView) 4 | [![License](https://img.shields.io/cocoapods/l/CBPinEntryView.svg?style=flat)](http://cocoapods.org/pods/CBPinEntryView) 5 | [![Platform](https://img.shields.io/cocoapods/p/CBPinEntryView.svg?style=flat)](http://cocoapods.org/pods/CBPinEntryView) 6 | 7 | CBPinEntryView is a view written in Swift to allow easy and slick entry of pins, codes or passwords. It allows backspacing, dismissal of keyboard and continuing where you left off, the whole code is given as a single String or Int and the view is very easily customisable in code or the storyboard. 8 | 9 | ## Preview 10 | 11 | 12 | 13 | | Enter pins easily! | Communicate user error | Clear the text field to retry | Secure entry mode | 14 | |:------------------:|:----------------------:|:-----------------------------:|:-----------------:| 15 | | ![](http://i.imgur.com/75oYhG5.gif) | ![](http://i.imgur.com/UU5Xm7X.gif) | ![](http://i.imgur.com/ABZH0Ea.gif) | ![](http://i.imgur.com/zAhXL7O.gif) | 16 | 17 | ## Example 18 | 19 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 20 | 21 | ## Installation 22 | 23 | CBPinEntryView is available through [CocoaPods](http://cocoapods.org). To install 24 | it, simply add the following line to your Podfile: 25 | 26 | ```ruby 27 | pod "CBPinEntryView" 28 | ``` 29 | Put a view into your storyboard or xib and set it's class to `CBPinEntryView`. Create an outlet in your file and customise either with the IBInspectable properties or in your code. 30 | 31 | ### Get the code 32 | 33 | Get the code with either `entryView.getPinAsString()` or `entryView.getPinAsInt()`. 34 | 35 | ### Entry callbacks 36 | 37 | There are two delegate methods `entryChanged(_ completed: Bool)` and `entryCompleted(with entry: String?)`. The first will let you know each time the entry is changed, and whether they have completed the entry. The second function will get called when the user fills out the entry to completion and the entered pin will be passed. 38 | 39 | ### Secure entry 40 | 41 | Secure entry with customisable secure character (change from ● to ✱ or any other character). Enable `isSecure`. 42 | Change the secure entry character by setting the `secureCharacter` property. 43 | 44 | ### Display errors 45 | 46 | There is an error mode which can be enabled with `pinEntryView.setError(isError: true)` and disabled with `pinEntryView.setError(isError: false)`. Whether error mode is enabled can be checked with `pinEntryView.errorMode`. Calling `pinEntryView.resignFirstResponder()` will hide the keyboard and disable the error mode. 47 | 48 | ### Allow or restrict characters 49 | 50 | Set `allowedEntryTypes` and choose between `any`, `numerical`, `alphanumeric`, `letters` to enable or restrict characters. Set `textFieldCapitalization` to choose what kind of capitalisation you would like on the text field. 51 | 52 | ### Customise keyboard type! 53 | 54 | The keyboard types are an enum with int raw values. Options are as follows: 55 | 56 | ``` 57 | 0: default // Default type for the current input method. 58 | 1: asciiCapable // Displays a keyboard which can enter ASCII characters 59 | 2: numbersAndPunctuation // Numbers and assorted punctuation. 60 | 3: URL // A type optimized for URL entry (shows . / .com prominently). 61 | 4: numberPad // A number pad with locale-appropriate digits (0-9, ۰-۹, ०-९, etc.). Suitable for PIN entry. 62 | 5: phonePad // A phone pad (1-9, *, 0, #, with letters under the numbers). 63 | 6: namePhonePad // A type optimized for entering a person's name or phone number. 64 | 7: emailAddress // A type optimized for multiple email address entry (shows space @ . prominently). 65 | 8: decimalPad // A number pad with a decimal point. 66 | 9: twitter // A type optimized for twitter text entry (easy access to @ #) 67 | ``` 68 | 69 | ## License 70 | 71 | CBPinEntryView is available under the MIT license. See the LICENSE file for more info. 72 | -------------------------------------------------------------------------------- /Example/CBPinEntryView.xcodeproj/xcshareddata/xcschemes/CBPinEntryView-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 68 | 78 | 80 | 86 | 87 | 88 | 89 | 90 | 91 | 97 | 99 | 105 | 106 | 107 | 108 | 110 | 111 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests-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 | case "${TARGETED_DEVICE_FAMILY}" in 12 | 1,2) 13 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 14 | ;; 15 | 1) 16 | TARGET_DEVICE_ARGS="--target-device iphone" 17 | ;; 18 | 2) 19 | TARGET_DEVICE_ARGS="--target-device ipad" 20 | ;; 21 | 3) 22 | TARGET_DEVICE_ARGS="--target-device tv" 23 | ;; 24 | 4) 25 | TARGET_DEVICE_ARGS="--target-device watch" 26 | ;; 27 | *) 28 | TARGET_DEVICE_ARGS="--target-device mac" 29 | ;; 30 | esac 31 | 32 | install_resource() 33 | { 34 | if [[ "$1" = /* ]] ; then 35 | RESOURCE_PATH="$1" 36 | else 37 | RESOURCE_PATH="${PODS_ROOT}/$1" 38 | fi 39 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 40 | cat << EOM 41 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 42 | EOM 43 | exit 1 44 | fi 45 | case $RESOURCE_PATH in 46 | *.storyboard) 47 | 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}" 48 | 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} 49 | ;; 50 | *.xib) 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\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 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\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 53 | ;; 54 | *.framework) 55 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 56 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 57 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 58 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 59 | ;; 60 | *.xcdatamodel) 61 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" 62 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 63 | ;; 64 | *.xcdatamodeld) 65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" 66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 67 | ;; 68 | *.xcmappingmodel) 69 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" 70 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 71 | ;; 72 | *.xcassets) 73 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 74 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 75 | ;; 76 | *) 77 | echo "$RESOURCE_PATH" 78 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 79 | ;; 80 | esac 81 | } 82 | 83 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 84 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 85 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 86 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 87 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 88 | fi 89 | rm -f "$RESOURCES_TO_COPY" 90 | 91 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 92 | then 93 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 94 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 95 | while read line; do 96 | if [[ $line != "${PODS_ROOT}*" ]]; then 97 | XCASSET_FILES+=("$line") 98 | fi 99 | done <<<"$OTHER_XCASSETS" 100 | 101 | 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}" 102 | fi 103 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example-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 | case "${TARGETED_DEVICE_FAMILY}" in 12 | 1,2) 13 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 14 | ;; 15 | 1) 16 | TARGET_DEVICE_ARGS="--target-device iphone" 17 | ;; 18 | 2) 19 | TARGET_DEVICE_ARGS="--target-device ipad" 20 | ;; 21 | 3) 22 | TARGET_DEVICE_ARGS="--target-device tv" 23 | ;; 24 | 4) 25 | TARGET_DEVICE_ARGS="--target-device watch" 26 | ;; 27 | *) 28 | TARGET_DEVICE_ARGS="--target-device mac" 29 | ;; 30 | esac 31 | 32 | install_resource() 33 | { 34 | if [[ "$1" = /* ]] ; then 35 | RESOURCE_PATH="$1" 36 | else 37 | RESOURCE_PATH="${PODS_ROOT}/$1" 38 | fi 39 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 40 | cat << EOM 41 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 42 | EOM 43 | exit 1 44 | fi 45 | case $RESOURCE_PATH in 46 | *.storyboard) 47 | 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}" 48 | 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} 49 | ;; 50 | *.xib) 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\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 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\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 53 | ;; 54 | *.framework) 55 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 56 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 57 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 58 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 59 | ;; 60 | *.xcdatamodel) 61 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" 62 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 63 | ;; 64 | *.xcdatamodeld) 65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" 66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 67 | ;; 68 | *.xcmappingmodel) 69 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" 70 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 71 | ;; 72 | *.xcassets) 73 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 74 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 75 | ;; 76 | *) 77 | echo "$RESOURCE_PATH" 78 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 79 | ;; 80 | esac 81 | } 82 | 83 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 84 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 85 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 86 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 87 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 88 | fi 89 | rm -f "$RESOURCES_TO_COPY" 90 | 91 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 92 | then 93 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 94 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 95 | while read line; do 96 | if [[ $line != "${PODS_ROOT}*" ]]; then 97 | XCASSET_FILES+=("$line") 98 | fi 99 | done <<<"$OTHER_XCASSETS" 100 | 101 | 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}" 102 | fi 103 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | if [ -r "$source" ]; then 88 | # Copy the dSYM into a the targets temp dir. 89 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 90 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 91 | 92 | local basename 93 | basename="$(basename -s .framework.dSYM "$source")" 94 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 95 | 96 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 97 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 98 | strip_invalid_archs "$binary" 99 | fi 100 | 101 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 102 | # Move the stripped file into its final destination. 103 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 104 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 105 | else 106 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 107 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 108 | fi 109 | fi 110 | } 111 | 112 | # Signs a framework with the provided identity 113 | code_sign_if_enabled() { 114 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 115 | # Use the current code_sign_identity 116 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 117 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 118 | 119 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 120 | code_sign_cmd="$code_sign_cmd &" 121 | fi 122 | echo "$code_sign_cmd" 123 | eval "$code_sign_cmd" 124 | fi 125 | } 126 | 127 | # Strip invalid architectures 128 | strip_invalid_archs() { 129 | binary="$1" 130 | # Get architectures for current target binary 131 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 132 | # Intersect them with the architectures we are building for 133 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 134 | # If there are no archs supported by this binary then warn the user 135 | if [[ -z "$intersected_archs" ]]; then 136 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 137 | STRIP_BINARY_RETVAL=0 138 | return 139 | fi 140 | stripped="" 141 | for arch in $binary_archs; do 142 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 143 | # Strip non-valid architectures in-place 144 | lipo -remove "$arch" -output "$binary" "$binary" 145 | stripped="$stripped $arch" 146 | fi 147 | done 148 | if [[ "$stripped" ]]; then 149 | echo "Stripped $binary of architectures:$stripped" 150 | fi 151 | STRIP_BINARY_RETVAL=1 152 | } 153 | 154 | 155 | if [[ "$CONFIGURATION" == "Debug" ]]; then 156 | install_framework "${BUILT_PRODUCTS_DIR}/CBPinEntryView/CBPinEntryView.framework" 157 | fi 158 | if [[ "$CONFIGURATION" == "Release" ]]; then 159 | install_framework "${BUILT_PRODUCTS_DIR}/CBPinEntryView/CBPinEntryView.framework" 160 | fi 161 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 162 | wait 163 | fi 164 | -------------------------------------------------------------------------------- /Example/CBPinEntryView/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 74 | 81 | 88 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /CBPinEntryView/Classes/CBPinEntryView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CBPinEntryView.swift 3 | // Pods 4 | // 5 | // Created by Chris Byatt on 18/03/2017. 6 | // 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol CBPinEntryViewDelegate: class { 12 | func entryChanged(_ completed: Bool) 13 | func entryCompleted(with entry: String?) 14 | } 15 | 16 | @IBDesignable open class CBPinEntryView: UIView { 17 | 18 | /// Pin's backgroundColor when filled with a secure entry. 19 | /// clear color is the default value 20 | 21 | @IBInspectable 22 | open var filledEntryColour: UIColor = .clear { 23 | didSet { 24 | if oldValue != filledEntryColour { 25 | updateButtonStyles() 26 | } 27 | } 28 | } 29 | 30 | @IBInspectable open var length: Int = CBPinEntryViewDefaults.length { 31 | didSet { 32 | commonInit() 33 | } 34 | } 35 | 36 | @IBInspectable open var spacing: CGFloat = CBPinEntryViewDefaults.spacing { 37 | didSet { 38 | commonInit() 39 | } 40 | } 41 | 42 | @IBInspectable open var entryCornerRadius: CGFloat = CBPinEntryViewDefaults.entryCornerRadius { 43 | didSet { 44 | if oldValue != entryCornerRadius { 45 | updateButtonStyles() 46 | } 47 | } 48 | } 49 | 50 | @IBInspectable open var entryBorderWidth: CGFloat = CBPinEntryViewDefaults.entryBorderWidth { 51 | didSet { 52 | if oldValue != entryBorderWidth { 53 | updateButtonStyles() 54 | } 55 | } 56 | } 57 | 58 | @IBInspectable open var entryDefaultBorderColour: UIColor = CBPinEntryViewDefaults.entryDefaultBorderColour { 59 | didSet { 60 | if oldValue != entryDefaultBorderColour { 61 | updateButtonStyles() 62 | } 63 | } 64 | } 65 | 66 | @IBInspectable open var entryBorderColour: UIColor = CBPinEntryViewDefaults.entryBorderColour { 67 | didSet { 68 | if oldValue != entryBorderColour { 69 | updateButtonStyles() 70 | } 71 | } 72 | } 73 | 74 | @IBInspectable open var entryEditingBackgroundColour: UIColor = CBPinEntryViewDefaults.entryEditingBackgroundColour { 75 | didSet { 76 | if oldValue != entryEditingBackgroundColour { 77 | updateButtonStyles() 78 | } 79 | } 80 | } 81 | 82 | @IBInspectable open var entryErrorBorderColour: UIColor = CBPinEntryViewDefaults.entryErrorColour 83 | 84 | @IBInspectable open var entryBackgroundColour: UIColor = CBPinEntryViewDefaults.entryBackgroundColour { 85 | didSet { 86 | if oldValue != entryBackgroundColour { 87 | updateButtonStyles() 88 | } 89 | } 90 | } 91 | 92 | @IBInspectable open var entryTextColour: UIColor = CBPinEntryViewDefaults.entryTextColour { 93 | didSet { 94 | if oldValue != entryTextColour { 95 | updateButtonStyles() 96 | } 97 | } 98 | } 99 | 100 | @IBInspectable open var entryFont: UIFont = CBPinEntryViewDefaults.entryFont { 101 | didSet { 102 | if oldValue != entryFont { 103 | updateButtonStyles() 104 | } 105 | } 106 | } 107 | 108 | @IBInspectable open var isSecure: Bool = CBPinEntryViewDefaults.isSecure 109 | 110 | @IBInspectable open var secureCharacter: String = CBPinEntryViewDefaults.secureCharacter 111 | 112 | @IBInspectable open var keyboardType: Int = CBPinEntryViewDefaults.keyboardType { 113 | didSet { 114 | if oldValue != keyboardType { 115 | updateTextFieldStyles() 116 | } 117 | } 118 | } 119 | 120 | open var textContentType: UITextContentType? { 121 | didSet { 122 | if #available(iOS 10, *) { 123 | if let contentType = textContentType { 124 | textField.textContentType = contentType 125 | } 126 | } 127 | } 128 | } 129 | 130 | open var textFieldCapitalization: UITextAutocapitalizationType? { 131 | didSet { 132 | if let capitalization = textFieldCapitalization { 133 | textField.autocapitalizationType = capitalization 134 | } 135 | } 136 | } 137 | 138 | public enum AllowedEntryTypes: String { 139 | case any, numerical, alphanumeric, letters 140 | } 141 | 142 | open var allowedEntryTypes: AllowedEntryTypes = .numerical 143 | 144 | 145 | @IBInspectable open var isUnderlined: Bool = false { 146 | didSet { 147 | commonInit() 148 | } 149 | } 150 | 151 | private var stackView: UIStackView? 152 | private var textField: UITextField! 153 | 154 | open var errorMode: Bool = false 155 | 156 | fileprivate var entryButtons: [UIButton] = [UIButton]() 157 | 158 | public weak var delegate: CBPinEntryViewDelegate? 159 | 160 | override public init(frame: CGRect) { 161 | super.init(frame: frame) 162 | 163 | commonInit() 164 | } 165 | 166 | required public init?(coder aDecoder: NSCoder) { 167 | super.init(coder: aDecoder) 168 | } 169 | 170 | override open func awakeFromNib() { 171 | super.awakeFromNib() 172 | 173 | commonInit() 174 | } 175 | 176 | override open func prepareForInterfaceBuilder() { 177 | commonInit() 178 | } 179 | 180 | 181 | private func commonInit() { 182 | self.subviews.forEach { view in 183 | view.removeFromSuperview() 184 | } 185 | 186 | setupStackView() 187 | setupTextField() 188 | 189 | createButtons() 190 | } 191 | 192 | private func setupStackView() { 193 | stackView = UIStackView(frame: bounds) 194 | stackView!.alignment = .fill 195 | stackView!.axis = .horizontal 196 | stackView!.distribution = .fillEqually 197 | stackView!.spacing = spacing 198 | stackView!.translatesAutoresizingMaskIntoConstraints = false 199 | 200 | self.addSubview(stackView!) 201 | 202 | stackView!.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 0).isActive = true 203 | stackView!.trailingAnchor.constraint(equalTo: trailingAnchor, constant: 0).isActive = true 204 | stackView!.topAnchor.constraint(equalTo: topAnchor, constant: 0).isActive = true 205 | stackView!.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 0).isActive = true 206 | } 207 | 208 | private func setupTextField() { 209 | textField = UITextField(frame: bounds) 210 | textField.delegate = self 211 | textField.addTarget(self, action: #selector(textfieldChanged(_:)), for: .editingChanged) 212 | 213 | self.addSubview(textField) 214 | 215 | textField.isHidden = true 216 | } 217 | 218 | func updateTextFieldStyles() { 219 | textField.keyboardType = UIKeyboardType(rawValue: keyboardType) ?? .numberPad 220 | } 221 | 222 | private func createButtons() { 223 | for i in 0.. Int? { 315 | if let intOutput = Int(textField.text!) { 316 | return intOutput 317 | } 318 | 319 | return nil 320 | } 321 | 322 | open func getPinAsString() -> String { 323 | return textField.text! 324 | } 325 | 326 | @discardableResult open override func becomeFirstResponder() -> Bool { 327 | super.becomeFirstResponder() 328 | 329 | if let firstButton = entryButtons.first { 330 | didPressCodeButton(firstButton) 331 | } 332 | 333 | return true 334 | } 335 | 336 | @discardableResult open override func resignFirstResponder() -> Bool { 337 | super.resignFirstResponder() 338 | 339 | setError(isError: false) 340 | 341 | return textField.resignFirstResponder() 342 | } 343 | } 344 | 345 | extension CBPinEntryView: UITextFieldDelegate { 346 | @objc func textfieldChanged(_ textField: UITextField) { 347 | let complete: Bool = textField.text!.count == length 348 | delegate?.entryChanged(complete) 349 | if complete { 350 | delegate?.entryCompleted(with: textField.text) 351 | } 352 | } 353 | 354 | public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 355 | errorMode = false 356 | for button in entryButtons { 357 | button.layer.borderColor = entryBorderColour.cgColor 358 | button.backgroundColor = entryBackgroundColour 359 | } 360 | 361 | let deleting = (range.location == textField.text!.count - 1 && range.length == 1 && string == "") 362 | 363 | if string.count > 0 { 364 | var allowed = true 365 | switch allowedEntryTypes { 366 | case .numerical: allowed = Scanner(string: string).scanInt(nil) 367 | case .letters: allowed = Scanner(string: string).scanCharacters(from: CharacterSet.letters, into: nil) 368 | case .alphanumeric: allowed = Scanner(string: string).scanCharacters(from: CharacterSet.alphanumerics, into: nil) 369 | case .any: break 370 | } 371 | 372 | if !allowed { 373 | return false 374 | } 375 | } 376 | 377 | let oldLength = textField.text!.count 378 | let replacementLength = string.count 379 | let rangeLength = range.length 380 | 381 | let newLength = oldLength - rangeLength + replacementLength 382 | 383 | if !deleting { 384 | for button in entryButtons { 385 | if button.tag == newLength { 386 | button.layer.borderColor = entryDefaultBorderColour.cgColor 387 | button.backgroundColor = filledEntryColour 388 | UIView.setAnimationsEnabled(false) 389 | if !isSecure { 390 | button.setTitle(string, for: .normal) 391 | } else { 392 | button.setTitle(secureCharacter, for: .normal) 393 | } 394 | UIView.setAnimationsEnabled(true) 395 | } else if button.tag == newLength + 1 { 396 | button.layer.borderColor = entryBorderColour.cgColor 397 | button.backgroundColor = entryEditingBackgroundColour 398 | } else { 399 | button.layer.borderColor = entryDefaultBorderColour.cgColor 400 | button.backgroundColor = button.tag < newLength ? filledEntryColour : entryBackgroundColour 401 | } 402 | } 403 | } else { 404 | for button in entryButtons { 405 | if button.tag == oldLength { 406 | button.layer.borderColor = entryBorderColour.cgColor 407 | button.backgroundColor = entryEditingBackgroundColour 408 | UIView.setAnimationsEnabled(false) 409 | button.setTitle("", for: .normal) 410 | UIView.setAnimationsEnabled(true) 411 | } else { 412 | button.layer.borderColor = entryDefaultBorderColour.cgColor 413 | button.backgroundColor = button.tag <= newLength ? filledEntryColour : entryBackgroundColour 414 | } 415 | } 416 | } 417 | 418 | return newLength <= length 419 | } 420 | } 421 | 422 | extension UIButton { 423 | func addBottomBorder(thickness: CGFloat, color: UIColor, cornerRadius: CGFloat = 8) { 424 | guard viewWithTag(9999) == nil else { 425 | return 426 | } 427 | 428 | let line = UIView() 429 | line.tag = 9999 430 | line.backgroundColor = color 431 | line.translatesAutoresizingMaskIntoConstraints = false 432 | addSubview(line) 433 | 434 | line.heightAnchor.constraint(equalToConstant: thickness).isActive = true 435 | line.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true 436 | line.widthAnchor.constraint(equalTo: widthAnchor).isActive = true 437 | line.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true 438 | } 439 | } 440 | -------------------------------------------------------------------------------- /Sources/CBPinEntryView/CBPinEntryView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CBPinEntryView.swift 3 | // CBPinEntry 4 | // 5 | // Created by Aalok Parikh on 10/23/20. 6 | // 7 | import UIKit 8 | 9 | public protocol CBPinEntryViewDelegate: class { 10 | func entryChanged(_ completed: Bool) 11 | func entryCompleted(with entry: String?) 12 | } 13 | 14 | @IBDesignable open class CBPinEntryView: UIView { 15 | 16 | @IBInspectable open var length: Int = CBPinEntryViewDefaults.length { 17 | didSet { 18 | commonInit() 19 | } 20 | } 21 | 22 | @IBInspectable open var spacing: CGFloat = CBPinEntryViewDefaults.spacing { 23 | didSet { 24 | commonInit() 25 | } 26 | } 27 | 28 | @IBInspectable open var entryCornerRadius: CGFloat = CBPinEntryViewDefaults.entryCornerRadius { 29 | didSet { 30 | if oldValue != entryCornerRadius { 31 | updateButtonStyles() 32 | } 33 | } 34 | } 35 | 36 | @IBInspectable open var entryBorderWidth: CGFloat = CBPinEntryViewDefaults.entryBorderWidth { 37 | didSet { 38 | if oldValue != entryBorderWidth { 39 | updateButtonStyles() 40 | } 41 | } 42 | } 43 | 44 | @IBInspectable open var entryDefaultBorderColour: UIColor = CBPinEntryViewDefaults.entryDefaultBorderColour { 45 | didSet { 46 | if oldValue != entryDefaultBorderColour { 47 | updateButtonStyles() 48 | } 49 | } 50 | } 51 | 52 | @IBInspectable open var entryBorderColour: UIColor = CBPinEntryViewDefaults.entryBorderColour { 53 | didSet { 54 | if oldValue != entryBorderColour { 55 | updateButtonStyles() 56 | } 57 | } 58 | } 59 | 60 | @IBInspectable open var entryEditingBackgroundColour: UIColor = CBPinEntryViewDefaults.entryEditingBackgroundColour { 61 | didSet { 62 | if oldValue != entryEditingBackgroundColour { 63 | updateButtonStyles() 64 | } 65 | } 66 | } 67 | 68 | @IBInspectable open var entryErrorBorderColour: UIColor = CBPinEntryViewDefaults.entryErrorColour 69 | 70 | @IBInspectable open var entryBackgroundColour: UIColor = CBPinEntryViewDefaults.entryBackgroundColour { 71 | didSet { 72 | if oldValue != entryBackgroundColour { 73 | updateButtonStyles() 74 | } 75 | } 76 | } 77 | 78 | @IBInspectable open var entryTextColour: UIColor = CBPinEntryViewDefaults.entryTextColour { 79 | didSet { 80 | if oldValue != entryTextColour { 81 | updateButtonStyles() 82 | } 83 | } 84 | } 85 | 86 | @IBInspectable open var entryFont: UIFont = CBPinEntryViewDefaults.entryFont { 87 | didSet { 88 | if oldValue != entryFont { 89 | updateButtonStyles() 90 | } 91 | } 92 | } 93 | 94 | @IBInspectable open var isSecure: Bool = CBPinEntryViewDefaults.isSecure 95 | 96 | @IBInspectable open var secureCharacter: String = CBPinEntryViewDefaults.secureCharacter 97 | 98 | @IBInspectable open var keyboardType: Int = CBPinEntryViewDefaults.keyboardType 99 | 100 | open var textContentType: UITextContentType? { 101 | didSet { 102 | if #available(iOS 10, *) { 103 | if let contentType = textContentType { 104 | textField.textContentType = contentType 105 | } 106 | } 107 | } 108 | } 109 | 110 | open var textFieldCapitalization: UITextAutocapitalizationType? { 111 | didSet { 112 | if let capitalization = textFieldCapitalization { 113 | textField.autocapitalizationType = capitalization 114 | } 115 | } 116 | } 117 | 118 | public enum AllowedEntryTypes: String { 119 | case any, numerical, alphanumeric, letters 120 | } 121 | 122 | open var allowedEntryTypes: AllowedEntryTypes = .numerical 123 | 124 | 125 | @IBInspectable open var isUnderlined: Bool = false { 126 | didSet { 127 | commonInit() 128 | } 129 | } 130 | 131 | private var stackView: UIStackView? 132 | private var textField: UITextField! 133 | 134 | open var errorMode: Bool = false 135 | 136 | fileprivate var entryButtons: [UIButton] = [UIButton]() 137 | 138 | public weak var delegate: CBPinEntryViewDelegate? 139 | 140 | override public init(frame: CGRect) { 141 | super.init(frame: frame) 142 | 143 | commonInit() 144 | } 145 | 146 | required public init?(coder aDecoder: NSCoder) { 147 | super.init(coder: aDecoder) 148 | } 149 | 150 | override open func awakeFromNib() { 151 | super.awakeFromNib() 152 | 153 | commonInit() 154 | } 155 | 156 | override open func prepareForInterfaceBuilder() { 157 | commonInit() 158 | } 159 | 160 | 161 | private func commonInit() { 162 | self.subviews.forEach { view in 163 | view.removeFromSuperview() 164 | } 165 | 166 | setupStackView() 167 | setupTextField() 168 | 169 | createButtons() 170 | } 171 | 172 | private func setupStackView() { 173 | stackView = UIStackView(frame: bounds) 174 | stackView!.alignment = .fill 175 | stackView!.axis = .horizontal 176 | stackView!.distribution = .fillEqually 177 | stackView!.spacing = spacing 178 | stackView!.translatesAutoresizingMaskIntoConstraints = false 179 | 180 | self.addSubview(stackView!) 181 | 182 | stackView!.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 0).isActive = true 183 | stackView!.trailingAnchor.constraint(equalTo: trailingAnchor, constant: 0).isActive = true 184 | stackView!.topAnchor.constraint(equalTo: topAnchor, constant: 0).isActive = true 185 | stackView!.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 0).isActive = true 186 | } 187 | 188 | private func setupTextField() { 189 | textField = UITextField(frame: bounds) 190 | textField.delegate = self 191 | textField.keyboardType = UIKeyboardType(rawValue: keyboardType) ?? .numberPad 192 | textField.addTarget(self, action: #selector(textfieldChanged(_:)), for: .editingChanged) 193 | 194 | self.addSubview(textField) 195 | 196 | textField.isHidden = true 197 | } 198 | 199 | private func createButtons() { 200 | for i in 0.. Int? { 312 | if let intOutput = Int(textField.text!) { 313 | return intOutput 314 | } 315 | 316 | return nil 317 | } 318 | 319 | open func getPinAsString() -> String { 320 | return textField.text! 321 | } 322 | 323 | open func updateSecurityCharacters() { 324 | if let text = textField.text { 325 | for button in entryButtons { //0 326 | let lenght = text.count 327 | if !text.isEmpty { 328 | for i in 0...(lenght) { 329 | if button.tag == i { 330 | if !isSecure { 331 | let char = text[text.index(text.startIndex, offsetBy: i - 1)] 332 | button.setTitle(String(char), for: .normal) 333 | } else { 334 | button.setTitle(secureCharacter, for: .normal) 335 | } 336 | } 337 | } 338 | } 339 | } 340 | } 341 | } 342 | 343 | @discardableResult open override func becomeFirstResponder() -> Bool { 344 | super.becomeFirstResponder() 345 | 346 | if let firstButton = entryButtons.first { 347 | didPressCodeButton(firstButton) 348 | } 349 | 350 | return true 351 | } 352 | 353 | @discardableResult open override func resignFirstResponder() -> Bool { 354 | super.resignFirstResponder() 355 | 356 | setError(isError: false) 357 | 358 | IQKeyboardManager.shared.shouldResignOnTouchOutside = false 359 | 360 | return textField.resignFirstResponder() 361 | } 362 | } 363 | 364 | extension CBPinEntryView: UITextFieldDelegate { 365 | @objc func textfieldChanged(_ textField: UITextField) { 366 | let complete: Bool = textField.text!.count == length 367 | delegate?.entryChanged(complete) 368 | if complete { 369 | delegate?.entryCompleted(with: textField.text) 370 | } 371 | } 372 | 373 | public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 374 | errorMode = false 375 | for button in entryButtons { 376 | button.layer.borderColor = entryBorderColour.cgColor 377 | button.backgroundColor = entryBackgroundColour 378 | } 379 | 380 | let deleting = (range.location == textField.text!.count - 1 && range.length == 1 && string == "") 381 | 382 | if string.count > 0 { 383 | var allowed = true 384 | switch allowedEntryTypes { 385 | case .numerical: allowed = Scanner(string: string).scanInt(nil) 386 | case .letters: allowed = Scanner(string: string).scanCharacters(from: CharacterSet.letters, into: nil) 387 | case .alphanumeric: allowed = Scanner(string: string).scanCharacters(from: CharacterSet.alphanumerics, into: nil) 388 | case .any: break 389 | } 390 | 391 | if !allowed { 392 | return false 393 | } 394 | } 395 | 396 | let oldLength = textField.text!.count 397 | let replacementLength = string.count 398 | let rangeLength = range.length 399 | 400 | let newLength = oldLength - rangeLength + replacementLength 401 | 402 | if !deleting { 403 | for button in entryButtons { 404 | if button.tag == newLength { 405 | button.layer.borderColor = entryDefaultBorderColour.cgColor 406 | UIView.setAnimationsEnabled(false) 407 | if !isSecure { 408 | button.setTitle(string, for: .normal) 409 | } else { 410 | button.setTitle(secureCharacter, for: .normal) 411 | } 412 | UIView.setAnimationsEnabled(true) 413 | } else if button.tag == newLength + 1 { 414 | button.layer.borderColor = entryBorderColour.cgColor 415 | button.backgroundColor = entryEditingBackgroundColour 416 | } else { 417 | button.layer.borderColor = entryDefaultBorderColour.cgColor 418 | button.backgroundColor = entryBackgroundColour 419 | } 420 | } 421 | } else { 422 | for button in entryButtons { 423 | if button.tag == oldLength { 424 | button.layer.borderColor = entryBorderColour.cgColor 425 | button.backgroundColor = entryEditingBackgroundColour 426 | UIView.setAnimationsEnabled(false) 427 | button.setTitle("", for: .normal) 428 | UIView.setAnimationsEnabled(true) 429 | } else { 430 | button.layer.borderColor = entryDefaultBorderColour.cgColor 431 | button.backgroundColor = entryBackgroundColour 432 | } 433 | } 434 | } 435 | 436 | return newLength <= length 437 | } 438 | } 439 | 440 | extension UIButton { 441 | func addBottomBorder(thickness: CGFloat, color: UIColor, cornerRadius: CGFloat = 8) { 442 | guard viewWithTag(9999) == nil else { 443 | return 444 | } 445 | 446 | let line = UIView() 447 | line.tag = 9999 448 | line.backgroundColor = color 449 | line.translatesAutoresizingMaskIntoConstraints = false 450 | addSubview(line) 451 | 452 | line.heightAnchor.constraint(equalToConstant: thickness).isActive = true 453 | line.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true 454 | line.widthAnchor.constraint(equalTo: widthAnchor).isActive = true 455 | line.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true 456 | } 457 | } 458 | -------------------------------------------------------------------------------- /Example/CBPinEntryView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0B4953603EAAD9FE0A752684 /* Pods_CBPinEntryView_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D01EBF4BC0276AA3901032AF /* Pods_CBPinEntryView_Tests.framework */; }; 11 | 0B81951883CD66F69702704F /* Pods_CBPinEntryView_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC7D9AE1AE62F8A393819D3A /* Pods_CBPinEntryView_Example.framework */; }; 12 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 13 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 14 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 15 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 16 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 17 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = 607FACC81AFB9204008FA782 /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = 607FACCF1AFB9204008FA782; 26 | remoteInfo = CBPinEntryView; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 1EF36EE374CAFC7442A03421 /* Pods-CBPinEntryView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CBPinEntryView_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example.release.xcconfig"; sourceTree = ""; }; 32 | 2164B9A14BA79EDDC9BA3A44 /* Pods-CBPinEntryView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CBPinEntryView_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example.debug.xcconfig"; sourceTree = ""; }; 33 | 2EAA631FAD3805D87B03B812 /* Pods-CBPinEntryView_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CBPinEntryView_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests.debug.xcconfig"; sourceTree = ""; }; 34 | 5608D787ADD458FF492581EE /* CBPinEntryView.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = CBPinEntryView.podspec; path = ../CBPinEntryView.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 35 | 607FACD01AFB9204008FA782 /* CBPinEntryView_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CBPinEntryView_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 36 | 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 37 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 38 | 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 39 | 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 40 | 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 41 | 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 42 | 607FACE51AFB9204008FA782 /* CBPinEntryView_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CBPinEntryView_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 44 | 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; 45 | 8E5FD62B15FB16350DDE77CD /* Pods-CBPinEntryView_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CBPinEntryView_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests.release.xcconfig"; sourceTree = ""; }; 46 | AD81672CD2113FC3C5335DF2 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 47 | C0A1EB0CD2A64783A719BFF4 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 48 | D01EBF4BC0276AA3901032AF /* Pods_CBPinEntryView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CBPinEntryView_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | DC7D9AE1AE62F8A393819D3A /* Pods_CBPinEntryView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CBPinEntryView_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | 607FACCD1AFB9204008FA782 /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | 0B81951883CD66F69702704F /* Pods_CBPinEntryView_Example.framework in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | 607FACE21AFB9204008FA782 /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | 0B4953603EAAD9FE0A752684 /* Pods_CBPinEntryView_Tests.framework in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXFrameworksBuildPhase section */ 70 | 71 | /* Begin PBXGroup section */ 72 | 1EBE100C59C352E9676CD043 /* Pods */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 2164B9A14BA79EDDC9BA3A44 /* Pods-CBPinEntryView_Example.debug.xcconfig */, 76 | 1EF36EE374CAFC7442A03421 /* Pods-CBPinEntryView_Example.release.xcconfig */, 77 | 2EAA631FAD3805D87B03B812 /* Pods-CBPinEntryView_Tests.debug.xcconfig */, 78 | 8E5FD62B15FB16350DDE77CD /* Pods-CBPinEntryView_Tests.release.xcconfig */, 79 | ); 80 | name = Pods; 81 | sourceTree = ""; 82 | }; 83 | 607FACC71AFB9204008FA782 = { 84 | isa = PBXGroup; 85 | children = ( 86 | 607FACF51AFB993E008FA782 /* Podspec Metadata */, 87 | 607FACD21AFB9204008FA782 /* Example for CBPinEntryView */, 88 | 607FACE81AFB9204008FA782 /* Tests */, 89 | 607FACD11AFB9204008FA782 /* Products */, 90 | 1EBE100C59C352E9676CD043 /* Pods */, 91 | 87F0DF45275CFE76ADC0CEC1 /* Frameworks */, 92 | ); 93 | sourceTree = ""; 94 | }; 95 | 607FACD11AFB9204008FA782 /* Products */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | 607FACD01AFB9204008FA782 /* CBPinEntryView_Example.app */, 99 | 607FACE51AFB9204008FA782 /* CBPinEntryView_Tests.xctest */, 100 | ); 101 | name = Products; 102 | sourceTree = ""; 103 | }; 104 | 607FACD21AFB9204008FA782 /* Example for CBPinEntryView */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */, 108 | 607FACD71AFB9204008FA782 /* ViewController.swift */, 109 | 607FACD91AFB9204008FA782 /* Main.storyboard */, 110 | 607FACDC1AFB9204008FA782 /* Images.xcassets */, 111 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, 112 | 607FACD31AFB9204008FA782 /* Supporting Files */, 113 | ); 114 | name = "Example for CBPinEntryView"; 115 | path = CBPinEntryView; 116 | sourceTree = ""; 117 | }; 118 | 607FACD31AFB9204008FA782 /* Supporting Files */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | 607FACD41AFB9204008FA782 /* Info.plist */, 122 | ); 123 | name = "Supporting Files"; 124 | sourceTree = ""; 125 | }; 126 | 607FACE81AFB9204008FA782 /* Tests */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 607FACEB1AFB9204008FA782 /* Tests.swift */, 130 | 607FACE91AFB9204008FA782 /* Supporting Files */, 131 | ); 132 | path = Tests; 133 | sourceTree = ""; 134 | }; 135 | 607FACE91AFB9204008FA782 /* Supporting Files */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | 607FACEA1AFB9204008FA782 /* Info.plist */, 139 | ); 140 | name = "Supporting Files"; 141 | sourceTree = ""; 142 | }; 143 | 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | 5608D787ADD458FF492581EE /* CBPinEntryView.podspec */, 147 | C0A1EB0CD2A64783A719BFF4 /* README.md */, 148 | AD81672CD2113FC3C5335DF2 /* LICENSE */, 149 | ); 150 | name = "Podspec Metadata"; 151 | sourceTree = ""; 152 | }; 153 | 87F0DF45275CFE76ADC0CEC1 /* Frameworks */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | DC7D9AE1AE62F8A393819D3A /* Pods_CBPinEntryView_Example.framework */, 157 | D01EBF4BC0276AA3901032AF /* Pods_CBPinEntryView_Tests.framework */, 158 | ); 159 | name = Frameworks; 160 | sourceTree = ""; 161 | }; 162 | /* End PBXGroup section */ 163 | 164 | /* Begin PBXNativeTarget section */ 165 | 607FACCF1AFB9204008FA782 /* CBPinEntryView_Example */ = { 166 | isa = PBXNativeTarget; 167 | buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "CBPinEntryView_Example" */; 168 | buildPhases = ( 169 | 72B8DBDB36F65A08F93F4B6F /* [CP] Check Pods Manifest.lock */, 170 | 607FACCC1AFB9204008FA782 /* Sources */, 171 | 607FACCD1AFB9204008FA782 /* Frameworks */, 172 | 607FACCE1AFB9204008FA782 /* Resources */, 173 | 79DE4521C13BBA2A231E43EC /* [CP] Embed Pods Frameworks */, 174 | ); 175 | buildRules = ( 176 | ); 177 | dependencies = ( 178 | ); 179 | name = CBPinEntryView_Example; 180 | productName = CBPinEntryView; 181 | productReference = 607FACD01AFB9204008FA782 /* CBPinEntryView_Example.app */; 182 | productType = "com.apple.product-type.application"; 183 | }; 184 | 607FACE41AFB9204008FA782 /* CBPinEntryView_Tests */ = { 185 | isa = PBXNativeTarget; 186 | buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "CBPinEntryView_Tests" */; 187 | buildPhases = ( 188 | A9B5F4026AD63CDD57BBC382 /* [CP] Check Pods Manifest.lock */, 189 | 607FACE11AFB9204008FA782 /* Sources */, 190 | 607FACE21AFB9204008FA782 /* Frameworks */, 191 | 607FACE31AFB9204008FA782 /* Resources */, 192 | ); 193 | buildRules = ( 194 | ); 195 | dependencies = ( 196 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */, 197 | ); 198 | name = CBPinEntryView_Tests; 199 | productName = Tests; 200 | productReference = 607FACE51AFB9204008FA782 /* CBPinEntryView_Tests.xctest */; 201 | productType = "com.apple.product-type.bundle.unit-test"; 202 | }; 203 | /* End PBXNativeTarget section */ 204 | 205 | /* Begin PBXProject section */ 206 | 607FACC81AFB9204008FA782 /* Project object */ = { 207 | isa = PBXProject; 208 | attributes = { 209 | LastSwiftUpdateCheck = 0720; 210 | LastUpgradeCheck = 1020; 211 | ORGANIZATIONNAME = CocoaPods; 212 | TargetAttributes = { 213 | 607FACCF1AFB9204008FA782 = { 214 | CreatedOnToolsVersion = 6.3.1; 215 | DevelopmentTeam = YX766DP4VF; 216 | LastSwiftMigration = 1020; 217 | }; 218 | 607FACE41AFB9204008FA782 = { 219 | CreatedOnToolsVersion = 6.3.1; 220 | DevelopmentTeam = YX766DP4VF; 221 | LastSwiftMigration = 1020; 222 | TestTargetID = 607FACCF1AFB9204008FA782; 223 | }; 224 | }; 225 | }; 226 | buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "CBPinEntryView" */; 227 | compatibilityVersion = "Xcode 3.2"; 228 | developmentRegion = English; 229 | hasScannedForEncodings = 0; 230 | knownRegions = ( 231 | English, 232 | en, 233 | Base, 234 | ); 235 | mainGroup = 607FACC71AFB9204008FA782; 236 | productRefGroup = 607FACD11AFB9204008FA782 /* Products */; 237 | projectDirPath = ""; 238 | projectRoot = ""; 239 | targets = ( 240 | 607FACCF1AFB9204008FA782 /* CBPinEntryView_Example */, 241 | 607FACE41AFB9204008FA782 /* CBPinEntryView_Tests */, 242 | ); 243 | }; 244 | /* End PBXProject section */ 245 | 246 | /* Begin PBXResourcesBuildPhase section */ 247 | 607FACCE1AFB9204008FA782 /* Resources */ = { 248 | isa = PBXResourcesBuildPhase; 249 | buildActionMask = 2147483647; 250 | files = ( 251 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, 252 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, 253 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, 254 | ); 255 | runOnlyForDeploymentPostprocessing = 0; 256 | }; 257 | 607FACE31AFB9204008FA782 /* Resources */ = { 258 | isa = PBXResourcesBuildPhase; 259 | buildActionMask = 2147483647; 260 | files = ( 261 | ); 262 | runOnlyForDeploymentPostprocessing = 0; 263 | }; 264 | /* End PBXResourcesBuildPhase section */ 265 | 266 | /* Begin PBXShellScriptBuildPhase section */ 267 | 72B8DBDB36F65A08F93F4B6F /* [CP] Check Pods Manifest.lock */ = { 268 | isa = PBXShellScriptBuildPhase; 269 | buildActionMask = 2147483647; 270 | files = ( 271 | ); 272 | inputPaths = ( 273 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 274 | "${PODS_ROOT}/Manifest.lock", 275 | ); 276 | name = "[CP] Check Pods Manifest.lock"; 277 | outputPaths = ( 278 | "$(DERIVED_FILE_DIR)/Pods-CBPinEntryView_Example-checkManifestLockResult.txt", 279 | ); 280 | runOnlyForDeploymentPostprocessing = 0; 281 | shellPath = /bin/sh; 282 | 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"; 283 | showEnvVarsInLog = 0; 284 | }; 285 | 79DE4521C13BBA2A231E43EC /* [CP] Embed Pods Frameworks */ = { 286 | isa = PBXShellScriptBuildPhase; 287 | buildActionMask = 2147483647; 288 | files = ( 289 | ); 290 | inputPaths = ( 291 | "${PODS_ROOT}/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example-frameworks.sh", 292 | "${BUILT_PRODUCTS_DIR}/CBPinEntryView/CBPinEntryView.framework", 293 | ); 294 | name = "[CP] Embed Pods Frameworks"; 295 | outputPaths = ( 296 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CBPinEntryView.framework", 297 | ); 298 | runOnlyForDeploymentPostprocessing = 0; 299 | shellPath = /bin/sh; 300 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example-frameworks.sh\"\n"; 301 | showEnvVarsInLog = 0; 302 | }; 303 | A9B5F4026AD63CDD57BBC382 /* [CP] Check Pods Manifest.lock */ = { 304 | isa = PBXShellScriptBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | ); 308 | inputPaths = ( 309 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 310 | "${PODS_ROOT}/Manifest.lock", 311 | ); 312 | name = "[CP] Check Pods Manifest.lock"; 313 | outputPaths = ( 314 | "$(DERIVED_FILE_DIR)/Pods-CBPinEntryView_Tests-checkManifestLockResult.txt", 315 | ); 316 | runOnlyForDeploymentPostprocessing = 0; 317 | shellPath = /bin/sh; 318 | 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"; 319 | showEnvVarsInLog = 0; 320 | }; 321 | /* End PBXShellScriptBuildPhase section */ 322 | 323 | /* Begin PBXSourcesBuildPhase section */ 324 | 607FACCC1AFB9204008FA782 /* Sources */ = { 325 | isa = PBXSourcesBuildPhase; 326 | buildActionMask = 2147483647; 327 | files = ( 328 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, 329 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, 330 | ); 331 | runOnlyForDeploymentPostprocessing = 0; 332 | }; 333 | 607FACE11AFB9204008FA782 /* Sources */ = { 334 | isa = PBXSourcesBuildPhase; 335 | buildActionMask = 2147483647; 336 | files = ( 337 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, 338 | ); 339 | runOnlyForDeploymentPostprocessing = 0; 340 | }; 341 | /* End PBXSourcesBuildPhase section */ 342 | 343 | /* Begin PBXTargetDependency section */ 344 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { 345 | isa = PBXTargetDependency; 346 | target = 607FACCF1AFB9204008FA782 /* CBPinEntryView_Example */; 347 | targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; 348 | }; 349 | /* End PBXTargetDependency section */ 350 | 351 | /* Begin PBXVariantGroup section */ 352 | 607FACD91AFB9204008FA782 /* Main.storyboard */ = { 353 | isa = PBXVariantGroup; 354 | children = ( 355 | 607FACDA1AFB9204008FA782 /* Base */, 356 | ); 357 | name = Main.storyboard; 358 | sourceTree = ""; 359 | }; 360 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { 361 | isa = PBXVariantGroup; 362 | children = ( 363 | 607FACDF1AFB9204008FA782 /* Base */, 364 | ); 365 | name = LaunchScreen.xib; 366 | sourceTree = ""; 367 | }; 368 | /* End PBXVariantGroup section */ 369 | 370 | /* Begin XCBuildConfiguration section */ 371 | 607FACED1AFB9204008FA782 /* Debug */ = { 372 | isa = XCBuildConfiguration; 373 | buildSettings = { 374 | ALWAYS_SEARCH_USER_PATHS = NO; 375 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 376 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 377 | CLANG_CXX_LIBRARY = "libc++"; 378 | CLANG_ENABLE_MODULES = YES; 379 | CLANG_ENABLE_OBJC_ARC = YES; 380 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 381 | CLANG_WARN_BOOL_CONVERSION = YES; 382 | CLANG_WARN_COMMA = YES; 383 | CLANG_WARN_CONSTANT_CONVERSION = YES; 384 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 385 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 386 | CLANG_WARN_EMPTY_BODY = YES; 387 | CLANG_WARN_ENUM_CONVERSION = YES; 388 | CLANG_WARN_INFINITE_RECURSION = YES; 389 | CLANG_WARN_INT_CONVERSION = YES; 390 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 391 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 392 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 393 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 394 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 395 | CLANG_WARN_STRICT_PROTOTYPES = YES; 396 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 397 | CLANG_WARN_UNREACHABLE_CODE = YES; 398 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 399 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 400 | COPY_PHASE_STRIP = NO; 401 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 402 | ENABLE_STRICT_OBJC_MSGSEND = YES; 403 | ENABLE_TESTABILITY = YES; 404 | GCC_C_LANGUAGE_STANDARD = gnu99; 405 | GCC_DYNAMIC_NO_PIC = NO; 406 | GCC_NO_COMMON_BLOCKS = YES; 407 | GCC_OPTIMIZATION_LEVEL = 0; 408 | GCC_PREPROCESSOR_DEFINITIONS = ( 409 | "DEBUG=1", 410 | "$(inherited)", 411 | ); 412 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 413 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 414 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 415 | GCC_WARN_UNDECLARED_SELECTOR = YES; 416 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 417 | GCC_WARN_UNUSED_FUNCTION = YES; 418 | GCC_WARN_UNUSED_VARIABLE = YES; 419 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 420 | MTL_ENABLE_DEBUG_INFO = YES; 421 | ONLY_ACTIVE_ARCH = YES; 422 | SDKROOT = iphoneos; 423 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 424 | }; 425 | name = Debug; 426 | }; 427 | 607FACEE1AFB9204008FA782 /* Release */ = { 428 | isa = XCBuildConfiguration; 429 | buildSettings = { 430 | ALWAYS_SEARCH_USER_PATHS = NO; 431 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 432 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 433 | CLANG_CXX_LIBRARY = "libc++"; 434 | CLANG_ENABLE_MODULES = YES; 435 | CLANG_ENABLE_OBJC_ARC = YES; 436 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 437 | CLANG_WARN_BOOL_CONVERSION = YES; 438 | CLANG_WARN_COMMA = YES; 439 | CLANG_WARN_CONSTANT_CONVERSION = YES; 440 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 441 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 442 | CLANG_WARN_EMPTY_BODY = YES; 443 | CLANG_WARN_ENUM_CONVERSION = YES; 444 | CLANG_WARN_INFINITE_RECURSION = YES; 445 | CLANG_WARN_INT_CONVERSION = YES; 446 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 447 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 448 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 449 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 450 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 451 | CLANG_WARN_STRICT_PROTOTYPES = YES; 452 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 453 | CLANG_WARN_UNREACHABLE_CODE = YES; 454 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 455 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 456 | COPY_PHASE_STRIP = NO; 457 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 458 | ENABLE_NS_ASSERTIONS = NO; 459 | ENABLE_STRICT_OBJC_MSGSEND = YES; 460 | GCC_C_LANGUAGE_STANDARD = gnu99; 461 | GCC_NO_COMMON_BLOCKS = YES; 462 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 463 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 464 | GCC_WARN_UNDECLARED_SELECTOR = YES; 465 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 466 | GCC_WARN_UNUSED_FUNCTION = YES; 467 | GCC_WARN_UNUSED_VARIABLE = YES; 468 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 469 | MTL_ENABLE_DEBUG_INFO = NO; 470 | SDKROOT = iphoneos; 471 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 472 | VALIDATE_PRODUCT = YES; 473 | }; 474 | name = Release; 475 | }; 476 | 607FACF01AFB9204008FA782 /* Debug */ = { 477 | isa = XCBuildConfiguration; 478 | baseConfigurationReference = 2164B9A14BA79EDDC9BA3A44 /* Pods-CBPinEntryView_Example.debug.xcconfig */; 479 | buildSettings = { 480 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 481 | DEVELOPMENT_TEAM = YX766DP4VF; 482 | INFOPLIST_FILE = CBPinEntryView/Info.plist; 483 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 484 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 485 | MODULE_NAME = ExampleApp; 486 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 487 | PRODUCT_NAME = "$(TARGET_NAME)"; 488 | SWIFT_VERSION = 5.0; 489 | }; 490 | name = Debug; 491 | }; 492 | 607FACF11AFB9204008FA782 /* Release */ = { 493 | isa = XCBuildConfiguration; 494 | baseConfigurationReference = 1EF36EE374CAFC7442A03421 /* Pods-CBPinEntryView_Example.release.xcconfig */; 495 | buildSettings = { 496 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 497 | DEVELOPMENT_TEAM = YX766DP4VF; 498 | INFOPLIST_FILE = CBPinEntryView/Info.plist; 499 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 500 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 501 | MODULE_NAME = ExampleApp; 502 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 503 | PRODUCT_NAME = "$(TARGET_NAME)"; 504 | SWIFT_VERSION = 5.0; 505 | }; 506 | name = Release; 507 | }; 508 | 607FACF31AFB9204008FA782 /* Debug */ = { 509 | isa = XCBuildConfiguration; 510 | baseConfigurationReference = 2EAA631FAD3805D87B03B812 /* Pods-CBPinEntryView_Tests.debug.xcconfig */; 511 | buildSettings = { 512 | DEVELOPMENT_TEAM = YX766DP4VF; 513 | FRAMEWORK_SEARCH_PATHS = ( 514 | "$(SDKROOT)/Developer/Library/Frameworks", 515 | "$(inherited)", 516 | ); 517 | GCC_PREPROCESSOR_DEFINITIONS = ( 518 | "DEBUG=1", 519 | "$(inherited)", 520 | ); 521 | INFOPLIST_FILE = Tests/Info.plist; 522 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 523 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 524 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 525 | PRODUCT_NAME = "$(TARGET_NAME)"; 526 | SWIFT_VERSION = 5.0; 527 | }; 528 | name = Debug; 529 | }; 530 | 607FACF41AFB9204008FA782 /* Release */ = { 531 | isa = XCBuildConfiguration; 532 | baseConfigurationReference = 8E5FD62B15FB16350DDE77CD /* Pods-CBPinEntryView_Tests.release.xcconfig */; 533 | buildSettings = { 534 | DEVELOPMENT_TEAM = YX766DP4VF; 535 | FRAMEWORK_SEARCH_PATHS = ( 536 | "$(SDKROOT)/Developer/Library/Frameworks", 537 | "$(inherited)", 538 | ); 539 | INFOPLIST_FILE = Tests/Info.plist; 540 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 541 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 542 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 543 | PRODUCT_NAME = "$(TARGET_NAME)"; 544 | SWIFT_VERSION = 5.0; 545 | }; 546 | name = Release; 547 | }; 548 | /* End XCBuildConfiguration section */ 549 | 550 | /* Begin XCConfigurationList section */ 551 | 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "CBPinEntryView" */ = { 552 | isa = XCConfigurationList; 553 | buildConfigurations = ( 554 | 607FACED1AFB9204008FA782 /* Debug */, 555 | 607FACEE1AFB9204008FA782 /* Release */, 556 | ); 557 | defaultConfigurationIsVisible = 0; 558 | defaultConfigurationName = Release; 559 | }; 560 | 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "CBPinEntryView_Example" */ = { 561 | isa = XCConfigurationList; 562 | buildConfigurations = ( 563 | 607FACF01AFB9204008FA782 /* Debug */, 564 | 607FACF11AFB9204008FA782 /* Release */, 565 | ); 566 | defaultConfigurationIsVisible = 0; 567 | defaultConfigurationName = Release; 568 | }; 569 | 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "CBPinEntryView_Tests" */ = { 570 | isa = XCConfigurationList; 571 | buildConfigurations = ( 572 | 607FACF31AFB9204008FA782 /* Debug */, 573 | 607FACF41AFB9204008FA782 /* Release */, 574 | ); 575 | defaultConfigurationIsVisible = 0; 576 | defaultConfigurationName = Release; 577 | }; 578 | /* End XCConfigurationList section */ 579 | }; 580 | rootObject = 607FACC81AFB9204008FA782 /* Project object */; 581 | } 582 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 00A3A51F6A8F885AE78196F52DD11801 /* Pods-CBPinEntryView_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 138F04A5AAC7E110FC28B78BB0FCBF4F /* Pods-CBPinEntryView_Tests-dummy.m */; }; 11 | 0DB4653E7B68A8BF93AE0D4F31D32FDB /* Pods-CBPinEntryView_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D25C3DA5ED78CFAE83F033C7BB2F1486 /* Pods-CBPinEntryView_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 12430F40A2800FF3211A830E76E0BBE4 /* CBPinEntryView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DBB71AD83F46632A13882EE57523A703 /* CBPinEntryView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | 2AB800127D791E84467E1A8C3B45EB8F /* CBPinEntryViewDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB2C25CC923D63C35F49F307ACDEC1CE /* CBPinEntryViewDefaults.swift */; }; 14 | 3463FF4473536AB93C219D7DD1C11284 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */; }; 15 | 43B1AF7314304EAA46DBA4459CD0407E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */; }; 16 | 564A30CB136DE68E800DB3C83DFC2273 /* Pods-CBPinEntryView_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 55ED0AA874F4234BE5800F7683845F5D /* Pods-CBPinEntryView_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | 646441EE5BDC6685DDBE99C0989E3B08 /* Pods-CBPinEntryView_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F9C6FF119041120349A81BEEB3F040 /* Pods-CBPinEntryView_Example-dummy.m */; }; 18 | 9F47AC08F8551C6CCFE6ABCEF1155673 /* CBPinEntryView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 89FA302CF759B4CEA342E5DBD627C411 /* CBPinEntryView-dummy.m */; }; 19 | A63F6BF4E7DECB674F988989A0439AD4 /* CBPinEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7C6F79E08496FD66B8D12C83FE08D6 /* CBPinEntryView.swift */; }; 20 | B9C406D12DFD172C43053EF1C7DAC600 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXContainerItemProxy section */ 24 | 5A9F3A2D54B551A70A4CA49F36F2F021 /* PBXContainerItemProxy */ = { 25 | isa = PBXContainerItemProxy; 26 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 27 | proxyType = 1; 28 | remoteGlobalIDString = F5CE12202ED0E0599B08F13F2241CFAB; 29 | remoteInfo = "Pods-CBPinEntryView_Example"; 30 | }; 31 | D209A3C77DE788B54DEA3EFFDD32F7A9 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = FEE25341D09653377E7438F27F96DA46; 36 | remoteInfo = CBPinEntryView; 37 | }; 38 | /* End PBXContainerItemProxy section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | 138F04A5AAC7E110FC28B78BB0FCBF4F /* Pods-CBPinEntryView_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-CBPinEntryView_Tests-dummy.m"; sourceTree = ""; }; 42 | 18F9C6FF119041120349A81BEEB3F040 /* Pods-CBPinEntryView_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-CBPinEntryView_Example-dummy.m"; sourceTree = ""; }; 43 | 3272BB5AEDCCACA306A7D66FC92112CC /* Pods-CBPinEntryView_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-CBPinEntryView_Tests.debug.xcconfig"; sourceTree = ""; }; 44 | 393E430AD467C7A682C9030A8EEB5E68 /* Pods-CBPinEntryView_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-CBPinEntryView_Tests-acknowledgements.markdown"; sourceTree = ""; }; 45 | 39A025B3A6AEA4DD1B5AAFDA7B32676C /* CBPinEntryView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = CBPinEntryView.xcconfig; sourceTree = ""; }; 46 | 436AAE05397E096EF1E3382C14EECED0 /* CBPinEntryView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "CBPinEntryView-Info.plist"; sourceTree = ""; }; 47 | 55ED0AA874F4234BE5800F7683845F5D /* Pods-CBPinEntryView_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-CBPinEntryView_Example-umbrella.h"; sourceTree = ""; }; 48 | 5AAA84AC1BE4A4EC49AC10A688E6B70E /* CBPinEntryView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = CBPinEntryView.modulemap; sourceTree = ""; }; 49 | 61618AC0BFA9551A0F0CEE17BCBCD11B /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 50 | 642452B047DACB5525E82CE62AEBB3CC /* Pods-CBPinEntryView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-CBPinEntryView_Example.release.xcconfig"; sourceTree = ""; }; 51 | 6508D7A3CABEFD65DEA4F65E723346E2 /* CBPinEntryView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CBPinEntryView-prefix.pch"; sourceTree = ""; }; 52 | 6979FCD578D60E74C00A3DF84DA0108E /* Pods-CBPinEntryView_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-CBPinEntryView_Example-acknowledgements.plist"; sourceTree = ""; }; 53 | 754A36E489BAB1C6CF8C5CDA32F8E9A3 /* Pods-CBPinEntryView_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-CBPinEntryView_Example-Info.plist"; sourceTree = ""; }; 54 | 75D59A8FAC4A4B1976B9C5F70D7C0437 /* Pods-CBPinEntryView_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-CBPinEntryView_Tests-acknowledgements.plist"; sourceTree = ""; }; 55 | 7FAC36C36A53AB288914EFE3F24FF978 /* Pods_CBPinEntryView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CBPinEntryView_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | 862B3BCA6B53127D7FEC44BD067CD95F /* CBPinEntryView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = CBPinEntryView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 57 | 89FA302CF759B4CEA342E5DBD627C411 /* CBPinEntryView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CBPinEntryView-dummy.m"; sourceTree = ""; }; 58 | 9B48853FDA00A9773195658044F6CD93 /* Pods-CBPinEntryView_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-CBPinEntryView_Tests-Info.plist"; sourceTree = ""; }; 59 | 9F1C604D2878A4CE701CD1D6A2EF840B /* Pods-CBPinEntryView_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-CBPinEntryView_Tests.modulemap"; sourceTree = ""; }; 60 | A410BD7EF8386147DD2CF7127CF872B7 /* Pods-CBPinEntryView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-CBPinEntryView_Example.debug.xcconfig"; sourceTree = ""; }; 61 | A45726B15C4E5403605C7C3F19115734 /* CBPinEntryView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CBPinEntryView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | A6B4D9110689FFF0A9310AFB134AEEEC /* Pods_CBPinEntryView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CBPinEntryView_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 63 | A89A1125570261BB94A075DBE22D7675 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 64 | B36AB396275697EEE1A5B13BA8A38FE3 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 65 | BF7C6F79E08496FD66B8D12C83FE08D6 /* CBPinEntryView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CBPinEntryView.swift; path = CBPinEntryView/Classes/CBPinEntryView.swift; sourceTree = ""; }; 66 | C9DB56E1E73C65AB641DA66AB209ACB9 /* Pods-CBPinEntryView_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-CBPinEntryView_Example-frameworks.sh"; sourceTree = ""; }; 67 | D25C3DA5ED78CFAE83F033C7BB2F1486 /* Pods-CBPinEntryView_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-CBPinEntryView_Tests-umbrella.h"; sourceTree = ""; }; 68 | D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 69 | DBB71AD83F46632A13882EE57523A703 /* CBPinEntryView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CBPinEntryView-umbrella.h"; sourceTree = ""; }; 70 | E30F9781E3C0F88BCB37BE03545221DC /* Pods-CBPinEntryView_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-CBPinEntryView_Tests.release.xcconfig"; sourceTree = ""; }; 71 | EB2C25CC923D63C35F49F307ACDEC1CE /* CBPinEntryViewDefaults.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CBPinEntryViewDefaults.swift; path = CBPinEntryView/Classes/CBPinEntryViewDefaults.swift; sourceTree = ""; }; 72 | EC9B5F457E8F0DF6B655A8C7D7403565 /* Pods-CBPinEntryView_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-CBPinEntryView_Example-acknowledgements.markdown"; sourceTree = ""; }; 73 | F5F5B748AABF1F1EFF38EC623B4C8F64 /* Pods-CBPinEntryView_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-CBPinEntryView_Example.modulemap"; sourceTree = ""; }; 74 | /* End PBXFileReference section */ 75 | 76 | /* Begin PBXFrameworksBuildPhase section */ 77 | 3C4FC05E23C0548C986A13FD1208973E /* Frameworks */ = { 78 | isa = PBXFrameworksBuildPhase; 79 | buildActionMask = 2147483647; 80 | files = ( 81 | B9C406D12DFD172C43053EF1C7DAC600 /* Foundation.framework in Frameworks */, 82 | ); 83 | runOnlyForDeploymentPostprocessing = 0; 84 | }; 85 | 6B48A2A864C7479E9285FBDE684ED217 /* Frameworks */ = { 86 | isa = PBXFrameworksBuildPhase; 87 | buildActionMask = 2147483647; 88 | files = ( 89 | 43B1AF7314304EAA46DBA4459CD0407E /* Foundation.framework in Frameworks */, 90 | ); 91 | runOnlyForDeploymentPostprocessing = 0; 92 | }; 93 | FD4E000FC7C8347C6CBEE0A8E70137A1 /* Frameworks */ = { 94 | isa = PBXFrameworksBuildPhase; 95 | buildActionMask = 2147483647; 96 | files = ( 97 | 3463FF4473536AB93C219D7DD1C11284 /* Foundation.framework in Frameworks */, 98 | ); 99 | runOnlyForDeploymentPostprocessing = 0; 100 | }; 101 | /* End PBXFrameworksBuildPhase section */ 102 | 103 | /* Begin PBXGroup section */ 104 | 0209148E296AAD530C272C651A7BBB19 /* Pods-CBPinEntryView_Example */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | F5F5B748AABF1F1EFF38EC623B4C8F64 /* Pods-CBPinEntryView_Example.modulemap */, 108 | EC9B5F457E8F0DF6B655A8C7D7403565 /* Pods-CBPinEntryView_Example-acknowledgements.markdown */, 109 | 6979FCD578D60E74C00A3DF84DA0108E /* Pods-CBPinEntryView_Example-acknowledgements.plist */, 110 | 18F9C6FF119041120349A81BEEB3F040 /* Pods-CBPinEntryView_Example-dummy.m */, 111 | C9DB56E1E73C65AB641DA66AB209ACB9 /* Pods-CBPinEntryView_Example-frameworks.sh */, 112 | 754A36E489BAB1C6CF8C5CDA32F8E9A3 /* Pods-CBPinEntryView_Example-Info.plist */, 113 | 55ED0AA874F4234BE5800F7683845F5D /* Pods-CBPinEntryView_Example-umbrella.h */, 114 | A410BD7EF8386147DD2CF7127CF872B7 /* Pods-CBPinEntryView_Example.debug.xcconfig */, 115 | 642452B047DACB5525E82CE62AEBB3CC /* Pods-CBPinEntryView_Example.release.xcconfig */, 116 | ); 117 | name = "Pods-CBPinEntryView_Example"; 118 | path = "Target Support Files/Pods-CBPinEntryView_Example"; 119 | sourceTree = ""; 120 | }; 121 | 24741AD8CFE24BA2A657406E4BAC5608 /* Support Files */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | 5AAA84AC1BE4A4EC49AC10A688E6B70E /* CBPinEntryView.modulemap */, 125 | 39A025B3A6AEA4DD1B5AAFDA7B32676C /* CBPinEntryView.xcconfig */, 126 | 89FA302CF759B4CEA342E5DBD627C411 /* CBPinEntryView-dummy.m */, 127 | 436AAE05397E096EF1E3382C14EECED0 /* CBPinEntryView-Info.plist */, 128 | 6508D7A3CABEFD65DEA4F65E723346E2 /* CBPinEntryView-prefix.pch */, 129 | DBB71AD83F46632A13882EE57523A703 /* CBPinEntryView-umbrella.h */, 130 | ); 131 | name = "Support Files"; 132 | path = "Example/Pods/Target Support Files/CBPinEntryView"; 133 | sourceTree = ""; 134 | }; 135 | 44D5347904CF754D6785B84253F2574A /* iOS */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */, 139 | ); 140 | name = iOS; 141 | sourceTree = ""; 142 | }; 143 | 57AF8F6CB866A8080D826FC2ED3EF04E /* CBPinEntryView */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | BF7C6F79E08496FD66B8D12C83FE08D6 /* CBPinEntryView.swift */, 147 | EB2C25CC923D63C35F49F307ACDEC1CE /* CBPinEntryViewDefaults.swift */, 148 | 8C416D6C2BF540F524CAE8F65C988469 /* Pod */, 149 | 24741AD8CFE24BA2A657406E4BAC5608 /* Support Files */, 150 | ); 151 | name = CBPinEntryView; 152 | path = ../..; 153 | sourceTree = ""; 154 | }; 155 | 70EC57FF41DE6FFF7CF36677547ABCA9 /* Targets Support Files */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | 0209148E296AAD530C272C651A7BBB19 /* Pods-CBPinEntryView_Example */, 159 | 88139546F818DA26933BC4F275CB61E0 /* Pods-CBPinEntryView_Tests */, 160 | ); 161 | name = "Targets Support Files"; 162 | sourceTree = ""; 163 | }; 164 | 7102F29A02F11B9365E7B0FA3ADB5B30 /* Development Pods */ = { 165 | isa = PBXGroup; 166 | children = ( 167 | 57AF8F6CB866A8080D826FC2ED3EF04E /* CBPinEntryView */, 168 | ); 169 | name = "Development Pods"; 170 | sourceTree = ""; 171 | }; 172 | 74EB7F91A07CD9B63B107565C71F9846 /* Products */ = { 173 | isa = PBXGroup; 174 | children = ( 175 | A45726B15C4E5403605C7C3F19115734 /* CBPinEntryView.framework */, 176 | 7FAC36C36A53AB288914EFE3F24FF978 /* Pods_CBPinEntryView_Example.framework */, 177 | A6B4D9110689FFF0A9310AFB134AEEEC /* Pods_CBPinEntryView_Tests.framework */, 178 | ); 179 | name = Products; 180 | sourceTree = ""; 181 | }; 182 | 7DB346D0F39D3F0E887471402A8071AB = { 183 | isa = PBXGroup; 184 | children = ( 185 | B36AB396275697EEE1A5B13BA8A38FE3 /* Podfile */, 186 | 7102F29A02F11B9365E7B0FA3ADB5B30 /* Development Pods */, 187 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, 188 | 74EB7F91A07CD9B63B107565C71F9846 /* Products */, 189 | 70EC57FF41DE6FFF7CF36677547ABCA9 /* Targets Support Files */, 190 | ); 191 | sourceTree = ""; 192 | }; 193 | 88139546F818DA26933BC4F275CB61E0 /* Pods-CBPinEntryView_Tests */ = { 194 | isa = PBXGroup; 195 | children = ( 196 | 9F1C604D2878A4CE701CD1D6A2EF840B /* Pods-CBPinEntryView_Tests.modulemap */, 197 | 393E430AD467C7A682C9030A8EEB5E68 /* Pods-CBPinEntryView_Tests-acknowledgements.markdown */, 198 | 75D59A8FAC4A4B1976B9C5F70D7C0437 /* Pods-CBPinEntryView_Tests-acknowledgements.plist */, 199 | 138F04A5AAC7E110FC28B78BB0FCBF4F /* Pods-CBPinEntryView_Tests-dummy.m */, 200 | 9B48853FDA00A9773195658044F6CD93 /* Pods-CBPinEntryView_Tests-Info.plist */, 201 | D25C3DA5ED78CFAE83F033C7BB2F1486 /* Pods-CBPinEntryView_Tests-umbrella.h */, 202 | 3272BB5AEDCCACA306A7D66FC92112CC /* Pods-CBPinEntryView_Tests.debug.xcconfig */, 203 | E30F9781E3C0F88BCB37BE03545221DC /* Pods-CBPinEntryView_Tests.release.xcconfig */, 204 | ); 205 | name = "Pods-CBPinEntryView_Tests"; 206 | path = "Target Support Files/Pods-CBPinEntryView_Tests"; 207 | sourceTree = ""; 208 | }; 209 | 8C416D6C2BF540F524CAE8F65C988469 /* Pod */ = { 210 | isa = PBXGroup; 211 | children = ( 212 | 862B3BCA6B53127D7FEC44BD067CD95F /* CBPinEntryView.podspec */, 213 | 61618AC0BFA9551A0F0CEE17BCBCD11B /* LICENSE */, 214 | A89A1125570261BB94A075DBE22D7675 /* README.md */, 215 | ); 216 | name = Pod; 217 | sourceTree = ""; 218 | }; 219 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { 220 | isa = PBXGroup; 221 | children = ( 222 | 44D5347904CF754D6785B84253F2574A /* iOS */, 223 | ); 224 | name = Frameworks; 225 | sourceTree = ""; 226 | }; 227 | /* End PBXGroup section */ 228 | 229 | /* Begin PBXHeadersBuildPhase section */ 230 | 1AD3CB22B1B0E7E4407391816B254569 /* Headers */ = { 231 | isa = PBXHeadersBuildPhase; 232 | buildActionMask = 2147483647; 233 | files = ( 234 | 12430F40A2800FF3211A830E76E0BBE4 /* CBPinEntryView-umbrella.h in Headers */, 235 | ); 236 | runOnlyForDeploymentPostprocessing = 0; 237 | }; 238 | DC46906B5C23B42AA27106254C88284C /* Headers */ = { 239 | isa = PBXHeadersBuildPhase; 240 | buildActionMask = 2147483647; 241 | files = ( 242 | 0DB4653E7B68A8BF93AE0D4F31D32FDB /* Pods-CBPinEntryView_Tests-umbrella.h in Headers */, 243 | ); 244 | runOnlyForDeploymentPostprocessing = 0; 245 | }; 246 | F091FC861E96368DC34647A4FC7DC8CF /* Headers */ = { 247 | isa = PBXHeadersBuildPhase; 248 | buildActionMask = 2147483647; 249 | files = ( 250 | 564A30CB136DE68E800DB3C83DFC2273 /* Pods-CBPinEntryView_Example-umbrella.h in Headers */, 251 | ); 252 | runOnlyForDeploymentPostprocessing = 0; 253 | }; 254 | /* End PBXHeadersBuildPhase section */ 255 | 256 | /* Begin PBXNativeTarget section */ 257 | F58C2495F9F0911C200C76F60D517262 /* Pods-CBPinEntryView_Tests */ = { 258 | isa = PBXNativeTarget; 259 | buildConfigurationList = 87DDD31DEF5B41FE8E75704F98FB6476 /* Build configuration list for PBXNativeTarget "Pods-CBPinEntryView_Tests" */; 260 | buildPhases = ( 261 | DC46906B5C23B42AA27106254C88284C /* Headers */, 262 | D8696C85425D51AEADD03EB9FBA4F75F /* Sources */, 263 | 3C4FC05E23C0548C986A13FD1208973E /* Frameworks */, 264 | 306F6331086F52A0AEF99F4930D5CE65 /* Resources */, 265 | ); 266 | buildRules = ( 267 | ); 268 | dependencies = ( 269 | 4E1AEA4BA7F3552025699700B48A9AB4 /* PBXTargetDependency */, 270 | ); 271 | name = "Pods-CBPinEntryView_Tests"; 272 | productName = "Pods-CBPinEntryView_Tests"; 273 | productReference = A6B4D9110689FFF0A9310AFB134AEEEC /* Pods_CBPinEntryView_Tests.framework */; 274 | productType = "com.apple.product-type.framework"; 275 | }; 276 | F5CE12202ED0E0599B08F13F2241CFAB /* Pods-CBPinEntryView_Example */ = { 277 | isa = PBXNativeTarget; 278 | buildConfigurationList = FC6CF387173DA07041FBF8DBDFB67634 /* Build configuration list for PBXNativeTarget "Pods-CBPinEntryView_Example" */; 279 | buildPhases = ( 280 | F091FC861E96368DC34647A4FC7DC8CF /* Headers */, 281 | 86F0B977403731C06D71102377CC4CE6 /* Sources */, 282 | 6B48A2A864C7479E9285FBDE684ED217 /* Frameworks */, 283 | A87CE276552E24107CEF255C9352387D /* Resources */, 284 | ); 285 | buildRules = ( 286 | ); 287 | dependencies = ( 288 | 76BECA36440451A7E934ECE0051B7889 /* PBXTargetDependency */, 289 | ); 290 | name = "Pods-CBPinEntryView_Example"; 291 | productName = "Pods-CBPinEntryView_Example"; 292 | productReference = 7FAC36C36A53AB288914EFE3F24FF978 /* Pods_CBPinEntryView_Example.framework */; 293 | productType = "com.apple.product-type.framework"; 294 | }; 295 | FEE25341D09653377E7438F27F96DA46 /* CBPinEntryView */ = { 296 | isa = PBXNativeTarget; 297 | buildConfigurationList = 94E97A950E83BF6A96EC3B6AC1B9DC29 /* Build configuration list for PBXNativeTarget "CBPinEntryView" */; 298 | buildPhases = ( 299 | 1AD3CB22B1B0E7E4407391816B254569 /* Headers */, 300 | A214D4EB9BE67AFEE7A2129BC814794C /* Sources */, 301 | FD4E000FC7C8347C6CBEE0A8E70137A1 /* Frameworks */, 302 | F0C266D70543072D61A9D572DA76F787 /* Resources */, 303 | ); 304 | buildRules = ( 305 | ); 306 | dependencies = ( 307 | ); 308 | name = CBPinEntryView; 309 | productName = CBPinEntryView; 310 | productReference = A45726B15C4E5403605C7C3F19115734 /* CBPinEntryView.framework */; 311 | productType = "com.apple.product-type.framework"; 312 | }; 313 | /* End PBXNativeTarget section */ 314 | 315 | /* Begin PBXProject section */ 316 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 317 | isa = PBXProject; 318 | attributes = { 319 | LastSwiftUpdateCheck = 0930; 320 | LastUpgradeCheck = 1020; 321 | TargetAttributes = { 322 | FEE25341D09653377E7438F27F96DA46 = { 323 | LastSwiftMigration = 1020; 324 | }; 325 | }; 326 | }; 327 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 328 | compatibilityVersion = "Xcode 3.2"; 329 | developmentRegion = English; 330 | hasScannedForEncodings = 0; 331 | knownRegions = ( 332 | English, 333 | en, 334 | ); 335 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 336 | productRefGroup = 74EB7F91A07CD9B63B107565C71F9846 /* Products */; 337 | projectDirPath = ""; 338 | projectRoot = ""; 339 | targets = ( 340 | FEE25341D09653377E7438F27F96DA46 /* CBPinEntryView */, 341 | F5CE12202ED0E0599B08F13F2241CFAB /* Pods-CBPinEntryView_Example */, 342 | F58C2495F9F0911C200C76F60D517262 /* Pods-CBPinEntryView_Tests */, 343 | ); 344 | }; 345 | /* End PBXProject section */ 346 | 347 | /* Begin PBXResourcesBuildPhase section */ 348 | 306F6331086F52A0AEF99F4930D5CE65 /* Resources */ = { 349 | isa = PBXResourcesBuildPhase; 350 | buildActionMask = 2147483647; 351 | files = ( 352 | ); 353 | runOnlyForDeploymentPostprocessing = 0; 354 | }; 355 | A87CE276552E24107CEF255C9352387D /* Resources */ = { 356 | isa = PBXResourcesBuildPhase; 357 | buildActionMask = 2147483647; 358 | files = ( 359 | ); 360 | runOnlyForDeploymentPostprocessing = 0; 361 | }; 362 | F0C266D70543072D61A9D572DA76F787 /* Resources */ = { 363 | isa = PBXResourcesBuildPhase; 364 | buildActionMask = 2147483647; 365 | files = ( 366 | ); 367 | runOnlyForDeploymentPostprocessing = 0; 368 | }; 369 | /* End PBXResourcesBuildPhase section */ 370 | 371 | /* Begin PBXSourcesBuildPhase section */ 372 | 86F0B977403731C06D71102377CC4CE6 /* Sources */ = { 373 | isa = PBXSourcesBuildPhase; 374 | buildActionMask = 2147483647; 375 | files = ( 376 | 646441EE5BDC6685DDBE99C0989E3B08 /* Pods-CBPinEntryView_Example-dummy.m in Sources */, 377 | ); 378 | runOnlyForDeploymentPostprocessing = 0; 379 | }; 380 | A214D4EB9BE67AFEE7A2129BC814794C /* Sources */ = { 381 | isa = PBXSourcesBuildPhase; 382 | buildActionMask = 2147483647; 383 | files = ( 384 | 9F47AC08F8551C6CCFE6ABCEF1155673 /* CBPinEntryView-dummy.m in Sources */, 385 | A63F6BF4E7DECB674F988989A0439AD4 /* CBPinEntryView.swift in Sources */, 386 | 2AB800127D791E84467E1A8C3B45EB8F /* CBPinEntryViewDefaults.swift in Sources */, 387 | ); 388 | runOnlyForDeploymentPostprocessing = 0; 389 | }; 390 | D8696C85425D51AEADD03EB9FBA4F75F /* Sources */ = { 391 | isa = PBXSourcesBuildPhase; 392 | buildActionMask = 2147483647; 393 | files = ( 394 | 00A3A51F6A8F885AE78196F52DD11801 /* Pods-CBPinEntryView_Tests-dummy.m in Sources */, 395 | ); 396 | runOnlyForDeploymentPostprocessing = 0; 397 | }; 398 | /* End PBXSourcesBuildPhase section */ 399 | 400 | /* Begin PBXTargetDependency section */ 401 | 4E1AEA4BA7F3552025699700B48A9AB4 /* PBXTargetDependency */ = { 402 | isa = PBXTargetDependency; 403 | name = "Pods-CBPinEntryView_Example"; 404 | target = F5CE12202ED0E0599B08F13F2241CFAB /* Pods-CBPinEntryView_Example */; 405 | targetProxy = 5A9F3A2D54B551A70A4CA49F36F2F021 /* PBXContainerItemProxy */; 406 | }; 407 | 76BECA36440451A7E934ECE0051B7889 /* PBXTargetDependency */ = { 408 | isa = PBXTargetDependency; 409 | name = CBPinEntryView; 410 | target = FEE25341D09653377E7438F27F96DA46 /* CBPinEntryView */; 411 | targetProxy = D209A3C77DE788B54DEA3EFFDD32F7A9 /* PBXContainerItemProxy */; 412 | }; 413 | /* End PBXTargetDependency section */ 414 | 415 | /* Begin XCBuildConfiguration section */ 416 | 08B0394D5F17A9F046DC0719C25BA452 /* Debug */ = { 417 | isa = XCBuildConfiguration; 418 | buildSettings = { 419 | ALWAYS_SEARCH_USER_PATHS = NO; 420 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 421 | CLANG_ANALYZER_NONNULL = YES; 422 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 423 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 424 | CLANG_CXX_LIBRARY = "libc++"; 425 | CLANG_ENABLE_MODULES = YES; 426 | CLANG_ENABLE_OBJC_ARC = YES; 427 | CLANG_ENABLE_OBJC_WEAK = YES; 428 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 429 | CLANG_WARN_BOOL_CONVERSION = YES; 430 | CLANG_WARN_COMMA = YES; 431 | CLANG_WARN_CONSTANT_CONVERSION = YES; 432 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 433 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 434 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 435 | CLANG_WARN_EMPTY_BODY = YES; 436 | CLANG_WARN_ENUM_CONVERSION = YES; 437 | CLANG_WARN_INFINITE_RECURSION = YES; 438 | CLANG_WARN_INT_CONVERSION = YES; 439 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 440 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 441 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 442 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 443 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 444 | CLANG_WARN_STRICT_PROTOTYPES = YES; 445 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 446 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 447 | CLANG_WARN_UNREACHABLE_CODE = YES; 448 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 449 | COPY_PHASE_STRIP = NO; 450 | DEBUG_INFORMATION_FORMAT = dwarf; 451 | ENABLE_STRICT_OBJC_MSGSEND = YES; 452 | ENABLE_TESTABILITY = YES; 453 | GCC_C_LANGUAGE_STANDARD = gnu11; 454 | GCC_DYNAMIC_NO_PIC = NO; 455 | GCC_NO_COMMON_BLOCKS = YES; 456 | GCC_OPTIMIZATION_LEVEL = 0; 457 | GCC_PREPROCESSOR_DEFINITIONS = ( 458 | "POD_CONFIGURATION_DEBUG=1", 459 | "DEBUG=1", 460 | "$(inherited)", 461 | ); 462 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 463 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 464 | GCC_WARN_UNDECLARED_SELECTOR = YES; 465 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 466 | GCC_WARN_UNUSED_FUNCTION = YES; 467 | GCC_WARN_UNUSED_VARIABLE = YES; 468 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 469 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 470 | MTL_FAST_MATH = YES; 471 | ONLY_ACTIVE_ARCH = YES; 472 | PRODUCT_NAME = "$(TARGET_NAME)"; 473 | STRIP_INSTALLED_PRODUCT = NO; 474 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 475 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 476 | SWIFT_VERSION = 4.2; 477 | SYMROOT = "${SRCROOT}/../build"; 478 | }; 479 | name = Debug; 480 | }; 481 | 14FA112DC273E43B9FB9745BD4BE661F /* Release */ = { 482 | isa = XCBuildConfiguration; 483 | baseConfigurationReference = E30F9781E3C0F88BCB37BE03545221DC /* Pods-CBPinEntryView_Tests.release.xcconfig */; 484 | buildSettings = { 485 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 486 | CODE_SIGN_IDENTITY = ""; 487 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 488 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 489 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 490 | CURRENT_PROJECT_VERSION = 1; 491 | DEFINES_MODULE = YES; 492 | DYLIB_COMPATIBILITY_VERSION = 1; 493 | DYLIB_CURRENT_VERSION = 1; 494 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 495 | INFOPLIST_FILE = "Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests-Info.plist"; 496 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 497 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 498 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 499 | MACH_O_TYPE = staticlib; 500 | MODULEMAP_FILE = "Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests.modulemap"; 501 | OTHER_LDFLAGS = ""; 502 | OTHER_LIBTOOLFLAGS = ""; 503 | PODS_ROOT = "$(SRCROOT)"; 504 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 505 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 506 | SDKROOT = iphoneos; 507 | SKIP_INSTALL = YES; 508 | TARGETED_DEVICE_FAMILY = "1,2"; 509 | VALIDATE_PRODUCT = YES; 510 | VERSIONING_SYSTEM = "apple-generic"; 511 | VERSION_INFO_PREFIX = ""; 512 | }; 513 | name = Release; 514 | }; 515 | 67516C56AD2CAB5284884465E8EA58E2 /* Debug */ = { 516 | isa = XCBuildConfiguration; 517 | baseConfigurationReference = 39A025B3A6AEA4DD1B5AAFDA7B32676C /* CBPinEntryView.xcconfig */; 518 | buildSettings = { 519 | CODE_SIGN_IDENTITY = ""; 520 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 521 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 522 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 523 | CURRENT_PROJECT_VERSION = 1; 524 | DEFINES_MODULE = YES; 525 | DYLIB_COMPATIBILITY_VERSION = 1; 526 | DYLIB_CURRENT_VERSION = 1; 527 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 528 | GCC_PREFIX_HEADER = "Target Support Files/CBPinEntryView/CBPinEntryView-prefix.pch"; 529 | INFOPLIST_FILE = "Target Support Files/CBPinEntryView/CBPinEntryView-Info.plist"; 530 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 531 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 532 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 533 | MODULEMAP_FILE = "Target Support Files/CBPinEntryView/CBPinEntryView.modulemap"; 534 | PRODUCT_MODULE_NAME = CBPinEntryView; 535 | PRODUCT_NAME = CBPinEntryView; 536 | SDKROOT = iphoneos; 537 | SKIP_INSTALL = YES; 538 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 539 | SWIFT_VERSION = 5.0; 540 | TARGETED_DEVICE_FAMILY = "1,2"; 541 | VERSIONING_SYSTEM = "apple-generic"; 542 | VERSION_INFO_PREFIX = ""; 543 | }; 544 | name = Debug; 545 | }; 546 | AEE0F92A24BADE5DCB86FC9CB13035E8 /* Release */ = { 547 | isa = XCBuildConfiguration; 548 | baseConfigurationReference = 39A025B3A6AEA4DD1B5AAFDA7B32676C /* CBPinEntryView.xcconfig */; 549 | buildSettings = { 550 | CODE_SIGN_IDENTITY = ""; 551 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 552 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 553 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 554 | CURRENT_PROJECT_VERSION = 1; 555 | DEFINES_MODULE = YES; 556 | DYLIB_COMPATIBILITY_VERSION = 1; 557 | DYLIB_CURRENT_VERSION = 1; 558 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 559 | GCC_PREFIX_HEADER = "Target Support Files/CBPinEntryView/CBPinEntryView-prefix.pch"; 560 | INFOPLIST_FILE = "Target Support Files/CBPinEntryView/CBPinEntryView-Info.plist"; 561 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 562 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 563 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 564 | MODULEMAP_FILE = "Target Support Files/CBPinEntryView/CBPinEntryView.modulemap"; 565 | PRODUCT_MODULE_NAME = CBPinEntryView; 566 | PRODUCT_NAME = CBPinEntryView; 567 | SDKROOT = iphoneos; 568 | SKIP_INSTALL = YES; 569 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 570 | SWIFT_VERSION = 5.0; 571 | TARGETED_DEVICE_FAMILY = "1,2"; 572 | VALIDATE_PRODUCT = YES; 573 | VERSIONING_SYSTEM = "apple-generic"; 574 | VERSION_INFO_PREFIX = ""; 575 | }; 576 | name = Release; 577 | }; 578 | AFA6380BE438AD90371CC5E9AED7F1EC /* Release */ = { 579 | isa = XCBuildConfiguration; 580 | baseConfigurationReference = 642452B047DACB5525E82CE62AEBB3CC /* Pods-CBPinEntryView_Example.release.xcconfig */; 581 | buildSettings = { 582 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 583 | CODE_SIGN_IDENTITY = ""; 584 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 585 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 586 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 587 | CURRENT_PROJECT_VERSION = 1; 588 | DEFINES_MODULE = YES; 589 | DYLIB_COMPATIBILITY_VERSION = 1; 590 | DYLIB_CURRENT_VERSION = 1; 591 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 592 | INFOPLIST_FILE = "Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example-Info.plist"; 593 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 594 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 595 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 596 | MACH_O_TYPE = staticlib; 597 | MODULEMAP_FILE = "Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example.modulemap"; 598 | OTHER_LDFLAGS = ""; 599 | OTHER_LIBTOOLFLAGS = ""; 600 | PODS_ROOT = "$(SRCROOT)"; 601 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 602 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 603 | SDKROOT = iphoneos; 604 | SKIP_INSTALL = YES; 605 | TARGETED_DEVICE_FAMILY = "1,2"; 606 | VALIDATE_PRODUCT = YES; 607 | VERSIONING_SYSTEM = "apple-generic"; 608 | VERSION_INFO_PREFIX = ""; 609 | }; 610 | name = Release; 611 | }; 612 | D219A0B2AD4B8FE5370C3725A757527F /* Debug */ = { 613 | isa = XCBuildConfiguration; 614 | baseConfigurationReference = A410BD7EF8386147DD2CF7127CF872B7 /* Pods-CBPinEntryView_Example.debug.xcconfig */; 615 | buildSettings = { 616 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 617 | CODE_SIGN_IDENTITY = ""; 618 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 619 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 620 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 621 | CURRENT_PROJECT_VERSION = 1; 622 | DEFINES_MODULE = YES; 623 | DYLIB_COMPATIBILITY_VERSION = 1; 624 | DYLIB_CURRENT_VERSION = 1; 625 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 626 | INFOPLIST_FILE = "Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example-Info.plist"; 627 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 628 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 629 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 630 | MACH_O_TYPE = staticlib; 631 | MODULEMAP_FILE = "Target Support Files/Pods-CBPinEntryView_Example/Pods-CBPinEntryView_Example.modulemap"; 632 | OTHER_LDFLAGS = ""; 633 | OTHER_LIBTOOLFLAGS = ""; 634 | PODS_ROOT = "$(SRCROOT)"; 635 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 636 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 637 | SDKROOT = iphoneos; 638 | SKIP_INSTALL = YES; 639 | TARGETED_DEVICE_FAMILY = "1,2"; 640 | VERSIONING_SYSTEM = "apple-generic"; 641 | VERSION_INFO_PREFIX = ""; 642 | }; 643 | name = Debug; 644 | }; 645 | E82C56363775B4EF468FF2AD9A2F5414 /* Release */ = { 646 | isa = XCBuildConfiguration; 647 | buildSettings = { 648 | ALWAYS_SEARCH_USER_PATHS = NO; 649 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 650 | CLANG_ANALYZER_NONNULL = YES; 651 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 652 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 653 | CLANG_CXX_LIBRARY = "libc++"; 654 | CLANG_ENABLE_MODULES = YES; 655 | CLANG_ENABLE_OBJC_ARC = YES; 656 | CLANG_ENABLE_OBJC_WEAK = YES; 657 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 658 | CLANG_WARN_BOOL_CONVERSION = YES; 659 | CLANG_WARN_COMMA = YES; 660 | CLANG_WARN_CONSTANT_CONVERSION = YES; 661 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 662 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 663 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 664 | CLANG_WARN_EMPTY_BODY = YES; 665 | CLANG_WARN_ENUM_CONVERSION = YES; 666 | CLANG_WARN_INFINITE_RECURSION = YES; 667 | CLANG_WARN_INT_CONVERSION = YES; 668 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 669 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 670 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 671 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 672 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 673 | CLANG_WARN_STRICT_PROTOTYPES = YES; 674 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 675 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 676 | CLANG_WARN_UNREACHABLE_CODE = YES; 677 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 678 | COPY_PHASE_STRIP = NO; 679 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 680 | ENABLE_NS_ASSERTIONS = NO; 681 | ENABLE_STRICT_OBJC_MSGSEND = YES; 682 | GCC_C_LANGUAGE_STANDARD = gnu11; 683 | GCC_NO_COMMON_BLOCKS = YES; 684 | GCC_PREPROCESSOR_DEFINITIONS = ( 685 | "POD_CONFIGURATION_RELEASE=1", 686 | "$(inherited)", 687 | ); 688 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 689 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 690 | GCC_WARN_UNDECLARED_SELECTOR = YES; 691 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 692 | GCC_WARN_UNUSED_FUNCTION = YES; 693 | GCC_WARN_UNUSED_VARIABLE = YES; 694 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 695 | MTL_ENABLE_DEBUG_INFO = NO; 696 | MTL_FAST_MATH = YES; 697 | PRODUCT_NAME = "$(TARGET_NAME)"; 698 | STRIP_INSTALLED_PRODUCT = NO; 699 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 700 | SWIFT_VERSION = 4.2; 701 | SYMROOT = "${SRCROOT}/../build"; 702 | }; 703 | name = Release; 704 | }; 705 | FDD33ABC7A0B9ECE14AED380A546571A /* Debug */ = { 706 | isa = XCBuildConfiguration; 707 | baseConfigurationReference = 3272BB5AEDCCACA306A7D66FC92112CC /* Pods-CBPinEntryView_Tests.debug.xcconfig */; 708 | buildSettings = { 709 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 710 | CODE_SIGN_IDENTITY = ""; 711 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 712 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 713 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 714 | CURRENT_PROJECT_VERSION = 1; 715 | DEFINES_MODULE = YES; 716 | DYLIB_COMPATIBILITY_VERSION = 1; 717 | DYLIB_CURRENT_VERSION = 1; 718 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 719 | INFOPLIST_FILE = "Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests-Info.plist"; 720 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 721 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 722 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 723 | MACH_O_TYPE = staticlib; 724 | MODULEMAP_FILE = "Target Support Files/Pods-CBPinEntryView_Tests/Pods-CBPinEntryView_Tests.modulemap"; 725 | OTHER_LDFLAGS = ""; 726 | OTHER_LIBTOOLFLAGS = ""; 727 | PODS_ROOT = "$(SRCROOT)"; 728 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 729 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 730 | SDKROOT = iphoneos; 731 | SKIP_INSTALL = YES; 732 | TARGETED_DEVICE_FAMILY = "1,2"; 733 | VERSIONING_SYSTEM = "apple-generic"; 734 | VERSION_INFO_PREFIX = ""; 735 | }; 736 | name = Debug; 737 | }; 738 | /* End XCBuildConfiguration section */ 739 | 740 | /* Begin XCConfigurationList section */ 741 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 742 | isa = XCConfigurationList; 743 | buildConfigurations = ( 744 | 08B0394D5F17A9F046DC0719C25BA452 /* Debug */, 745 | E82C56363775B4EF468FF2AD9A2F5414 /* Release */, 746 | ); 747 | defaultConfigurationIsVisible = 0; 748 | defaultConfigurationName = Release; 749 | }; 750 | 87DDD31DEF5B41FE8E75704F98FB6476 /* Build configuration list for PBXNativeTarget "Pods-CBPinEntryView_Tests" */ = { 751 | isa = XCConfigurationList; 752 | buildConfigurations = ( 753 | FDD33ABC7A0B9ECE14AED380A546571A /* Debug */, 754 | 14FA112DC273E43B9FB9745BD4BE661F /* Release */, 755 | ); 756 | defaultConfigurationIsVisible = 0; 757 | defaultConfigurationName = Release; 758 | }; 759 | 94E97A950E83BF6A96EC3B6AC1B9DC29 /* Build configuration list for PBXNativeTarget "CBPinEntryView" */ = { 760 | isa = XCConfigurationList; 761 | buildConfigurations = ( 762 | 67516C56AD2CAB5284884465E8EA58E2 /* Debug */, 763 | AEE0F92A24BADE5DCB86FC9CB13035E8 /* Release */, 764 | ); 765 | defaultConfigurationIsVisible = 0; 766 | defaultConfigurationName = Release; 767 | }; 768 | FC6CF387173DA07041FBF8DBDFB67634 /* Build configuration list for PBXNativeTarget "Pods-CBPinEntryView_Example" */ = { 769 | isa = XCConfigurationList; 770 | buildConfigurations = ( 771 | D219A0B2AD4B8FE5370C3725A757527F /* Debug */, 772 | AFA6380BE438AD90371CC5E9AED7F1EC /* Release */, 773 | ); 774 | defaultConfigurationIsVisible = 0; 775 | defaultConfigurationName = Release; 776 | }; 777 | /* End XCConfigurationList section */ 778 | }; 779 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 780 | } 781 | --------------------------------------------------------------------------------