├── .gitignore ├── .travis.yml ├── Example ├── Podfile ├── Podfile.lock ├── Pods │ ├── Local Podspecs │ │ └── TTGPuzzleVerify.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ └── Target Support Files │ │ ├── Pods-TTGPuzzleVerify_Example │ │ ├── Info.plist │ │ ├── Pods-TTGPuzzleVerify_Example-acknowledgements.markdown │ │ ├── Pods-TTGPuzzleVerify_Example-acknowledgements.plist │ │ ├── Pods-TTGPuzzleVerify_Example-dummy.m │ │ ├── Pods-TTGPuzzleVerify_Example-frameworks.sh │ │ ├── Pods-TTGPuzzleVerify_Example-resources.sh │ │ ├── Pods-TTGPuzzleVerify_Example-umbrella.h │ │ ├── Pods-TTGPuzzleVerify_Example.debug.xcconfig │ │ ├── Pods-TTGPuzzleVerify_Example.modulemap │ │ └── Pods-TTGPuzzleVerify_Example.release.xcconfig │ │ ├── Pods-TTGPuzzleVerify_Tests │ │ ├── Info.plist │ │ ├── Pods-TTGPuzzleVerify_Tests-acknowledgements.markdown │ │ ├── Pods-TTGPuzzleVerify_Tests-acknowledgements.plist │ │ ├── Pods-TTGPuzzleVerify_Tests-dummy.m │ │ ├── Pods-TTGPuzzleVerify_Tests-frameworks.sh │ │ ├── Pods-TTGPuzzleVerify_Tests-resources.sh │ │ ├── Pods-TTGPuzzleVerify_Tests-umbrella.h │ │ ├── Pods-TTGPuzzleVerify_Tests.debug.xcconfig │ │ ├── Pods-TTGPuzzleVerify_Tests.modulemap │ │ └── Pods-TTGPuzzleVerify_Tests.release.xcconfig │ │ └── TTGPuzzleVerify │ │ ├── Info.plist │ │ ├── TTGPuzzleVerify-dummy.m │ │ ├── TTGPuzzleVerify-prefix.pch │ │ ├── TTGPuzzleVerify-umbrella.h │ │ ├── TTGPuzzleVerify.modulemap │ │ └── TTGPuzzleVerify.xcconfig ├── TTGPuzzleVerify.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── TTGPuzzleVerify-Example.xcscheme ├── TTGPuzzleVerify.xcworkspace │ └── contents.xcworkspacedata ├── TTGPuzzleVerify │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-60@2x.png │ │ │ ├── Icon-60@3x.png │ │ │ ├── Icon-Small-40@2x.png │ │ │ └── Icon-Small-40@3x.png │ │ ├── Contents.json │ │ ├── pic1.imageset │ │ │ ├── Contents.json │ │ │ └── pic1.jpg │ │ └── pic3.imageset │ │ │ ├── Contents.json │ │ │ └── pic3.jpg │ ├── Launch Screen.storyboard │ ├── Main.storyboard │ ├── TTGAppDelegate.h │ ├── TTGAppDelegate.m │ ├── TTGCirclePatternVC.h │ ├── TTGCirclePatternVC.m │ ├── TTGCustomPatternVC.h │ ├── TTGCustomPatternVC.m │ ├── TTGCustomShadowVC.h │ ├── TTGCustomShadowVC.m │ ├── TTGDragToVerifyVC.h │ ├── TTGDragToVerifyVC.m │ ├── TTGPuzzleVerify-Info.plist │ ├── TTGPuzzleVerify-Prefix.pch │ ├── TTGSlideAndVerifyManuallyVC.h │ ├── TTGSlideAndVerifyManuallyVC.m │ ├── TTGSlideHorizontallyVC.h │ ├── TTGSlideHorizontallyVC.m │ ├── TTGSlideVerticalVC.h │ ├── TTGSlideVerticalVC.m │ ├── TTGSquarePatternVC.h │ ├── TTGSquarePatternVC.m │ ├── en.lproj │ │ └── InfoPlist.strings │ └── main.m └── Tests │ ├── Tests-Info.plist │ ├── Tests-Prefix.pch │ ├── Tests.m │ └── en.lproj │ └── InfoPlist.strings ├── LICENSE ├── README.md ├── Resources ├── TTGPuzzleVerify.gif └── TTGPuzzleVerify.jpeg ├── TTGPuzzleVerify.podspec ├── TTGPuzzleVerify ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ ├── TTGPuzzleVerifyView+PatternPathProvider.h │ ├── TTGPuzzleVerifyView+PatternPathProvider.m │ ├── TTGPuzzleVerifyView.h │ └── TTGPuzzleVerifyView.m └── _Pods.xcodeproj /.gitignore: -------------------------------------------------------------------------------- 1 | # Mac OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | 6 | ## Build generated 7 | build/ 8 | DerivedData 9 | 10 | ## Various settings 11 | *.pbxuser 12 | !default.pbxuser 13 | *.mode1v3 14 | !default.mode1v3 15 | *.mode2v3 16 | !default.mode2v3 17 | *.perspectivev3 18 | !default.perspectivev3 19 | xcuserdata 20 | 21 | ## Other 22 | *.xccheckout 23 | *.moved-aside 24 | *.xcuserstate 25 | *.xcscmblueprint 26 | 27 | ## Obj-C/Swift specific 28 | *.hmap 29 | *.ipa 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | .build/ 37 | 38 | # Carthage 39 | Carthage/Build 40 | 41 | # AppCode 42 | .idea/ -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | osx_image: xcode8 2 | language: objective-c 3 | cache: cocoapods 4 | podfile: Example/Podfile 5 | before_install: 6 | - gem install cocoapods # Since Travis is not always on latest version 7 | - pod install --project-directory=Example 8 | script: 9 | - set -o pipefail && xcodebuild clean build -workspace Example/TTGPuzzleVerify.xcworkspace -scheme TTGPuzzleVerify-Example -sdk iphonesimulator10.0 -destination 'platform=iOS Simulator,name=iPhone 6,OS=10.0' ONLY_ACTIVE_ARCH=NO CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO | xcpretty 10 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'TTGPuzzleVerify_Example' do 4 | pod 'TTGPuzzleVerify', :path => '../' 5 | 6 | target 'TTGPuzzleVerify_Tests' do 7 | inherit! :search_paths 8 | 9 | 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - TTGPuzzleVerify (1.0.0) 3 | 4 | DEPENDENCIES: 5 | - TTGPuzzleVerify (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | TTGPuzzleVerify: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | TTGPuzzleVerify: e5158af0ae3690218dcc987a4959d4f88c617510 13 | 14 | PODFILE CHECKSUM: 7e4ceb58f6f45816cc30fb29f7869ef87e8276f0 15 | 16 | COCOAPODS: 1.2.0.beta.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/TTGPuzzleVerify.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "TTGPuzzleVerify", 3 | "version": "1.0.0", 4 | "summary": "By completing image puzzle game, TTGPuzzleVerify is a more user-friendly verification tool on iOS, which is highly customizable and easy to use.", 5 | "description": "By completing image puzzle game, TTGPuzzleVerify is a more user-friendly verification tool on iOS, which is highly customizable and easy to use. It supports square, circle, classic or custom puzzle shape. User can complete the verification by sliding horizontally, vertically or directly dragging the puzzle block.", 6 | "homepage": "https://github.com/zekunyan/TTGPuzzleVerify", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "zekunyan": "zekunyan@163.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com/zekunyan/TTGPuzzleVerify.git", 16 | "tag": "1.0.0" 17 | }, 18 | "social_media_url": "http://tutuge.me", 19 | "platforms": { 20 | "ios": "7.0" 21 | }, 22 | "source_files": "TTGPuzzleVerify/Classes/**/*", 23 | "public_header_files": "TTGPuzzleVerify/Classes/**/*.h" 24 | } 25 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - TTGPuzzleVerify (1.0.0) 3 | 4 | DEPENDENCIES: 5 | - TTGPuzzleVerify (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | TTGPuzzleVerify: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | TTGPuzzleVerify: e5158af0ae3690218dcc987a4959d4f88c617510 13 | 14 | PODFILE CHECKSUM: 7e4ceb58f6f45816cc30fb29f7869ef87e8276f0 15 | 16 | COCOAPODS: 1.2.0.beta.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0A1C110BE1CF82C6B731F094BE4D4401 /* TTGPuzzleVerifyView+PatternPathProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 25C3B94878552781CE18990374BEBF29 /* TTGPuzzleVerifyView+PatternPathProvider.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 0C364BC4883A62D5E4B35AE67C6BCFED /* Pods-TTGPuzzleVerify_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D5B7A34BB5E293D2AAF8C2F8EFA05A5B /* Pods-TTGPuzzleVerify_Tests-dummy.m */; }; 12 | 33418696465C770EFE37FE0B9EC83804 /* TTGPuzzleVerifyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C58F49893C5FC991C3D1F3F8F61467E /* TTGPuzzleVerifyView.m */; }; 13 | 4932949234D002FB325B42D05E68C257 /* TTGPuzzleVerifyView.h in Headers */ = {isa = PBXBuildFile; fileRef = 07D68816B512D6E67780D45865310E5A /* TTGPuzzleVerifyView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14 | 5608E81D497B371B20A9A1EE6D613633 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CBB3DE36805AF21409EC968A9691732F /* Foundation.framework */; }; 15 | 617DA552575EA21CB1DBAE8E07BF2F38 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CBB3DE36805AF21409EC968A9691732F /* Foundation.framework */; }; 16 | 799E099879C01EB60378EE4A0E4D9F0B /* TTGPuzzleVerify-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CB17AB6FC8346248E1B73D1FC286780D /* TTGPuzzleVerify-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | A985A01412DCD74420E4487147BCF2B2 /* Pods-TTGPuzzleVerify_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CF70B18932DDEDA8EF7BDB2A41DA9E84 /* Pods-TTGPuzzleVerify_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18 | B5C53D738570C69563EFBB249ECB9432 /* Pods-TTGPuzzleVerify_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F94115E43CEDD401133667D0056F303E /* Pods-TTGPuzzleVerify_Example-dummy.m */; }; 19 | C211EA57D7BBAA4F6979B4C03901DAE8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CBB3DE36805AF21409EC968A9691732F /* Foundation.framework */; }; 20 | C44A85840446F3EE7BECA80FA0804645 /* TTGPuzzleVerifyView+PatternPathProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 82DE75CF93B63FA5DA3C19B9FBAFEBFE /* TTGPuzzleVerifyView+PatternPathProvider.m */; }; 21 | C70A4795E7DA558E0D2372741932BF58 /* Pods-TTGPuzzleVerify_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F11A6353E00E81FC958CB04978D084B /* Pods-TTGPuzzleVerify_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 22 | EF319A9BC57CDE8F3C3EB9C9B604DB82 /* TTGPuzzleVerify-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E2BCC84138EF0A5AA1E306339344871F /* TTGPuzzleVerify-dummy.m */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXContainerItemProxy section */ 26 | 56F8D66C71C445BB28BF61793CDBEE1B /* PBXContainerItemProxy */ = { 27 | isa = PBXContainerItemProxy; 28 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 29 | proxyType = 1; 30 | remoteGlobalIDString = 848F8D5514DF281332C2710AA7C8E3C8; 31 | remoteInfo = TTGPuzzleVerify; 32 | }; 33 | /* End PBXContainerItemProxy section */ 34 | 35 | /* Begin PBXFileReference section */ 36 | 0291E2FE1DBEF66FB5C58478922F03DD /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 37 | 052BB07D841C47FBD4364CF068058CD4 /* Pods-TTGPuzzleVerify_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TTGPuzzleVerify_Example-acknowledgements.plist"; sourceTree = ""; }; 38 | 07D68816B512D6E67780D45865310E5A /* TTGPuzzleVerifyView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = TTGPuzzleVerifyView.h; sourceTree = ""; }; 39 | 0C58F49893C5FC991C3D1F3F8F61467E /* TTGPuzzleVerifyView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = TTGPuzzleVerifyView.m; sourceTree = ""; }; 40 | 0E69FECEB0D727653D6A140F9A15B2E4 /* Pods-TTGPuzzleVerify_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TTGPuzzleVerify_Tests-acknowledgements.plist"; sourceTree = ""; }; 41 | 199E02B364DE459B6A8EB244A1BAE9E0 /* Pods-TTGPuzzleVerify_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-TTGPuzzleVerify_Example.modulemap"; sourceTree = ""; }; 42 | 20A03022124C4585877EA61B5C43F682 /* Pods-TTGPuzzleVerify_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TTGPuzzleVerify_Example-frameworks.sh"; sourceTree = ""; }; 43 | 25C3B94878552781CE18990374BEBF29 /* TTGPuzzleVerifyView+PatternPathProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TTGPuzzleVerifyView+PatternPathProvider.h"; sourceTree = ""; }; 44 | 2BE47B9101F50ED89889DD7E189267ED /* TTGPuzzleVerify.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TTGPuzzleVerify.xcconfig; sourceTree = ""; }; 45 | 433C9F8DA9B7EAF7B3F60700F09A7D2F /* Pods-TTGPuzzleVerify_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TTGPuzzleVerify_Example.debug.xcconfig"; sourceTree = ""; }; 46 | 4ABB8CCB0815EB31CD3E9ECAF1D668AE /* Pods-TTGPuzzleVerify_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TTGPuzzleVerify_Example.release.xcconfig"; sourceTree = ""; }; 47 | 4D7AC03F327DC1E84EB4070A4D237E77 /* Pods-TTGPuzzleVerify_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TTGPuzzleVerify_Tests.debug.xcconfig"; sourceTree = ""; }; 48 | 4F11A6353E00E81FC958CB04978D084B /* Pods-TTGPuzzleVerify_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TTGPuzzleVerify_Tests-umbrella.h"; sourceTree = ""; }; 49 | 54B40ACDBDFE9C0369EE9AAB70B75D98 /* Pods-TTGPuzzleVerify_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TTGPuzzleVerify_Tests-acknowledgements.markdown"; sourceTree = ""; }; 50 | 57B20D8C85A7681C315AA1EA29373FD2 /* Pods-TTGPuzzleVerify_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-TTGPuzzleVerify_Tests.modulemap"; sourceTree = ""; }; 51 | 59A672F4DAEFDB2089D66F690BDA826E /* Pods-TTGPuzzleVerify_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TTGPuzzleVerify_Example-resources.sh"; sourceTree = ""; }; 52 | 65F07E5997412C4AE0E1A988AD940E50 /* Pods-TTGPuzzleVerify_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TTGPuzzleVerify_Tests.release.xcconfig"; sourceTree = ""; }; 53 | 67ED3341374FC831482C275639ECA0A1 /* Pods-TTGPuzzleVerify_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TTGPuzzleVerify_Tests-resources.sh"; sourceTree = ""; }; 54 | 6DAA6875F868AB41E9AF2B44BB1E6CAC /* TTGPuzzleVerify.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = TTGPuzzleVerify.framework; path = TTGPuzzleVerify.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | 6FE2BA46FEBC973E588CA0EA4C55B562 /* Pods_TTGPuzzleVerify_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TTGPuzzleVerify_Example.framework; path = "Pods-TTGPuzzleVerify_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | 70DA66D5AA0A30FAFB3EE55BEB934D50 /* Pods-TTGPuzzleVerify_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TTGPuzzleVerify_Example-acknowledgements.markdown"; sourceTree = ""; }; 57 | 82DE75CF93B63FA5DA3C19B9FBAFEBFE /* TTGPuzzleVerifyView+PatternPathProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TTGPuzzleVerifyView+PatternPathProvider.m"; sourceTree = ""; }; 58 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 59 | 963843B7E12CF3A73D1642B5C1ED7A20 /* Pods-TTGPuzzleVerify_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TTGPuzzleVerify_Tests-frameworks.sh"; sourceTree = ""; }; 60 | A611B66305C94F13F5D283B04575A5D7 /* TTGPuzzleVerify.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = TTGPuzzleVerify.modulemap; sourceTree = ""; }; 61 | B591A67FF9B1D077F72E4F554726A70C /* Pods_TTGPuzzleVerify_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TTGPuzzleVerify_Tests.framework; path = "Pods-TTGPuzzleVerify_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | CB17AB6FC8346248E1B73D1FC286780D /* TTGPuzzleVerify-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TTGPuzzleVerify-umbrella.h"; sourceTree = ""; }; 63 | CBB3DE36805AF21409EC968A9691732F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 64 | CC21B33EE746A7B2E7B4F9267547F658 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 65 | CE4089D0189863BE272B57F72614488B /* TTGPuzzleVerify-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TTGPuzzleVerify-prefix.pch"; sourceTree = ""; }; 66 | CF70B18932DDEDA8EF7BDB2A41DA9E84 /* Pods-TTGPuzzleVerify_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TTGPuzzleVerify_Example-umbrella.h"; sourceTree = ""; }; 67 | D5B7A34BB5E293D2AAF8C2F8EFA05A5B /* Pods-TTGPuzzleVerify_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TTGPuzzleVerify_Tests-dummy.m"; sourceTree = ""; }; 68 | E2502875424DA0674CBC2EF6036CBBB3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 69 | E2BCC84138EF0A5AA1E306339344871F /* TTGPuzzleVerify-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TTGPuzzleVerify-dummy.m"; sourceTree = ""; }; 70 | F94115E43CEDD401133667D0056F303E /* Pods-TTGPuzzleVerify_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TTGPuzzleVerify_Example-dummy.m"; sourceTree = ""; }; 71 | /* End PBXFileReference section */ 72 | 73 | /* Begin PBXFrameworksBuildPhase section */ 74 | 814DE799BE518BA435EBE8E7856FBBB4 /* Frameworks */ = { 75 | isa = PBXFrameworksBuildPhase; 76 | buildActionMask = 2147483647; 77 | files = ( 78 | 617DA552575EA21CB1DBAE8E07BF2F38 /* Foundation.framework in Frameworks */, 79 | ); 80 | runOnlyForDeploymentPostprocessing = 0; 81 | }; 82 | 8383A6ECFE5C4CFF0536FED804AC5787 /* Frameworks */ = { 83 | isa = PBXFrameworksBuildPhase; 84 | buildActionMask = 2147483647; 85 | files = ( 86 | 5608E81D497B371B20A9A1EE6D613633 /* Foundation.framework in Frameworks */, 87 | ); 88 | runOnlyForDeploymentPostprocessing = 0; 89 | }; 90 | E9350AAC8A214FFDC72DE13CE21827CD /* Frameworks */ = { 91 | isa = PBXFrameworksBuildPhase; 92 | buildActionMask = 2147483647; 93 | files = ( 94 | C211EA57D7BBAA4F6979B4C03901DAE8 /* Foundation.framework in Frameworks */, 95 | ); 96 | runOnlyForDeploymentPostprocessing = 0; 97 | }; 98 | /* End PBXFrameworksBuildPhase section */ 99 | 100 | /* Begin PBXGroup section */ 101 | 10DFC3ADAB8487BF565BCA1CDA536D6E /* Development Pods */ = { 102 | isa = PBXGroup; 103 | children = ( 104 | 22C10946221344043B1B94CCE35D9489 /* TTGPuzzleVerify */, 105 | ); 106 | name = "Development Pods"; 107 | sourceTree = ""; 108 | }; 109 | 22C10946221344043B1B94CCE35D9489 /* TTGPuzzleVerify */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | FC78A505490DFD4B057D1BD72DF2FFA2 /* Support Files */, 113 | 65FAFE9C497DE935967D5513A11C56B2 /* TTGPuzzleVerify */, 114 | ); 115 | name = TTGPuzzleVerify; 116 | path = ../..; 117 | sourceTree = ""; 118 | }; 119 | 2AF7E9FFCCFA83EB67D73BDFA3458339 /* Classes */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | 07D68816B512D6E67780D45865310E5A /* TTGPuzzleVerifyView.h */, 123 | 0C58F49893C5FC991C3D1F3F8F61467E /* TTGPuzzleVerifyView.m */, 124 | 25C3B94878552781CE18990374BEBF29 /* TTGPuzzleVerifyView+PatternPathProvider.h */, 125 | 82DE75CF93B63FA5DA3C19B9FBAFEBFE /* TTGPuzzleVerifyView+PatternPathProvider.m */, 126 | ); 127 | name = Classes; 128 | path = Classes; 129 | sourceTree = ""; 130 | }; 131 | 65E321530C3CCFC58816D455E019F84D /* Pods-TTGPuzzleVerify_Tests */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 0291E2FE1DBEF66FB5C58478922F03DD /* Info.plist */, 135 | 57B20D8C85A7681C315AA1EA29373FD2 /* Pods-TTGPuzzleVerify_Tests.modulemap */, 136 | 54B40ACDBDFE9C0369EE9AAB70B75D98 /* Pods-TTGPuzzleVerify_Tests-acknowledgements.markdown */, 137 | 0E69FECEB0D727653D6A140F9A15B2E4 /* Pods-TTGPuzzleVerify_Tests-acknowledgements.plist */, 138 | D5B7A34BB5E293D2AAF8C2F8EFA05A5B /* Pods-TTGPuzzleVerify_Tests-dummy.m */, 139 | 963843B7E12CF3A73D1642B5C1ED7A20 /* Pods-TTGPuzzleVerify_Tests-frameworks.sh */, 140 | 67ED3341374FC831482C275639ECA0A1 /* Pods-TTGPuzzleVerify_Tests-resources.sh */, 141 | 4F11A6353E00E81FC958CB04978D084B /* Pods-TTGPuzzleVerify_Tests-umbrella.h */, 142 | 4D7AC03F327DC1E84EB4070A4D237E77 /* Pods-TTGPuzzleVerify_Tests.debug.xcconfig */, 143 | 65F07E5997412C4AE0E1A988AD940E50 /* Pods-TTGPuzzleVerify_Tests.release.xcconfig */, 144 | ); 145 | name = "Pods-TTGPuzzleVerify_Tests"; 146 | path = "Target Support Files/Pods-TTGPuzzleVerify_Tests"; 147 | sourceTree = ""; 148 | }; 149 | 65FAFE9C497DE935967D5513A11C56B2 /* TTGPuzzleVerify */ = { 150 | isa = PBXGroup; 151 | children = ( 152 | 2AF7E9FFCCFA83EB67D73BDFA3458339 /* Classes */, 153 | ); 154 | name = TTGPuzzleVerify; 155 | path = TTGPuzzleVerify; 156 | sourceTree = ""; 157 | }; 158 | 7531C8F8DE19F1AA3C8A7AC97A91DC29 /* iOS */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | CBB3DE36805AF21409EC968A9691732F /* Foundation.framework */, 162 | ); 163 | name = iOS; 164 | sourceTree = ""; 165 | }; 166 | 7DB346D0F39D3F0E887471402A8071AB = { 167 | isa = PBXGroup; 168 | children = ( 169 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 170 | 10DFC3ADAB8487BF565BCA1CDA536D6E /* Development Pods */, 171 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, 172 | DF2C4424E653B9A4D07B4277C6D3A475 /* Products */, 173 | ECEBE6D9D2CFBF5C4623BB1F089D1BC4 /* Targets Support Files */, 174 | ); 175 | sourceTree = ""; 176 | }; 177 | 8C0C96F6D384611C05CA125292B06C1A /* Pods-TTGPuzzleVerify_Example */ = { 178 | isa = PBXGroup; 179 | children = ( 180 | CC21B33EE746A7B2E7B4F9267547F658 /* Info.plist */, 181 | 199E02B364DE459B6A8EB244A1BAE9E0 /* Pods-TTGPuzzleVerify_Example.modulemap */, 182 | 70DA66D5AA0A30FAFB3EE55BEB934D50 /* Pods-TTGPuzzleVerify_Example-acknowledgements.markdown */, 183 | 052BB07D841C47FBD4364CF068058CD4 /* Pods-TTGPuzzleVerify_Example-acknowledgements.plist */, 184 | F94115E43CEDD401133667D0056F303E /* Pods-TTGPuzzleVerify_Example-dummy.m */, 185 | 20A03022124C4585877EA61B5C43F682 /* Pods-TTGPuzzleVerify_Example-frameworks.sh */, 186 | 59A672F4DAEFDB2089D66F690BDA826E /* Pods-TTGPuzzleVerify_Example-resources.sh */, 187 | CF70B18932DDEDA8EF7BDB2A41DA9E84 /* Pods-TTGPuzzleVerify_Example-umbrella.h */, 188 | 433C9F8DA9B7EAF7B3F60700F09A7D2F /* Pods-TTGPuzzleVerify_Example.debug.xcconfig */, 189 | 4ABB8CCB0815EB31CD3E9ECAF1D668AE /* Pods-TTGPuzzleVerify_Example.release.xcconfig */, 190 | ); 191 | name = "Pods-TTGPuzzleVerify_Example"; 192 | path = "Target Support Files/Pods-TTGPuzzleVerify_Example"; 193 | sourceTree = ""; 194 | }; 195 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { 196 | isa = PBXGroup; 197 | children = ( 198 | 7531C8F8DE19F1AA3C8A7AC97A91DC29 /* iOS */, 199 | ); 200 | name = Frameworks; 201 | sourceTree = ""; 202 | }; 203 | DF2C4424E653B9A4D07B4277C6D3A475 /* Products */ = { 204 | isa = PBXGroup; 205 | children = ( 206 | 6FE2BA46FEBC973E588CA0EA4C55B562 /* Pods_TTGPuzzleVerify_Example.framework */, 207 | B591A67FF9B1D077F72E4F554726A70C /* Pods_TTGPuzzleVerify_Tests.framework */, 208 | 6DAA6875F868AB41E9AF2B44BB1E6CAC /* TTGPuzzleVerify.framework */, 209 | ); 210 | name = Products; 211 | sourceTree = ""; 212 | }; 213 | ECEBE6D9D2CFBF5C4623BB1F089D1BC4 /* Targets Support Files */ = { 214 | isa = PBXGroup; 215 | children = ( 216 | 8C0C96F6D384611C05CA125292B06C1A /* Pods-TTGPuzzleVerify_Example */, 217 | 65E321530C3CCFC58816D455E019F84D /* Pods-TTGPuzzleVerify_Tests */, 218 | ); 219 | name = "Targets Support Files"; 220 | sourceTree = ""; 221 | }; 222 | FC78A505490DFD4B057D1BD72DF2FFA2 /* Support Files */ = { 223 | isa = PBXGroup; 224 | children = ( 225 | E2502875424DA0674CBC2EF6036CBBB3 /* Info.plist */, 226 | A611B66305C94F13F5D283B04575A5D7 /* TTGPuzzleVerify.modulemap */, 227 | 2BE47B9101F50ED89889DD7E189267ED /* TTGPuzzleVerify.xcconfig */, 228 | E2BCC84138EF0A5AA1E306339344871F /* TTGPuzzleVerify-dummy.m */, 229 | CE4089D0189863BE272B57F72614488B /* TTGPuzzleVerify-prefix.pch */, 230 | CB17AB6FC8346248E1B73D1FC286780D /* TTGPuzzleVerify-umbrella.h */, 231 | ); 232 | name = "Support Files"; 233 | path = "Example/Pods/Target Support Files/TTGPuzzleVerify"; 234 | sourceTree = ""; 235 | }; 236 | /* End PBXGroup section */ 237 | 238 | /* Begin PBXHeadersBuildPhase section */ 239 | 3057A62CA8321855B679C946FF27EF0A /* Headers */ = { 240 | isa = PBXHeadersBuildPhase; 241 | buildActionMask = 2147483647; 242 | files = ( 243 | A985A01412DCD74420E4487147BCF2B2 /* Pods-TTGPuzzleVerify_Example-umbrella.h in Headers */, 244 | ); 245 | runOnlyForDeploymentPostprocessing = 0; 246 | }; 247 | 4E05F15566919BDF3C565969546C670F /* Headers */ = { 248 | isa = PBXHeadersBuildPhase; 249 | buildActionMask = 2147483647; 250 | files = ( 251 | C70A4795E7DA558E0D2372741932BF58 /* Pods-TTGPuzzleVerify_Tests-umbrella.h in Headers */, 252 | ); 253 | runOnlyForDeploymentPostprocessing = 0; 254 | }; 255 | 6D278F1FA593E4FA2DE2F1DE697D5760 /* Headers */ = { 256 | isa = PBXHeadersBuildPhase; 257 | buildActionMask = 2147483647; 258 | files = ( 259 | 799E099879C01EB60378EE4A0E4D9F0B /* TTGPuzzleVerify-umbrella.h in Headers */, 260 | 0A1C110BE1CF82C6B731F094BE4D4401 /* TTGPuzzleVerifyView+PatternPathProvider.h in Headers */, 261 | 4932949234D002FB325B42D05E68C257 /* TTGPuzzleVerifyView.h in Headers */, 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | }; 265 | /* End PBXHeadersBuildPhase section */ 266 | 267 | /* Begin PBXNativeTarget section */ 268 | 29CE4E09B4C15A4AD387830313862757 /* Pods-TTGPuzzleVerify_Example */ = { 269 | isa = PBXNativeTarget; 270 | buildConfigurationList = B5CCC7216BFF2722F6730BBB3A7BB7F2 /* Build configuration list for PBXNativeTarget "Pods-TTGPuzzleVerify_Example" */; 271 | buildPhases = ( 272 | 8E1AC02FCCD2298773A75BF97CFE96A3 /* Sources */, 273 | 8383A6ECFE5C4CFF0536FED804AC5787 /* Frameworks */, 274 | 3057A62CA8321855B679C946FF27EF0A /* Headers */, 275 | ); 276 | buildRules = ( 277 | ); 278 | dependencies = ( 279 | ECDAEEEA1F031DF5BE1B7682BDAB69C8 /* PBXTargetDependency */, 280 | ); 281 | name = "Pods-TTGPuzzleVerify_Example"; 282 | productName = "Pods-TTGPuzzleVerify_Example"; 283 | productReference = 6FE2BA46FEBC973E588CA0EA4C55B562 /* Pods_TTGPuzzleVerify_Example.framework */; 284 | productType = "com.apple.product-type.framework"; 285 | }; 286 | 7B4F28BE8B53E9A0DEA2A16EE53913E1 /* Pods-TTGPuzzleVerify_Tests */ = { 287 | isa = PBXNativeTarget; 288 | buildConfigurationList = 52E16189D9BE645213A441C501ADCE8B /* Build configuration list for PBXNativeTarget "Pods-TTGPuzzleVerify_Tests" */; 289 | buildPhases = ( 290 | 45F231E0F037541F9113CC4D0BA512F1 /* Sources */, 291 | E9350AAC8A214FFDC72DE13CE21827CD /* Frameworks */, 292 | 4E05F15566919BDF3C565969546C670F /* Headers */, 293 | ); 294 | buildRules = ( 295 | ); 296 | dependencies = ( 297 | ); 298 | name = "Pods-TTGPuzzleVerify_Tests"; 299 | productName = "Pods-TTGPuzzleVerify_Tests"; 300 | productReference = B591A67FF9B1D077F72E4F554726A70C /* Pods_TTGPuzzleVerify_Tests.framework */; 301 | productType = "com.apple.product-type.framework"; 302 | }; 303 | 848F8D5514DF281332C2710AA7C8E3C8 /* TTGPuzzleVerify */ = { 304 | isa = PBXNativeTarget; 305 | buildConfigurationList = A0EEEEE8A93037142E630B7FE8C50349 /* Build configuration list for PBXNativeTarget "TTGPuzzleVerify" */; 306 | buildPhases = ( 307 | F246D67EF3263A56506850227261B08D /* Sources */, 308 | 814DE799BE518BA435EBE8E7856FBBB4 /* Frameworks */, 309 | 6D278F1FA593E4FA2DE2F1DE697D5760 /* Headers */, 310 | ); 311 | buildRules = ( 312 | ); 313 | dependencies = ( 314 | ); 315 | name = TTGPuzzleVerify; 316 | productName = TTGPuzzleVerify; 317 | productReference = 6DAA6875F868AB41E9AF2B44BB1E6CAC /* TTGPuzzleVerify.framework */; 318 | productType = "com.apple.product-type.framework"; 319 | }; 320 | /* End PBXNativeTarget section */ 321 | 322 | /* Begin PBXProject section */ 323 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 324 | isa = PBXProject; 325 | attributes = { 326 | LastSwiftUpdateCheck = 0730; 327 | LastUpgradeCheck = 0700; 328 | }; 329 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 330 | compatibilityVersion = "Xcode 3.2"; 331 | developmentRegion = English; 332 | hasScannedForEncodings = 0; 333 | knownRegions = ( 334 | en, 335 | ); 336 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 337 | productRefGroup = DF2C4424E653B9A4D07B4277C6D3A475 /* Products */; 338 | projectDirPath = ""; 339 | projectRoot = ""; 340 | targets = ( 341 | 29CE4E09B4C15A4AD387830313862757 /* Pods-TTGPuzzleVerify_Example */, 342 | 7B4F28BE8B53E9A0DEA2A16EE53913E1 /* Pods-TTGPuzzleVerify_Tests */, 343 | 848F8D5514DF281332C2710AA7C8E3C8 /* TTGPuzzleVerify */, 344 | ); 345 | }; 346 | /* End PBXProject section */ 347 | 348 | /* Begin PBXSourcesBuildPhase section */ 349 | 45F231E0F037541F9113CC4D0BA512F1 /* Sources */ = { 350 | isa = PBXSourcesBuildPhase; 351 | buildActionMask = 2147483647; 352 | files = ( 353 | 0C364BC4883A62D5E4B35AE67C6BCFED /* Pods-TTGPuzzleVerify_Tests-dummy.m in Sources */, 354 | ); 355 | runOnlyForDeploymentPostprocessing = 0; 356 | }; 357 | 8E1AC02FCCD2298773A75BF97CFE96A3 /* Sources */ = { 358 | isa = PBXSourcesBuildPhase; 359 | buildActionMask = 2147483647; 360 | files = ( 361 | B5C53D738570C69563EFBB249ECB9432 /* Pods-TTGPuzzleVerify_Example-dummy.m in Sources */, 362 | ); 363 | runOnlyForDeploymentPostprocessing = 0; 364 | }; 365 | F246D67EF3263A56506850227261B08D /* Sources */ = { 366 | isa = PBXSourcesBuildPhase; 367 | buildActionMask = 2147483647; 368 | files = ( 369 | EF319A9BC57CDE8F3C3EB9C9B604DB82 /* TTGPuzzleVerify-dummy.m in Sources */, 370 | C44A85840446F3EE7BECA80FA0804645 /* TTGPuzzleVerifyView+PatternPathProvider.m in Sources */, 371 | 33418696465C770EFE37FE0B9EC83804 /* TTGPuzzleVerifyView.m in Sources */, 372 | ); 373 | runOnlyForDeploymentPostprocessing = 0; 374 | }; 375 | /* End PBXSourcesBuildPhase section */ 376 | 377 | /* Begin PBXTargetDependency section */ 378 | ECDAEEEA1F031DF5BE1B7682BDAB69C8 /* PBXTargetDependency */ = { 379 | isa = PBXTargetDependency; 380 | name = TTGPuzzleVerify; 381 | target = 848F8D5514DF281332C2710AA7C8E3C8 /* TTGPuzzleVerify */; 382 | targetProxy = 56F8D66C71C445BB28BF61793CDBEE1B /* PBXContainerItemProxy */; 383 | }; 384 | /* End PBXTargetDependency section */ 385 | 386 | /* Begin XCBuildConfiguration section */ 387 | 015A368F878AC3E2CEAE21DDE8026304 /* Debug */ = { 388 | isa = XCBuildConfiguration; 389 | buildSettings = { 390 | ALWAYS_SEARCH_USER_PATHS = NO; 391 | CLANG_ANALYZER_NONNULL = YES; 392 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 393 | CLANG_CXX_LIBRARY = "libc++"; 394 | CLANG_ENABLE_MODULES = YES; 395 | CLANG_ENABLE_OBJC_ARC = YES; 396 | CLANG_WARN_BOOL_CONVERSION = YES; 397 | CLANG_WARN_CONSTANT_CONVERSION = YES; 398 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 399 | CLANG_WARN_EMPTY_BODY = YES; 400 | CLANG_WARN_ENUM_CONVERSION = YES; 401 | CLANG_WARN_INT_CONVERSION = YES; 402 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 403 | CLANG_WARN_UNREACHABLE_CODE = YES; 404 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 405 | CODE_SIGNING_REQUIRED = NO; 406 | COPY_PHASE_STRIP = NO; 407 | ENABLE_TESTABILITY = YES; 408 | GCC_C_LANGUAGE_STANDARD = gnu99; 409 | GCC_DYNAMIC_NO_PIC = NO; 410 | GCC_OPTIMIZATION_LEVEL = 0; 411 | GCC_PREPROCESSOR_DEFINITIONS = ( 412 | "POD_CONFIGURATION_DEBUG=1", 413 | "DEBUG=1", 414 | "$(inherited)", 415 | ); 416 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 417 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 418 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 419 | GCC_WARN_UNDECLARED_SELECTOR = YES; 420 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 421 | GCC_WARN_UNUSED_FUNCTION = YES; 422 | GCC_WARN_UNUSED_VARIABLE = YES; 423 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 424 | ONLY_ACTIVE_ARCH = YES; 425 | PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; 426 | STRIP_INSTALLED_PRODUCT = NO; 427 | SYMROOT = "${SRCROOT}/../build"; 428 | }; 429 | name = Debug; 430 | }; 431 | 033DB037A8E9A59949D26DA2087E8D76 /* Debug */ = { 432 | isa = XCBuildConfiguration; 433 | baseConfigurationReference = 4D7AC03F327DC1E84EB4070A4D237E77 /* Pods-TTGPuzzleVerify_Tests.debug.xcconfig */; 434 | buildSettings = { 435 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 436 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 437 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 438 | CURRENT_PROJECT_VERSION = 1; 439 | DEBUG_INFORMATION_FORMAT = dwarf; 440 | DEFINES_MODULE = YES; 441 | DYLIB_COMPATIBILITY_VERSION = 1; 442 | DYLIB_CURRENT_VERSION = 1; 443 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 444 | ENABLE_STRICT_OBJC_MSGSEND = YES; 445 | GCC_NO_COMMON_BLOCKS = YES; 446 | INFOPLIST_FILE = "Target Support Files/Pods-TTGPuzzleVerify_Tests/Info.plist"; 447 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 448 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 449 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 450 | MACH_O_TYPE = staticlib; 451 | MODULEMAP_FILE = "Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_Tests.modulemap"; 452 | MTL_ENABLE_DEBUG_INFO = YES; 453 | OTHER_LDFLAGS = ""; 454 | OTHER_LIBTOOLFLAGS = ""; 455 | PODS_ROOT = "$(SRCROOT)"; 456 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 457 | PRODUCT_NAME = Pods_TTGPuzzleVerify_Tests; 458 | SDKROOT = iphoneos; 459 | SKIP_INSTALL = YES; 460 | TARGETED_DEVICE_FAMILY = "1,2"; 461 | VERSIONING_SYSTEM = "apple-generic"; 462 | VERSION_INFO_PREFIX = ""; 463 | }; 464 | name = Debug; 465 | }; 466 | 4417E96AF55832C090CFC5A33DD3F8E3 /* Release */ = { 467 | isa = XCBuildConfiguration; 468 | baseConfigurationReference = 2BE47B9101F50ED89889DD7E189267ED /* TTGPuzzleVerify.xcconfig */; 469 | buildSettings = { 470 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 471 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 472 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 473 | CURRENT_PROJECT_VERSION = 1; 474 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 475 | DEFINES_MODULE = YES; 476 | DYLIB_COMPATIBILITY_VERSION = 1; 477 | DYLIB_CURRENT_VERSION = 1; 478 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 479 | ENABLE_STRICT_OBJC_MSGSEND = YES; 480 | GCC_NO_COMMON_BLOCKS = YES; 481 | GCC_PREFIX_HEADER = "Target Support Files/TTGPuzzleVerify/TTGPuzzleVerify-prefix.pch"; 482 | INFOPLIST_FILE = "Target Support Files/TTGPuzzleVerify/Info.plist"; 483 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 484 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 485 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 486 | MODULEMAP_FILE = "Target Support Files/TTGPuzzleVerify/TTGPuzzleVerify.modulemap"; 487 | MTL_ENABLE_DEBUG_INFO = NO; 488 | PRODUCT_NAME = TTGPuzzleVerify; 489 | SDKROOT = iphoneos; 490 | SKIP_INSTALL = YES; 491 | TARGETED_DEVICE_FAMILY = "1,2"; 492 | VERSIONING_SYSTEM = "apple-generic"; 493 | VERSION_INFO_PREFIX = ""; 494 | }; 495 | name = Release; 496 | }; 497 | 44CDBB6D11DE06DB64D6268622BDC47E /* Release */ = { 498 | isa = XCBuildConfiguration; 499 | buildSettings = { 500 | ALWAYS_SEARCH_USER_PATHS = NO; 501 | CLANG_ANALYZER_NONNULL = YES; 502 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 503 | CLANG_CXX_LIBRARY = "libc++"; 504 | CLANG_ENABLE_MODULES = YES; 505 | CLANG_ENABLE_OBJC_ARC = YES; 506 | CLANG_WARN_BOOL_CONVERSION = YES; 507 | CLANG_WARN_CONSTANT_CONVERSION = YES; 508 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 509 | CLANG_WARN_EMPTY_BODY = YES; 510 | CLANG_WARN_ENUM_CONVERSION = YES; 511 | CLANG_WARN_INT_CONVERSION = YES; 512 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 513 | CLANG_WARN_UNREACHABLE_CODE = YES; 514 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 515 | CODE_SIGNING_REQUIRED = NO; 516 | COPY_PHASE_STRIP = YES; 517 | ENABLE_NS_ASSERTIONS = NO; 518 | GCC_C_LANGUAGE_STANDARD = gnu99; 519 | GCC_PREPROCESSOR_DEFINITIONS = ( 520 | "POD_CONFIGURATION_RELEASE=1", 521 | "$(inherited)", 522 | ); 523 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 524 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 525 | GCC_WARN_UNDECLARED_SELECTOR = YES; 526 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 527 | GCC_WARN_UNUSED_FUNCTION = YES; 528 | GCC_WARN_UNUSED_VARIABLE = YES; 529 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 530 | PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; 531 | STRIP_INSTALLED_PRODUCT = NO; 532 | SYMROOT = "${SRCROOT}/../build"; 533 | VALIDATE_PRODUCT = YES; 534 | }; 535 | name = Release; 536 | }; 537 | 8A4BB7617CC547E0CDC9CB7178CF5BAF /* Release */ = { 538 | isa = XCBuildConfiguration; 539 | baseConfigurationReference = 4ABB8CCB0815EB31CD3E9ECAF1D668AE /* Pods-TTGPuzzleVerify_Example.release.xcconfig */; 540 | buildSettings = { 541 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 542 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 543 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 544 | CURRENT_PROJECT_VERSION = 1; 545 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 546 | DEFINES_MODULE = YES; 547 | DYLIB_COMPATIBILITY_VERSION = 1; 548 | DYLIB_CURRENT_VERSION = 1; 549 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 550 | ENABLE_STRICT_OBJC_MSGSEND = YES; 551 | GCC_NO_COMMON_BLOCKS = YES; 552 | INFOPLIST_FILE = "Target Support Files/Pods-TTGPuzzleVerify_Example/Info.plist"; 553 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 554 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 555 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 556 | MACH_O_TYPE = staticlib; 557 | MODULEMAP_FILE = "Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_Example.modulemap"; 558 | MTL_ENABLE_DEBUG_INFO = NO; 559 | OTHER_LDFLAGS = ""; 560 | OTHER_LIBTOOLFLAGS = ""; 561 | PODS_ROOT = "$(SRCROOT)"; 562 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 563 | PRODUCT_NAME = Pods_TTGPuzzleVerify_Example; 564 | SDKROOT = iphoneos; 565 | SKIP_INSTALL = YES; 566 | TARGETED_DEVICE_FAMILY = "1,2"; 567 | VERSIONING_SYSTEM = "apple-generic"; 568 | VERSION_INFO_PREFIX = ""; 569 | }; 570 | name = Release; 571 | }; 572 | AE809F5FCDBDE02FB2C3EC5D976D3A39 /* Debug */ = { 573 | isa = XCBuildConfiguration; 574 | baseConfigurationReference = 433C9F8DA9B7EAF7B3F60700F09A7D2F /* Pods-TTGPuzzleVerify_Example.debug.xcconfig */; 575 | buildSettings = { 576 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 577 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 578 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 579 | CURRENT_PROJECT_VERSION = 1; 580 | DEBUG_INFORMATION_FORMAT = dwarf; 581 | DEFINES_MODULE = YES; 582 | DYLIB_COMPATIBILITY_VERSION = 1; 583 | DYLIB_CURRENT_VERSION = 1; 584 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 585 | ENABLE_STRICT_OBJC_MSGSEND = YES; 586 | GCC_NO_COMMON_BLOCKS = YES; 587 | INFOPLIST_FILE = "Target Support Files/Pods-TTGPuzzleVerify_Example/Info.plist"; 588 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 589 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 590 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 591 | MACH_O_TYPE = staticlib; 592 | MODULEMAP_FILE = "Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_Example.modulemap"; 593 | MTL_ENABLE_DEBUG_INFO = YES; 594 | OTHER_LDFLAGS = ""; 595 | OTHER_LIBTOOLFLAGS = ""; 596 | PODS_ROOT = "$(SRCROOT)"; 597 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 598 | PRODUCT_NAME = Pods_TTGPuzzleVerify_Example; 599 | SDKROOT = iphoneos; 600 | SKIP_INSTALL = YES; 601 | TARGETED_DEVICE_FAMILY = "1,2"; 602 | VERSIONING_SYSTEM = "apple-generic"; 603 | VERSION_INFO_PREFIX = ""; 604 | }; 605 | name = Debug; 606 | }; 607 | C85C8971343FDB7A111D29FE476B80D8 /* Release */ = { 608 | isa = XCBuildConfiguration; 609 | baseConfigurationReference = 65F07E5997412C4AE0E1A988AD940E50 /* Pods-TTGPuzzleVerify_Tests.release.xcconfig */; 610 | buildSettings = { 611 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 612 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 613 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 614 | CURRENT_PROJECT_VERSION = 1; 615 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 616 | DEFINES_MODULE = YES; 617 | DYLIB_COMPATIBILITY_VERSION = 1; 618 | DYLIB_CURRENT_VERSION = 1; 619 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 620 | ENABLE_STRICT_OBJC_MSGSEND = YES; 621 | GCC_NO_COMMON_BLOCKS = YES; 622 | INFOPLIST_FILE = "Target Support Files/Pods-TTGPuzzleVerify_Tests/Info.plist"; 623 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 624 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 625 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 626 | MACH_O_TYPE = staticlib; 627 | MODULEMAP_FILE = "Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_Tests.modulemap"; 628 | MTL_ENABLE_DEBUG_INFO = NO; 629 | OTHER_LDFLAGS = ""; 630 | OTHER_LIBTOOLFLAGS = ""; 631 | PODS_ROOT = "$(SRCROOT)"; 632 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 633 | PRODUCT_NAME = Pods_TTGPuzzleVerify_Tests; 634 | SDKROOT = iphoneos; 635 | SKIP_INSTALL = YES; 636 | TARGETED_DEVICE_FAMILY = "1,2"; 637 | VERSIONING_SYSTEM = "apple-generic"; 638 | VERSION_INFO_PREFIX = ""; 639 | }; 640 | name = Release; 641 | }; 642 | F741B33BF36D894D5CDF2F90F14A62EC /* Debug */ = { 643 | isa = XCBuildConfiguration; 644 | baseConfigurationReference = 2BE47B9101F50ED89889DD7E189267ED /* TTGPuzzleVerify.xcconfig */; 645 | buildSettings = { 646 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 647 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 648 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 649 | CURRENT_PROJECT_VERSION = 1; 650 | DEBUG_INFORMATION_FORMAT = dwarf; 651 | DEFINES_MODULE = YES; 652 | DYLIB_COMPATIBILITY_VERSION = 1; 653 | DYLIB_CURRENT_VERSION = 1; 654 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 655 | ENABLE_STRICT_OBJC_MSGSEND = YES; 656 | GCC_NO_COMMON_BLOCKS = YES; 657 | GCC_PREFIX_HEADER = "Target Support Files/TTGPuzzleVerify/TTGPuzzleVerify-prefix.pch"; 658 | INFOPLIST_FILE = "Target Support Files/TTGPuzzleVerify/Info.plist"; 659 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 660 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 661 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 662 | MODULEMAP_FILE = "Target Support Files/TTGPuzzleVerify/TTGPuzzleVerify.modulemap"; 663 | MTL_ENABLE_DEBUG_INFO = YES; 664 | PRODUCT_NAME = TTGPuzzleVerify; 665 | SDKROOT = iphoneos; 666 | SKIP_INSTALL = YES; 667 | TARGETED_DEVICE_FAMILY = "1,2"; 668 | VERSIONING_SYSTEM = "apple-generic"; 669 | VERSION_INFO_PREFIX = ""; 670 | }; 671 | name = Debug; 672 | }; 673 | /* End XCBuildConfiguration section */ 674 | 675 | /* Begin XCConfigurationList section */ 676 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 677 | isa = XCConfigurationList; 678 | buildConfigurations = ( 679 | 015A368F878AC3E2CEAE21DDE8026304 /* Debug */, 680 | 44CDBB6D11DE06DB64D6268622BDC47E /* Release */, 681 | ); 682 | defaultConfigurationIsVisible = 0; 683 | defaultConfigurationName = Release; 684 | }; 685 | 52E16189D9BE645213A441C501ADCE8B /* Build configuration list for PBXNativeTarget "Pods-TTGPuzzleVerify_Tests" */ = { 686 | isa = XCConfigurationList; 687 | buildConfigurations = ( 688 | 033DB037A8E9A59949D26DA2087E8D76 /* Debug */, 689 | C85C8971343FDB7A111D29FE476B80D8 /* Release */, 690 | ); 691 | defaultConfigurationIsVisible = 0; 692 | defaultConfigurationName = Release; 693 | }; 694 | A0EEEEE8A93037142E630B7FE8C50349 /* Build configuration list for PBXNativeTarget "TTGPuzzleVerify" */ = { 695 | isa = XCConfigurationList; 696 | buildConfigurations = ( 697 | F741B33BF36D894D5CDF2F90F14A62EC /* Debug */, 698 | 4417E96AF55832C090CFC5A33DD3F8E3 /* Release */, 699 | ); 700 | defaultConfigurationIsVisible = 0; 701 | defaultConfigurationName = Release; 702 | }; 703 | B5CCC7216BFF2722F6730BBB3A7BB7F2 /* Build configuration list for PBXNativeTarget "Pods-TTGPuzzleVerify_Example" */ = { 704 | isa = XCConfigurationList; 705 | buildConfigurations = ( 706 | AE809F5FCDBDE02FB2C3EC5D976D3A39 /* Debug */, 707 | 8A4BB7617CC547E0CDC9CB7178CF5BAF /* Release */, 708 | ); 709 | defaultConfigurationIsVisible = 0; 710 | defaultConfigurationName = Release; 711 | }; 712 | /* End XCConfigurationList section */ 713 | }; 714 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 715 | } 716 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_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-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## TTGPuzzleVerify 5 | 6 | Copyright (c) 2016 zekunyan 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_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) 2016 zekunyan <zekunyan@163.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 | TTGPuzzleVerify 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_TTGPuzzleVerify_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_TTGPuzzleVerify_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_Example-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 | 91 | if [[ "$CONFIGURATION" == "Debug" ]]; then 92 | install_framework "$BUILT_PRODUCTS_DIR/TTGPuzzleVerify/TTGPuzzleVerify.framework" 93 | fi 94 | if [[ "$CONFIGURATION" == "Release" ]]; then 95 | install_framework "$BUILT_PRODUCTS_DIR/TTGPuzzleVerify/TTGPuzzleVerify.framework" 96 | fi 97 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 98 | wait 99 | fi 100 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_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 | *) 25 | TARGET_DEVICE_ARGS="--target-device mac" 26 | ;; 27 | esac 28 | 29 | install_resource() 30 | { 31 | if [[ "$1" = /* ]] ; then 32 | RESOURCE_PATH="$1" 33 | else 34 | RESOURCE_PATH="${PODS_ROOT}/$1" 35 | fi 36 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 37 | cat << EOM 38 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 39 | EOM 40 | exit 1 41 | fi 42 | case $RESOURCE_PATH in 43 | *.storyboard) 44 | 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}" 45 | 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} 46 | ;; 47 | *.xib) 48 | 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}" 49 | 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} 50 | ;; 51 | *.framework) 52 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 53 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 54 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 55 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 56 | ;; 57 | *.xcdatamodel) 58 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" 59 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 60 | ;; 61 | *.xcdatamodeld) 62 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" 63 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 64 | ;; 65 | *.xcmappingmodel) 66 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" 67 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 68 | ;; 69 | *.xcassets) 70 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 71 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 72 | ;; 73 | *) 74 | echo "$RESOURCE_PATH" 75 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 76 | ;; 77 | esac 78 | } 79 | 80 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 81 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 82 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 83 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 84 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 85 | fi 86 | rm -f "$RESOURCES_TO_COPY" 87 | 88 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 89 | then 90 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 91 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 92 | while read line; do 93 | if [[ $line != "${PODS_ROOT}*" ]]; then 94 | XCASSET_FILES+=("$line") 95 | fi 96 | done <<<"$OTHER_XCASSETS" 97 | 98 | 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}" 99 | fi 100 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_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_TTGPuzzleVerify_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_TTGPuzzleVerify_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/TTGPuzzleVerify" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/TTGPuzzleVerify/TTGPuzzleVerify.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "TTGPuzzleVerify" 6 | PODS_BUILD_DIR = $BUILD_DIR 7 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_TTGPuzzleVerify_Example { 2 | umbrella header "Pods-TTGPuzzleVerify_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/TTGPuzzleVerify" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/TTGPuzzleVerify/TTGPuzzleVerify.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "TTGPuzzleVerify" 6 | PODS_BUILD_DIR = $BUILD_DIR 7 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_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-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_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-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_Tests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_TTGPuzzleVerify_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_TTGPuzzleVerify_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_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 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_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 | *) 25 | TARGET_DEVICE_ARGS="--target-device mac" 26 | ;; 27 | esac 28 | 29 | install_resource() 30 | { 31 | if [[ "$1" = /* ]] ; then 32 | RESOURCE_PATH="$1" 33 | else 34 | RESOURCE_PATH="${PODS_ROOT}/$1" 35 | fi 36 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 37 | cat << EOM 38 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 39 | EOM 40 | exit 1 41 | fi 42 | case $RESOURCE_PATH in 43 | *.storyboard) 44 | 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}" 45 | 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} 46 | ;; 47 | *.xib) 48 | 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}" 49 | 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} 50 | ;; 51 | *.framework) 52 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 53 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 54 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 55 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 56 | ;; 57 | *.xcdatamodel) 58 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" 59 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 60 | ;; 61 | *.xcdatamodeld) 62 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" 63 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 64 | ;; 65 | *.xcmappingmodel) 66 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" 67 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 68 | ;; 69 | *.xcassets) 70 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 71 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 72 | ;; 73 | *) 74 | echo "$RESOURCE_PATH" 75 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 76 | ;; 77 | esac 78 | } 79 | 80 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 81 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 82 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 83 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 84 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 85 | fi 86 | rm -f "$RESOURCES_TO_COPY" 87 | 88 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 89 | then 90 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 91 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 92 | while read line; do 93 | if [[ $line != "${PODS_ROOT}*" ]]; then 94 | XCASSET_FILES+=("$line") 95 | fi 96 | done <<<"$OTHER_XCASSETS" 97 | 98 | 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}" 99 | fi 100 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_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_TTGPuzzleVerify_TestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_TTGPuzzleVerify_TestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/TTGPuzzleVerify" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/TTGPuzzleVerify/TTGPuzzleVerify.framework/Headers" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT}/Pods 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_TTGPuzzleVerify_Tests { 2 | umbrella header "Pods-TTGPuzzleVerify_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/TTGPuzzleVerify" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/TTGPuzzleVerify/TTGPuzzleVerify.framework/Headers" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT}/Pods 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TTGPuzzleVerify/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/TTGPuzzleVerify/TTGPuzzleVerify-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_TTGPuzzleVerify : NSObject 3 | @end 4 | @implementation PodsDummy_TTGPuzzleVerify 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TTGPuzzleVerify/TTGPuzzleVerify-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TTGPuzzleVerify/TTGPuzzleVerify-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "TTGPuzzleVerifyView+PatternPathProvider.h" 14 | #import "TTGPuzzleVerifyView.h" 15 | 16 | FOUNDATION_EXPORT double TTGPuzzleVerifyVersionNumber; 17 | FOUNDATION_EXPORT const unsigned char TTGPuzzleVerifyVersionString[]; 18 | 19 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TTGPuzzleVerify/TTGPuzzleVerify.modulemap: -------------------------------------------------------------------------------- 1 | framework module TTGPuzzleVerify { 2 | umbrella header "TTGPuzzleVerify-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/TTGPuzzleVerify/TTGPuzzleVerify.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/TTGPuzzleVerify 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | PODS_BUILD_DIR = $BUILD_DIR 5 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 11 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; }; 12 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 13 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F596195388D20070C39A /* InfoPlist.strings */; }; 14 | 6003F59A195388D20070C39A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F599195388D20070C39A /* main.m */; }; 15 | 6003F59E195388D20070C39A /* TTGAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F59D195388D20070C39A /* TTGAppDelegate.m */; }; 16 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5A8195388D20070C39A /* Images.xcassets */; }; 17 | 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F5AF195388D20070C39A /* XCTest.framework */; }; 18 | 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 19 | 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 20 | 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; }; 21 | 6003F5BC195388D20070C39A /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5BB195388D20070C39A /* Tests.m */; }; 22 | 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */; }; 23 | 887FA8D1606E74B2929856D5 /* Pods_TTGPuzzleVerify_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80EEB8433BC5152B6A9E3692 /* Pods_TTGPuzzleVerify_Tests.framework */; }; 24 | 970A9B2A074460FA6070F62D /* Pods_TTGPuzzleVerify_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 004A7EC5982974B2CA547CFA /* Pods_TTGPuzzleVerify_Example.framework */; }; 25 | BFB7B31B1DF490930087C337 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BFB7B31A1DF490930087C337 /* Launch Screen.storyboard */; }; 26 | BFEBA50F1DFDA03D008BBB7D /* TTGSlideHorizontallyVC.m in Sources */ = {isa = PBXBuildFile; fileRef = BFEBA50E1DFDA03D008BBB7D /* TTGSlideHorizontallyVC.m */; }; 27 | BFEBA5121DFDA133008BBB7D /* TTGSlideVerticalVC.m in Sources */ = {isa = PBXBuildFile; fileRef = BFEBA5111DFDA133008BBB7D /* TTGSlideVerticalVC.m */; }; 28 | BFEBA5151DFDA3DE008BBB7D /* TTGDragToVerifyVC.m in Sources */ = {isa = PBXBuildFile; fileRef = BFEBA5141DFDA3DE008BBB7D /* TTGDragToVerifyVC.m */; }; 29 | BFEBA5181DFDA4C4008BBB7D /* TTGSlideAndVerifyManuallyVC.m in Sources */ = {isa = PBXBuildFile; fileRef = BFEBA5171DFDA4C4008BBB7D /* TTGSlideAndVerifyManuallyVC.m */; }; 30 | BFEBA51B1DFDA86F008BBB7D /* TTGSquarePatternVC.m in Sources */ = {isa = PBXBuildFile; fileRef = BFEBA51A1DFDA86F008BBB7D /* TTGSquarePatternVC.m */; }; 31 | BFEBA51E1DFDA87C008BBB7D /* TTGCirclePatternVC.m in Sources */ = {isa = PBXBuildFile; fileRef = BFEBA51D1DFDA87C008BBB7D /* TTGCirclePatternVC.m */; }; 32 | BFEBA5211DFDA887008BBB7D /* TTGCustomPatternVC.m in Sources */ = {isa = PBXBuildFile; fileRef = BFEBA5201DFDA887008BBB7D /* TTGCustomPatternVC.m */; }; 33 | BFEBA5241DFDA892008BBB7D /* TTGCustomShadowVC.m in Sources */ = {isa = PBXBuildFile; fileRef = BFEBA5231DFDA892008BBB7D /* TTGCustomShadowVC.m */; }; 34 | /* End PBXBuildFile section */ 35 | 36 | /* Begin PBXContainerItemProxy section */ 37 | 6003F5B3195388D20070C39A /* PBXContainerItemProxy */ = { 38 | isa = PBXContainerItemProxy; 39 | containerPortal = 6003F582195388D10070C39A /* Project object */; 40 | proxyType = 1; 41 | remoteGlobalIDString = 6003F589195388D20070C39A; 42 | remoteInfo = TTGPuzzleVerify; 43 | }; 44 | /* End PBXContainerItemProxy section */ 45 | 46 | /* Begin PBXFileReference section */ 47 | 004A7EC5982974B2CA547CFA /* Pods_TTGPuzzleVerify_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TTGPuzzleVerify_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | 04AC49E61C9DB734067CA3D8 /* TTGPuzzleVerify.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = TTGPuzzleVerify.podspec; path = ../TTGPuzzleVerify.podspec; sourceTree = ""; }; 49 | 4421B8D17FD8CB9DDB0A4B10 /* Pods-TTGPuzzleVerify_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TTGPuzzleVerify_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_Tests.debug.xcconfig"; sourceTree = ""; }; 50 | 51E71897E0C9EEEEF92299AA /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 51 | 55B4877485FE4DF2FBD7B4F9 /* Pods-TTGPuzzleVerify_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TTGPuzzleVerify_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_Tests.release.xcconfig"; sourceTree = ""; }; 52 | 6003F58A195388D20070C39A /* TTGPuzzleVerify_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TTGPuzzleVerify_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | 6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 54 | 6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 55 | 6003F591195388D20070C39A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 56 | 6003F595195388D20070C39A /* TTGPuzzleVerify-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TTGPuzzleVerify-Info.plist"; sourceTree = ""; }; 57 | 6003F597195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 58 | 6003F599195388D20070C39A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 59 | 6003F59B195388D20070C39A /* TTGPuzzleVerify-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TTGPuzzleVerify-Prefix.pch"; sourceTree = ""; }; 60 | 6003F59C195388D20070C39A /* TTGAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TTGAppDelegate.h; sourceTree = ""; }; 61 | 6003F59D195388D20070C39A /* TTGAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TTGAppDelegate.m; sourceTree = ""; }; 62 | 6003F5A8195388D20070C39A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 63 | 6003F5AE195388D20070C39A /* TTGPuzzleVerify_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TTGPuzzleVerify_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 64 | 6003F5AF195388D20070C39A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 65 | 6003F5B7195388D20070C39A /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = ""; }; 66 | 6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 67 | 6003F5BB195388D20070C39A /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = ""; }; 68 | 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = ""; }; 69 | 720F2DA642F551C634264584 /* Pods-TTGPuzzleVerify_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TTGPuzzleVerify_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_Example.debug.xcconfig"; sourceTree = ""; }; 70 | 80EEB8433BC5152B6A9E3692 /* Pods_TTGPuzzleVerify_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TTGPuzzleVerify_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 71 | 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; 72 | 97EB71D1FAECE279C23BCF42 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 73 | B9856936AE09C30C22FD9E62 /* Pods-TTGPuzzleVerify_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TTGPuzzleVerify_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_Example.release.xcconfig"; sourceTree = ""; }; 74 | BFB7B31A1DF490930087C337 /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; 75 | BFEBA50D1DFDA03D008BBB7D /* TTGSlideHorizontallyVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTGSlideHorizontallyVC.h; sourceTree = ""; }; 76 | BFEBA50E1DFDA03D008BBB7D /* TTGSlideHorizontallyVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTGSlideHorizontallyVC.m; sourceTree = ""; }; 77 | BFEBA5101DFDA133008BBB7D /* TTGSlideVerticalVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTGSlideVerticalVC.h; sourceTree = ""; }; 78 | BFEBA5111DFDA133008BBB7D /* TTGSlideVerticalVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTGSlideVerticalVC.m; sourceTree = ""; }; 79 | BFEBA5131DFDA3DE008BBB7D /* TTGDragToVerifyVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTGDragToVerifyVC.h; sourceTree = ""; }; 80 | BFEBA5141DFDA3DE008BBB7D /* TTGDragToVerifyVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTGDragToVerifyVC.m; sourceTree = ""; }; 81 | BFEBA5161DFDA4C4008BBB7D /* TTGSlideAndVerifyManuallyVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTGSlideAndVerifyManuallyVC.h; sourceTree = ""; }; 82 | BFEBA5171DFDA4C4008BBB7D /* TTGSlideAndVerifyManuallyVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTGSlideAndVerifyManuallyVC.m; sourceTree = ""; }; 83 | BFEBA5191DFDA86F008BBB7D /* TTGSquarePatternVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTGSquarePatternVC.h; sourceTree = ""; }; 84 | BFEBA51A1DFDA86F008BBB7D /* TTGSquarePatternVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTGSquarePatternVC.m; sourceTree = ""; }; 85 | BFEBA51C1DFDA87C008BBB7D /* TTGCirclePatternVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTGCirclePatternVC.h; sourceTree = ""; }; 86 | BFEBA51D1DFDA87C008BBB7D /* TTGCirclePatternVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTGCirclePatternVC.m; sourceTree = ""; }; 87 | BFEBA51F1DFDA887008BBB7D /* TTGCustomPatternVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTGCustomPatternVC.h; sourceTree = ""; }; 88 | BFEBA5201DFDA887008BBB7D /* TTGCustomPatternVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTGCustomPatternVC.m; sourceTree = ""; }; 89 | BFEBA5221DFDA892008BBB7D /* TTGCustomShadowVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTGCustomShadowVC.h; sourceTree = ""; }; 90 | BFEBA5231DFDA892008BBB7D /* TTGCustomShadowVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTGCustomShadowVC.m; sourceTree = ""; }; 91 | /* End PBXFileReference section */ 92 | 93 | /* Begin PBXFrameworksBuildPhase section */ 94 | 6003F587195388D20070C39A /* Frameworks */ = { 95 | isa = PBXFrameworksBuildPhase; 96 | buildActionMask = 2147483647; 97 | files = ( 98 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */, 99 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */, 100 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */, 101 | 970A9B2A074460FA6070F62D /* Pods_TTGPuzzleVerify_Example.framework in Frameworks */, 102 | ); 103 | runOnlyForDeploymentPostprocessing = 0; 104 | }; 105 | 6003F5AB195388D20070C39A /* Frameworks */ = { 106 | isa = PBXFrameworksBuildPhase; 107 | buildActionMask = 2147483647; 108 | files = ( 109 | 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */, 110 | 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */, 111 | 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */, 112 | 887FA8D1606E74B2929856D5 /* Pods_TTGPuzzleVerify_Tests.framework in Frameworks */, 113 | ); 114 | runOnlyForDeploymentPostprocessing = 0; 115 | }; 116 | /* End PBXFrameworksBuildPhase section */ 117 | 118 | /* Begin PBXGroup section */ 119 | 6003F581195388D10070C39A = { 120 | isa = PBXGroup; 121 | children = ( 122 | 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */, 123 | 6003F593195388D20070C39A /* Example for TTGPuzzleVerify */, 124 | 6003F5B5195388D20070C39A /* Tests */, 125 | 6003F58C195388D20070C39A /* Frameworks */, 126 | 6003F58B195388D20070C39A /* Products */, 127 | B351DD6FE084DB0F002F7126 /* Pods */, 128 | ); 129 | sourceTree = ""; 130 | }; 131 | 6003F58B195388D20070C39A /* Products */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 6003F58A195388D20070C39A /* TTGPuzzleVerify_Example.app */, 135 | 6003F5AE195388D20070C39A /* TTGPuzzleVerify_Tests.xctest */, 136 | ); 137 | name = Products; 138 | sourceTree = ""; 139 | }; 140 | 6003F58C195388D20070C39A /* Frameworks */ = { 141 | isa = PBXGroup; 142 | children = ( 143 | 6003F58D195388D20070C39A /* Foundation.framework */, 144 | 6003F58F195388D20070C39A /* CoreGraphics.framework */, 145 | 6003F591195388D20070C39A /* UIKit.framework */, 146 | 6003F5AF195388D20070C39A /* XCTest.framework */, 147 | 004A7EC5982974B2CA547CFA /* Pods_TTGPuzzleVerify_Example.framework */, 148 | 80EEB8433BC5152B6A9E3692 /* Pods_TTGPuzzleVerify_Tests.framework */, 149 | ); 150 | name = Frameworks; 151 | sourceTree = ""; 152 | }; 153 | 6003F593195388D20070C39A /* Example for TTGPuzzleVerify */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | 6003F5A8195388D20070C39A /* Images.xcassets */, 157 | BFB7B31A1DF490930087C337 /* Launch Screen.storyboard */, 158 | 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */, 159 | 6003F594195388D20070C39A /* Supporting Files */, 160 | 6003F59C195388D20070C39A /* TTGAppDelegate.h */, 161 | 6003F59D195388D20070C39A /* TTGAppDelegate.m */, 162 | BFEBA5131DFDA3DE008BBB7D /* TTGDragToVerifyVC.h */, 163 | BFEBA5141DFDA3DE008BBB7D /* TTGDragToVerifyVC.m */, 164 | BFEBA5161DFDA4C4008BBB7D /* TTGSlideAndVerifyManuallyVC.h */, 165 | BFEBA5171DFDA4C4008BBB7D /* TTGSlideAndVerifyManuallyVC.m */, 166 | BFEBA50D1DFDA03D008BBB7D /* TTGSlideHorizontallyVC.h */, 167 | BFEBA50E1DFDA03D008BBB7D /* TTGSlideHorizontallyVC.m */, 168 | BFEBA5101DFDA133008BBB7D /* TTGSlideVerticalVC.h */, 169 | BFEBA5111DFDA133008BBB7D /* TTGSlideVerticalVC.m */, 170 | BFEBA5191DFDA86F008BBB7D /* TTGSquarePatternVC.h */, 171 | BFEBA51A1DFDA86F008BBB7D /* TTGSquarePatternVC.m */, 172 | BFEBA51C1DFDA87C008BBB7D /* TTGCirclePatternVC.h */, 173 | BFEBA51D1DFDA87C008BBB7D /* TTGCirclePatternVC.m */, 174 | BFEBA51F1DFDA887008BBB7D /* TTGCustomPatternVC.h */, 175 | BFEBA5201DFDA887008BBB7D /* TTGCustomPatternVC.m */, 176 | BFEBA5221DFDA892008BBB7D /* TTGCustomShadowVC.h */, 177 | BFEBA5231DFDA892008BBB7D /* TTGCustomShadowVC.m */, 178 | ); 179 | name = "Example for TTGPuzzleVerify"; 180 | path = TTGPuzzleVerify; 181 | sourceTree = ""; 182 | }; 183 | 6003F594195388D20070C39A /* Supporting Files */ = { 184 | isa = PBXGroup; 185 | children = ( 186 | 6003F595195388D20070C39A /* TTGPuzzleVerify-Info.plist */, 187 | 6003F596195388D20070C39A /* InfoPlist.strings */, 188 | 6003F599195388D20070C39A /* main.m */, 189 | 6003F59B195388D20070C39A /* TTGPuzzleVerify-Prefix.pch */, 190 | ); 191 | name = "Supporting Files"; 192 | sourceTree = ""; 193 | }; 194 | 6003F5B5195388D20070C39A /* Tests */ = { 195 | isa = PBXGroup; 196 | children = ( 197 | 6003F5BB195388D20070C39A /* Tests.m */, 198 | 6003F5B6195388D20070C39A /* Supporting Files */, 199 | ); 200 | path = Tests; 201 | sourceTree = ""; 202 | }; 203 | 6003F5B6195388D20070C39A /* Supporting Files */ = { 204 | isa = PBXGroup; 205 | children = ( 206 | 6003F5B7195388D20070C39A /* Tests-Info.plist */, 207 | 6003F5B8195388D20070C39A /* InfoPlist.strings */, 208 | 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */, 209 | ); 210 | name = "Supporting Files"; 211 | sourceTree = ""; 212 | }; 213 | 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */ = { 214 | isa = PBXGroup; 215 | children = ( 216 | 04AC49E61C9DB734067CA3D8 /* TTGPuzzleVerify.podspec */, 217 | 51E71897E0C9EEEEF92299AA /* README.md */, 218 | 97EB71D1FAECE279C23BCF42 /* LICENSE */, 219 | ); 220 | name = "Podspec Metadata"; 221 | sourceTree = ""; 222 | }; 223 | B351DD6FE084DB0F002F7126 /* Pods */ = { 224 | isa = PBXGroup; 225 | children = ( 226 | 720F2DA642F551C634264584 /* Pods-TTGPuzzleVerify_Example.debug.xcconfig */, 227 | B9856936AE09C30C22FD9E62 /* Pods-TTGPuzzleVerify_Example.release.xcconfig */, 228 | 4421B8D17FD8CB9DDB0A4B10 /* Pods-TTGPuzzleVerify_Tests.debug.xcconfig */, 229 | 55B4877485FE4DF2FBD7B4F9 /* Pods-TTGPuzzleVerify_Tests.release.xcconfig */, 230 | ); 231 | name = Pods; 232 | sourceTree = ""; 233 | }; 234 | /* End PBXGroup section */ 235 | 236 | /* Begin PBXNativeTarget section */ 237 | 6003F589195388D20070C39A /* TTGPuzzleVerify_Example */ = { 238 | isa = PBXNativeTarget; 239 | buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "TTGPuzzleVerify_Example" */; 240 | buildPhases = ( 241 | C847B46471F34F5EDE189F2D /* [CP] Check Pods Manifest.lock */, 242 | 6003F586195388D20070C39A /* Sources */, 243 | 6003F587195388D20070C39A /* Frameworks */, 244 | 6003F588195388D20070C39A /* Resources */, 245 | 3F3AF8228FE1DBD0D8DA4F30 /* [CP] Embed Pods Frameworks */, 246 | 8DDD98FCDC6634E9D51FA3CD /* [CP] Copy Pods Resources */, 247 | ); 248 | buildRules = ( 249 | ); 250 | dependencies = ( 251 | ); 252 | name = TTGPuzzleVerify_Example; 253 | productName = TTGPuzzleVerify; 254 | productReference = 6003F58A195388D20070C39A /* TTGPuzzleVerify_Example.app */; 255 | productType = "com.apple.product-type.application"; 256 | }; 257 | 6003F5AD195388D20070C39A /* TTGPuzzleVerify_Tests */ = { 258 | isa = PBXNativeTarget; 259 | buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "TTGPuzzleVerify_Tests" */; 260 | buildPhases = ( 261 | 1B1AB8AB1222381EE952C06E /* [CP] Check Pods Manifest.lock */, 262 | 6003F5AA195388D20070C39A /* Sources */, 263 | 6003F5AB195388D20070C39A /* Frameworks */, 264 | 6003F5AC195388D20070C39A /* Resources */, 265 | 73689112BE7DACEA6087CBC4 /* [CP] Embed Pods Frameworks */, 266 | EF9619F2CFA1EC395EEC67ED /* [CP] Copy Pods Resources */, 267 | ); 268 | buildRules = ( 269 | ); 270 | dependencies = ( 271 | 6003F5B4195388D20070C39A /* PBXTargetDependency */, 272 | ); 273 | name = TTGPuzzleVerify_Tests; 274 | productName = TTGPuzzleVerifyTests; 275 | productReference = 6003F5AE195388D20070C39A /* TTGPuzzleVerify_Tests.xctest */; 276 | productType = "com.apple.product-type.bundle.unit-test"; 277 | }; 278 | /* End PBXNativeTarget section */ 279 | 280 | /* Begin PBXProject section */ 281 | 6003F582195388D10070C39A /* Project object */ = { 282 | isa = PBXProject; 283 | attributes = { 284 | CLASSPREFIX = TTG; 285 | LastUpgradeCheck = 0810; 286 | ORGANIZATIONNAME = zekunyan; 287 | TargetAttributes = { 288 | 6003F589195388D20070C39A = { 289 | ProvisioningStyle = Manual; 290 | }; 291 | 6003F5AD195388D20070C39A = { 292 | TestTargetID = 6003F589195388D20070C39A; 293 | }; 294 | }; 295 | }; 296 | buildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject "TTGPuzzleVerify" */; 297 | compatibilityVersion = "Xcode 3.2"; 298 | developmentRegion = English; 299 | hasScannedForEncodings = 0; 300 | knownRegions = ( 301 | en, 302 | Base, 303 | ); 304 | mainGroup = 6003F581195388D10070C39A; 305 | productRefGroup = 6003F58B195388D20070C39A /* Products */; 306 | projectDirPath = ""; 307 | projectRoot = ""; 308 | targets = ( 309 | 6003F589195388D20070C39A /* TTGPuzzleVerify_Example */, 310 | 6003F5AD195388D20070C39A /* TTGPuzzleVerify_Tests */, 311 | ); 312 | }; 313 | /* End PBXProject section */ 314 | 315 | /* Begin PBXResourcesBuildPhase section */ 316 | 6003F588195388D20070C39A /* Resources */ = { 317 | isa = PBXResourcesBuildPhase; 318 | buildActionMask = 2147483647; 319 | files = ( 320 | 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */, 321 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */, 322 | BFB7B31B1DF490930087C337 /* Launch Screen.storyboard in Resources */, 323 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */, 324 | ); 325 | runOnlyForDeploymentPostprocessing = 0; 326 | }; 327 | 6003F5AC195388D20070C39A /* Resources */ = { 328 | isa = PBXResourcesBuildPhase; 329 | buildActionMask = 2147483647; 330 | files = ( 331 | 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */, 332 | ); 333 | runOnlyForDeploymentPostprocessing = 0; 334 | }; 335 | /* End PBXResourcesBuildPhase section */ 336 | 337 | /* Begin PBXShellScriptBuildPhase section */ 338 | 1B1AB8AB1222381EE952C06E /* [CP] Check Pods Manifest.lock */ = { 339 | isa = PBXShellScriptBuildPhase; 340 | buildActionMask = 2147483647; 341 | files = ( 342 | ); 343 | inputPaths = ( 344 | ); 345 | name = "[CP] Check Pods Manifest.lock"; 346 | outputPaths = ( 347 | ); 348 | runOnlyForDeploymentPostprocessing = 0; 349 | shellPath = /bin/sh; 350 | shellScript = "diff \"${PODS_ROOT}/../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"; 351 | showEnvVarsInLog = 0; 352 | }; 353 | 3F3AF8228FE1DBD0D8DA4F30 /* [CP] Embed Pods Frameworks */ = { 354 | isa = PBXShellScriptBuildPhase; 355 | buildActionMask = 2147483647; 356 | files = ( 357 | ); 358 | inputPaths = ( 359 | ); 360 | name = "[CP] Embed Pods Frameworks"; 361 | outputPaths = ( 362 | ); 363 | runOnlyForDeploymentPostprocessing = 0; 364 | shellPath = /bin/sh; 365 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_Example-frameworks.sh\"\n"; 366 | showEnvVarsInLog = 0; 367 | }; 368 | 73689112BE7DACEA6087CBC4 /* [CP] Embed Pods Frameworks */ = { 369 | isa = PBXShellScriptBuildPhase; 370 | buildActionMask = 2147483647; 371 | files = ( 372 | ); 373 | inputPaths = ( 374 | ); 375 | name = "[CP] Embed Pods Frameworks"; 376 | outputPaths = ( 377 | ); 378 | runOnlyForDeploymentPostprocessing = 0; 379 | shellPath = /bin/sh; 380 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_Tests-frameworks.sh\"\n"; 381 | showEnvVarsInLog = 0; 382 | }; 383 | 8DDD98FCDC6634E9D51FA3CD /* [CP] Copy Pods Resources */ = { 384 | isa = PBXShellScriptBuildPhase; 385 | buildActionMask = 2147483647; 386 | files = ( 387 | ); 388 | inputPaths = ( 389 | ); 390 | name = "[CP] Copy Pods Resources"; 391 | outputPaths = ( 392 | ); 393 | runOnlyForDeploymentPostprocessing = 0; 394 | shellPath = /bin/sh; 395 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TTGPuzzleVerify_Example/Pods-TTGPuzzleVerify_Example-resources.sh\"\n"; 396 | showEnvVarsInLog = 0; 397 | }; 398 | C847B46471F34F5EDE189F2D /* [CP] Check Pods Manifest.lock */ = { 399 | isa = PBXShellScriptBuildPhase; 400 | buildActionMask = 2147483647; 401 | files = ( 402 | ); 403 | inputPaths = ( 404 | ); 405 | name = "[CP] Check Pods Manifest.lock"; 406 | outputPaths = ( 407 | ); 408 | runOnlyForDeploymentPostprocessing = 0; 409 | shellPath = /bin/sh; 410 | shellScript = "diff \"${PODS_ROOT}/../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"; 411 | showEnvVarsInLog = 0; 412 | }; 413 | EF9619F2CFA1EC395EEC67ED /* [CP] Copy Pods Resources */ = { 414 | isa = PBXShellScriptBuildPhase; 415 | buildActionMask = 2147483647; 416 | files = ( 417 | ); 418 | inputPaths = ( 419 | ); 420 | name = "[CP] Copy Pods Resources"; 421 | outputPaths = ( 422 | ); 423 | runOnlyForDeploymentPostprocessing = 0; 424 | shellPath = /bin/sh; 425 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TTGPuzzleVerify_Tests/Pods-TTGPuzzleVerify_Tests-resources.sh\"\n"; 426 | showEnvVarsInLog = 0; 427 | }; 428 | /* End PBXShellScriptBuildPhase section */ 429 | 430 | /* Begin PBXSourcesBuildPhase section */ 431 | 6003F586195388D20070C39A /* Sources */ = { 432 | isa = PBXSourcesBuildPhase; 433 | buildActionMask = 2147483647; 434 | files = ( 435 | BFEBA5121DFDA133008BBB7D /* TTGSlideVerticalVC.m in Sources */, 436 | 6003F59E195388D20070C39A /* TTGAppDelegate.m in Sources */, 437 | BFEBA5181DFDA4C4008BBB7D /* TTGSlideAndVerifyManuallyVC.m in Sources */, 438 | BFEBA5151DFDA3DE008BBB7D /* TTGDragToVerifyVC.m in Sources */, 439 | 6003F59A195388D20070C39A /* main.m in Sources */, 440 | BFEBA51B1DFDA86F008BBB7D /* TTGSquarePatternVC.m in Sources */, 441 | BFEBA50F1DFDA03D008BBB7D /* TTGSlideHorizontallyVC.m in Sources */, 442 | BFEBA5241DFDA892008BBB7D /* TTGCustomShadowVC.m in Sources */, 443 | BFEBA51E1DFDA87C008BBB7D /* TTGCirclePatternVC.m in Sources */, 444 | BFEBA5211DFDA887008BBB7D /* TTGCustomPatternVC.m in Sources */, 445 | ); 446 | runOnlyForDeploymentPostprocessing = 0; 447 | }; 448 | 6003F5AA195388D20070C39A /* Sources */ = { 449 | isa = PBXSourcesBuildPhase; 450 | buildActionMask = 2147483647; 451 | files = ( 452 | 6003F5BC195388D20070C39A /* Tests.m in Sources */, 453 | ); 454 | runOnlyForDeploymentPostprocessing = 0; 455 | }; 456 | /* End PBXSourcesBuildPhase section */ 457 | 458 | /* Begin PBXTargetDependency section */ 459 | 6003F5B4195388D20070C39A /* PBXTargetDependency */ = { 460 | isa = PBXTargetDependency; 461 | target = 6003F589195388D20070C39A /* TTGPuzzleVerify_Example */; 462 | targetProxy = 6003F5B3195388D20070C39A /* PBXContainerItemProxy */; 463 | }; 464 | /* End PBXTargetDependency section */ 465 | 466 | /* Begin PBXVariantGroup section */ 467 | 6003F596195388D20070C39A /* InfoPlist.strings */ = { 468 | isa = PBXVariantGroup; 469 | children = ( 470 | 6003F597195388D20070C39A /* en */, 471 | ); 472 | name = InfoPlist.strings; 473 | sourceTree = ""; 474 | }; 475 | 6003F5B8195388D20070C39A /* InfoPlist.strings */ = { 476 | isa = PBXVariantGroup; 477 | children = ( 478 | 6003F5B9195388D20070C39A /* en */, 479 | ); 480 | name = InfoPlist.strings; 481 | sourceTree = ""; 482 | }; 483 | /* End PBXVariantGroup section */ 484 | 485 | /* Begin XCBuildConfiguration section */ 486 | 6003F5BD195388D20070C39A /* Debug */ = { 487 | isa = XCBuildConfiguration; 488 | buildSettings = { 489 | ALWAYS_SEARCH_USER_PATHS = NO; 490 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 491 | CLANG_CXX_LIBRARY = "libc++"; 492 | CLANG_ENABLE_MODULES = YES; 493 | CLANG_ENABLE_OBJC_ARC = YES; 494 | CLANG_WARN_BOOL_CONVERSION = YES; 495 | CLANG_WARN_CONSTANT_CONVERSION = YES; 496 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 497 | CLANG_WARN_EMPTY_BODY = YES; 498 | CLANG_WARN_ENUM_CONVERSION = YES; 499 | CLANG_WARN_INFINITE_RECURSION = YES; 500 | CLANG_WARN_INT_CONVERSION = YES; 501 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 502 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 503 | CLANG_WARN_UNREACHABLE_CODE = YES; 504 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 505 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 506 | COPY_PHASE_STRIP = NO; 507 | ENABLE_STRICT_OBJC_MSGSEND = YES; 508 | ENABLE_TESTABILITY = YES; 509 | GCC_C_LANGUAGE_STANDARD = gnu99; 510 | GCC_DYNAMIC_NO_PIC = NO; 511 | GCC_NO_COMMON_BLOCKS = YES; 512 | GCC_OPTIMIZATION_LEVEL = 0; 513 | GCC_PREPROCESSOR_DEFINITIONS = ( 514 | "DEBUG=1", 515 | "$(inherited)", 516 | ); 517 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 518 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 519 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 520 | GCC_WARN_UNDECLARED_SELECTOR = YES; 521 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 522 | GCC_WARN_UNUSED_FUNCTION = YES; 523 | GCC_WARN_UNUSED_VARIABLE = YES; 524 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 525 | ONLY_ACTIVE_ARCH = YES; 526 | SDKROOT = iphoneos; 527 | TARGETED_DEVICE_FAMILY = "1,2"; 528 | }; 529 | name = Debug; 530 | }; 531 | 6003F5BE195388D20070C39A /* Release */ = { 532 | isa = XCBuildConfiguration; 533 | buildSettings = { 534 | ALWAYS_SEARCH_USER_PATHS = NO; 535 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 536 | CLANG_CXX_LIBRARY = "libc++"; 537 | CLANG_ENABLE_MODULES = YES; 538 | CLANG_ENABLE_OBJC_ARC = YES; 539 | CLANG_WARN_BOOL_CONVERSION = YES; 540 | CLANG_WARN_CONSTANT_CONVERSION = YES; 541 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 542 | CLANG_WARN_EMPTY_BODY = YES; 543 | CLANG_WARN_ENUM_CONVERSION = YES; 544 | CLANG_WARN_INFINITE_RECURSION = YES; 545 | CLANG_WARN_INT_CONVERSION = YES; 546 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 547 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 548 | CLANG_WARN_UNREACHABLE_CODE = YES; 549 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 550 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 551 | COPY_PHASE_STRIP = YES; 552 | ENABLE_NS_ASSERTIONS = NO; 553 | ENABLE_STRICT_OBJC_MSGSEND = YES; 554 | GCC_C_LANGUAGE_STANDARD = gnu99; 555 | GCC_NO_COMMON_BLOCKS = YES; 556 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 557 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 558 | GCC_WARN_UNDECLARED_SELECTOR = YES; 559 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 560 | GCC_WARN_UNUSED_FUNCTION = YES; 561 | GCC_WARN_UNUSED_VARIABLE = YES; 562 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 563 | SDKROOT = iphoneos; 564 | TARGETED_DEVICE_FAMILY = "1,2"; 565 | VALIDATE_PRODUCT = YES; 566 | }; 567 | name = Release; 568 | }; 569 | 6003F5C0195388D20070C39A /* Debug */ = { 570 | isa = XCBuildConfiguration; 571 | baseConfigurationReference = 720F2DA642F551C634264584 /* Pods-TTGPuzzleVerify_Example.debug.xcconfig */; 572 | buildSettings = { 573 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 574 | DEVELOPMENT_TEAM = ""; 575 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 576 | GCC_PREFIX_HEADER = "TTGPuzzleVerify/TTGPuzzleVerify-Prefix.pch"; 577 | INFOPLIST_FILE = "TTGPuzzleVerify/TTGPuzzleVerify-Info.plist"; 578 | MODULE_NAME = ExampleApp; 579 | PRODUCT_BUNDLE_IDENTIFIER = "me.tutuge.TTGPuzzleVerify-Example"; 580 | PRODUCT_NAME = "$(TARGET_NAME)"; 581 | WRAPPER_EXTENSION = app; 582 | }; 583 | name = Debug; 584 | }; 585 | 6003F5C1195388D20070C39A /* Release */ = { 586 | isa = XCBuildConfiguration; 587 | baseConfigurationReference = B9856936AE09C30C22FD9E62 /* Pods-TTGPuzzleVerify_Example.release.xcconfig */; 588 | buildSettings = { 589 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 590 | DEVELOPMENT_TEAM = ""; 591 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 592 | GCC_PREFIX_HEADER = "TTGPuzzleVerify/TTGPuzzleVerify-Prefix.pch"; 593 | INFOPLIST_FILE = "TTGPuzzleVerify/TTGPuzzleVerify-Info.plist"; 594 | MODULE_NAME = ExampleApp; 595 | PRODUCT_BUNDLE_IDENTIFIER = "me.tutuge.TTGPuzzleVerify-Example"; 596 | PRODUCT_NAME = "$(TARGET_NAME)"; 597 | WRAPPER_EXTENSION = app; 598 | }; 599 | name = Release; 600 | }; 601 | 6003F5C3195388D20070C39A /* Debug */ = { 602 | isa = XCBuildConfiguration; 603 | baseConfigurationReference = 4421B8D17FD8CB9DDB0A4B10 /* Pods-TTGPuzzleVerify_Tests.debug.xcconfig */; 604 | buildSettings = { 605 | BUNDLE_LOADER = "$(TEST_HOST)"; 606 | FRAMEWORK_SEARCH_PATHS = ( 607 | "$(SDKROOT)/Developer/Library/Frameworks", 608 | "$(inherited)", 609 | "$(DEVELOPER_FRAMEWORKS_DIR)", 610 | ); 611 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 612 | GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; 613 | GCC_PREPROCESSOR_DEFINITIONS = ( 614 | "DEBUG=1", 615 | "$(inherited)", 616 | ); 617 | INFOPLIST_FILE = "Tests/Tests-Info.plist"; 618 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 619 | PRODUCT_NAME = "$(TARGET_NAME)"; 620 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TTGPuzzleVerify_Example.app/TTGPuzzleVerify_Example"; 621 | WRAPPER_EXTENSION = xctest; 622 | }; 623 | name = Debug; 624 | }; 625 | 6003F5C4195388D20070C39A /* Release */ = { 626 | isa = XCBuildConfiguration; 627 | baseConfigurationReference = 55B4877485FE4DF2FBD7B4F9 /* Pods-TTGPuzzleVerify_Tests.release.xcconfig */; 628 | buildSettings = { 629 | BUNDLE_LOADER = "$(TEST_HOST)"; 630 | FRAMEWORK_SEARCH_PATHS = ( 631 | "$(SDKROOT)/Developer/Library/Frameworks", 632 | "$(inherited)", 633 | "$(DEVELOPER_FRAMEWORKS_DIR)", 634 | ); 635 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 636 | GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; 637 | INFOPLIST_FILE = "Tests/Tests-Info.plist"; 638 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 639 | PRODUCT_NAME = "$(TARGET_NAME)"; 640 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TTGPuzzleVerify_Example.app/TTGPuzzleVerify_Example"; 641 | WRAPPER_EXTENSION = xctest; 642 | }; 643 | name = Release; 644 | }; 645 | /* End XCBuildConfiguration section */ 646 | 647 | /* Begin XCConfigurationList section */ 648 | 6003F585195388D10070C39A /* Build configuration list for PBXProject "TTGPuzzleVerify" */ = { 649 | isa = XCConfigurationList; 650 | buildConfigurations = ( 651 | 6003F5BD195388D20070C39A /* Debug */, 652 | 6003F5BE195388D20070C39A /* Release */, 653 | ); 654 | defaultConfigurationIsVisible = 0; 655 | defaultConfigurationName = Release; 656 | }; 657 | 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "TTGPuzzleVerify_Example" */ = { 658 | isa = XCConfigurationList; 659 | buildConfigurations = ( 660 | 6003F5C0195388D20070C39A /* Debug */, 661 | 6003F5C1195388D20070C39A /* Release */, 662 | ); 663 | defaultConfigurationIsVisible = 0; 664 | defaultConfigurationName = Release; 665 | }; 666 | 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "TTGPuzzleVerify_Tests" */ = { 667 | isa = XCConfigurationList; 668 | buildConfigurations = ( 669 | 6003F5C3195388D20070C39A /* Debug */, 670 | 6003F5C4195388D20070C39A /* Release */, 671 | ); 672 | defaultConfigurationIsVisible = 0; 673 | defaultConfigurationName = Release; 674 | }; 675 | /* End XCConfigurationList section */ 676 | }; 677 | rootObject = 6003F582195388D10070C39A /* Project object */; 678 | } 679 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify.xcodeproj/xcshareddata/xcschemes/TTGPuzzleVerify-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "size" : "40x40", 25 | "idiom" : "iphone", 26 | "filename" : "Icon-Small-40@2x.png", 27 | "scale" : "2x" 28 | }, 29 | { 30 | "size" : "40x40", 31 | "idiom" : "iphone", 32 | "filename" : "Icon-Small-40@3x.png", 33 | "scale" : "3x" 34 | }, 35 | { 36 | "size" : "60x60", 37 | "idiom" : "iphone", 38 | "filename" : "Icon-60@2x.png", 39 | "scale" : "2x" 40 | }, 41 | { 42 | "size" : "60x60", 43 | "idiom" : "iphone", 44 | "filename" : "Icon-60@3x.png", 45 | "scale" : "3x" 46 | } 47 | ], 48 | "info" : { 49 | "version" : 1, 50 | "author" : "xcode" 51 | } 52 | } -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zekunyan/TTGPuzzleVerify/04c5c6b1ac25f12bf94821cb3668cc705fa6f93e/Example/TTGPuzzleVerify/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zekunyan/TTGPuzzleVerify/04c5c6b1ac25f12bf94821cb3668cc705fa6f93e/Example/TTGPuzzleVerify/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zekunyan/TTGPuzzleVerify/04c5c6b1ac25f12bf94821cb3668cc705fa6f93e/Example/TTGPuzzleVerify/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zekunyan/TTGPuzzleVerify/04c5c6b1ac25f12bf94821cb3668cc705fa6f93e/Example/TTGPuzzleVerify/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/Images.xcassets/pic1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "pic1.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/Images.xcassets/pic1.imageset/pic1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zekunyan/TTGPuzzleVerify/04c5c6b1ac25f12bf94821cb3668cc705fa6f93e/Example/TTGPuzzleVerify/Images.xcassets/pic1.imageset/pic1.jpg -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/Images.xcassets/pic3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "pic3.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/Images.xcassets/pic3.imageset/pic3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zekunyan/TTGPuzzleVerify/04c5c6b1ac25f12bf94821cb3668cc705fa6f93e/Example/TTGPuzzleVerify/Images.xcassets/pic3.imageset/pic3.jpg -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/Launch Screen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // TTGAppDelegate.h 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/10. 6 | // Copyright (c) 2016 zekunyan. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface TTGAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTGAppDelegate.m 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/10. 6 | // Copyright (c) 2016 zekunyan. All rights reserved. 7 | // 8 | 9 | #import "TTGAppDelegate.h" 10 | 11 | @implementation TTGAppDelegate 12 | 13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 14 | return YES; 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGCirclePatternVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // TTGCirclePatternVC.h 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TTGCirclePatternVC : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGCirclePatternVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTGCirclePatternVC.m 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import "TTGCirclePatternVC.h" 10 | #import 11 | 12 | @interface TTGCirclePatternVC () 13 | @property (weak, nonatomic) IBOutlet TTGPuzzleVerifyView *puzzleVerifyView; 14 | @property (weak, nonatomic) IBOutlet UILabel *logLabel; 15 | @end 16 | 17 | @implementation TTGCirclePatternVC 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | _puzzleVerifyView.image = [UIImage imageNamed:@"pic3"]; 23 | _puzzleVerifyView.puzzlePattern = TTGPuzzleVerifyCirclePattern; 24 | _puzzleVerifyView.puzzleBlankPosition = CGPointMake(200, 40); 25 | _puzzleVerifyView.puzzlePosition = CGPointMake(10, 40); 26 | _puzzleVerifyView.puzzleXPercentage = 0.1; 27 | _puzzleVerifyView.delegate = self; 28 | } 29 | 30 | #pragma mark - TTGPuzzleVerifyViewDelegate 31 | 32 | - (void)puzzleVerifyView:(TTGPuzzleVerifyView *)puzzleVerifyView didChangedVerification:(BOOL)isVerified { 33 | if ([_puzzleVerifyView isVerified]) { 34 | [_puzzleVerifyView completeVerificationWithAnimation:YES]; 35 | _puzzleVerifyView.enable = NO; 36 | _logLabel.text = @"Verify done !"; 37 | } 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGCustomPatternVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // TTGCustomPatternVC.h 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TTGCustomPatternVC : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGCustomPatternVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTGCustomPatternVC.m 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import "TTGCustomPatternVC.h" 10 | #import 11 | 12 | @interface TTGCustomPatternVC () 13 | @property (weak, nonatomic) IBOutlet TTGPuzzleVerifyView *puzzleVerifyView; 14 | @property (weak, nonatomic) IBOutlet UILabel *logLabel; 15 | @end 16 | 17 | @implementation TTGCustomPatternVC 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | _puzzleVerifyView.image = [UIImage imageNamed:@"pic1"]; 23 | _puzzleVerifyView.puzzleBlankPosition = CGPointMake(120, 50); 24 | _puzzleVerifyView.puzzlePosition = CGPointMake(10, 40); 25 | _puzzleVerifyView.puzzleXPercentage = 0.1; 26 | _puzzleVerifyView.puzzleBlankAlpha = 0.1; 27 | 28 | _puzzleVerifyView.puzzlePattern = TTGPuzzleVerifyCustomPattern; 29 | _puzzleVerifyView.customPuzzlePatternPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 80, 80) cornerRadius:20]; 30 | 31 | _puzzleVerifyView.delegate = self; 32 | } 33 | 34 | #pragma mark - TTGPuzzleVerifyViewDelegate 35 | 36 | - (void)puzzleVerifyView:(TTGPuzzleVerifyView *)puzzleVerifyView didChangedVerification:(BOOL)isVerified { 37 | if ([_puzzleVerifyView isVerified]) { 38 | [_puzzleVerifyView completeVerificationWithAnimation:YES]; 39 | _puzzleVerifyView.enable = NO; 40 | _logLabel.text = @"Verify done !"; 41 | } 42 | } 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGCustomShadowVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // TTGCustomShadowVC.h 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TTGCustomShadowVC : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGCustomShadowVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTGCustomShadowVC.m 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import "TTGCustomShadowVC.h" 10 | #import 11 | 12 | @interface TTGCustomShadowVC () 13 | @property (weak, nonatomic) IBOutlet TTGPuzzleVerifyView *puzzleVerifyView; 14 | @property (weak, nonatomic) IBOutlet UILabel *logLabel; 15 | @end 16 | 17 | @implementation TTGCustomShadowVC 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | _puzzleVerifyView.image = [UIImage imageNamed:@"pic3"]; 23 | _puzzleVerifyView.puzzleBlankPosition = CGPointMake(200, 40); 24 | _puzzleVerifyView.puzzlePosition = CGPointMake(10, 40); 25 | _puzzleVerifyView.puzzleXPercentage = 0.1; 26 | _puzzleVerifyView.delegate = self; 27 | 28 | _puzzleVerifyView.puzzleBlankInnerShadowColor = [UIColor yellowColor]; 29 | _puzzleVerifyView.puzzleBlankInnerShadowRadius = 6; 30 | _puzzleVerifyView.puzzleBlankInnerShadowOpacity = 0.8; 31 | _puzzleVerifyView.puzzleBlankInnerShadowOffset = CGSizeMake(2, 2); 32 | 33 | _puzzleVerifyView.puzzleShadowColor = [UIColor greenColor]; 34 | _puzzleVerifyView.puzzleShadowRadius = 6; 35 | _puzzleVerifyView.puzzleShadowOpacity = 0.6; 36 | _puzzleVerifyView.puzzleShadowOffset = CGSizeMake(2, 2); 37 | } 38 | 39 | #pragma mark - TTGPuzzleVerifyViewDelegate 40 | 41 | - (void)puzzleVerifyView:(TTGPuzzleVerifyView *)puzzleVerifyView didChangedVerification:(BOOL)isVerified { 42 | if ([_puzzleVerifyView isVerified]) { 43 | [_puzzleVerifyView completeVerificationWithAnimation:YES]; 44 | _puzzleVerifyView.enable = NO; 45 | _logLabel.text = @"Verify done !"; 46 | } 47 | } 48 | 49 | @end 50 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGDragToVerifyVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // TTGDragToVerifyVC.h 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TTGDragToVerifyVC : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGDragToVerifyVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTGDragToVerifyVC.m 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import "TTGDragToVerifyVC.h" 10 | #import 11 | 12 | @interface TTGDragToVerifyVC () 13 | @property (weak, nonatomic) IBOutlet TTGPuzzleVerifyView *puzzleVerifyView; 14 | @property (weak, nonatomic) IBOutlet UILabel *logLabel; 15 | @end 16 | 17 | @implementation TTGDragToVerifyVC 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | _puzzleVerifyView.image = [UIImage imageNamed:@"pic3"]; 23 | _puzzleVerifyView.puzzleBlankPosition = CGPointMake(200, 40); 24 | _puzzleVerifyView.puzzlePosition = CGPointMake(10, 40); 25 | _puzzleVerifyView.puzzleXPercentage = 0.1; 26 | _puzzleVerifyView.delegate = self; 27 | } 28 | 29 | #pragma mark - TTGPuzzleVerifyViewDelegate 30 | 31 | - (void)puzzleVerifyView:(TTGPuzzleVerifyView *)puzzleVerifyView didChangedVerification:(BOOL)isVerified { 32 | if ([_puzzleVerifyView isVerified]) { 33 | [_puzzleVerifyView completeVerificationWithAnimation:YES]; 34 | _puzzleVerifyView.enable = NO; 35 | _logLabel.text = @"Verify done !"; 36 | } 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGPuzzleVerify-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | PuzzleVerify 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | Launch Screen 29 | UIMainStoryboardFile 30 | Main 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | UIInterfaceOrientationLandscapeRight 40 | 41 | UISupportedInterfaceOrientations~ipad 42 | 43 | UIInterfaceOrientationPortrait 44 | UIInterfaceOrientationPortraitUpsideDown 45 | UIInterfaceOrientationLandscapeLeft 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGPuzzleVerify-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_5_0 10 | #warning "This project uses features only available in iOS SDK 5.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | @import UIKit; 15 | @import Foundation; 16 | #endif 17 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGSlideAndVerifyManuallyVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // TTGSlideAndVerifyManuallyVC.h 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TTGSlideAndVerifyManuallyVC : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGSlideAndVerifyManuallyVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTGSlideAndVerifyManuallyVC.m 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import "TTGSlideAndVerifyManuallyVC.h" 10 | #import 11 | 12 | @interface TTGSlideAndVerifyManuallyVC () 13 | @property (weak, nonatomic) IBOutlet TTGPuzzleVerifyView *puzzleVerifyView; 14 | @property (weak, nonatomic) IBOutlet UILabel *logLabel; 15 | @end 16 | 17 | @implementation TTGSlideAndVerifyManuallyVC 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | _puzzleVerifyView.image = [UIImage imageNamed:@"pic3"]; 23 | _puzzleVerifyView.puzzleBlankPosition = CGPointMake(200, 40); 24 | _puzzleVerifyView.puzzlePosition = CGPointMake(10, 40); 25 | _puzzleVerifyView.puzzleXPercentage = 0.1; 26 | } 27 | 28 | #pragma mark - Actions 29 | 30 | - (IBAction)onSliderChange:(UISlider *)sender { 31 | _puzzleVerifyView.puzzleXPercentage = sender.value; 32 | } 33 | 34 | - (IBAction)onTapVerify:(id)sender { 35 | if ([_puzzleVerifyView isVerified]) { 36 | [_puzzleVerifyView completeVerificationWithAnimation:YES]; 37 | _puzzleVerifyView.enable = NO; 38 | _logLabel.text = @"Verify done !"; 39 | } else { 40 | _logLabel.text = @"Verify wrong !"; 41 | } 42 | } 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGSlideHorizontallyVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // TTGSlideHorizontallyVC.h 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TTGSlideHorizontallyVC : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGSlideHorizontallyVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTGSlideHorizontallyVC.m 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import "TTGSlideHorizontallyVC.h" 10 | #import 11 | 12 | @interface TTGSlideHorizontallyVC () 13 | @property (weak, nonatomic) IBOutlet TTGPuzzleVerifyView *puzzleVerifyView; 14 | @property (weak, nonatomic) IBOutlet UILabel *logLabel; 15 | @end 16 | 17 | @implementation TTGSlideHorizontallyVC 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | _puzzleVerifyView.image = [UIImage imageNamed:@"pic3"]; 23 | _puzzleVerifyView.puzzleBlankPosition = CGPointMake(200, 40); 24 | _puzzleVerifyView.puzzlePosition = CGPointMake(10, 40); 25 | _puzzleVerifyView.puzzleXPercentage = 0.1; 26 | _puzzleVerifyView.delegate = self; 27 | } 28 | 29 | #pragma mark - TTGPuzzleVerifyViewDelegate 30 | 31 | - (void)puzzleVerifyView:(TTGPuzzleVerifyView *)puzzleVerifyView didChangedVerification:(BOOL)isVerified { 32 | if ([_puzzleVerifyView isVerified]) { 33 | [_puzzleVerifyView completeVerificationWithAnimation:YES]; 34 | _puzzleVerifyView.enable = NO; 35 | _logLabel.text = @"Verify done !"; 36 | } 37 | } 38 | 39 | #pragma mark - Actions 40 | 41 | - (IBAction)onSliderChange:(UISlider *)sender { 42 | _puzzleVerifyView.puzzleXPercentage = sender.value; 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGSlideVerticalVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // TTGSlideVerticalVC.h 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TTGSlideVerticalVC : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGSlideVerticalVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTGSlideVerticalVC.m 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import "TTGSlideVerticalVC.h" 10 | #import 11 | 12 | @interface TTGSlideVerticalVC () 13 | @property (weak, nonatomic) IBOutlet TTGPuzzleVerifyView *puzzleVerifyView; 14 | @property (weak, nonatomic) IBOutlet UILabel *logLabel; 15 | @end 16 | 17 | @implementation TTGSlideVerticalVC 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | _puzzleVerifyView.image = [UIImage imageNamed:@"pic3"]; 23 | _puzzleVerifyView.puzzleBlankPosition = CGPointMake(100, 100); 24 | _puzzleVerifyView.puzzlePosition = CGPointMake(100, 10); 25 | _puzzleVerifyView.puzzleYPercentage = 0.1; 26 | _puzzleVerifyView.delegate = self; 27 | } 28 | 29 | #pragma mark - TTGPuzzleVerifyViewDelegate 30 | 31 | - (void)puzzleVerifyView:(TTGPuzzleVerifyView *)puzzleVerifyView didChangedVerification:(BOOL)isVerified { 32 | if ([_puzzleVerifyView isVerified]) { 33 | [_puzzleVerifyView completeVerificationWithAnimation:YES]; 34 | _puzzleVerifyView.enable = NO; 35 | _logLabel.text = @"Verify done !"; 36 | } 37 | } 38 | 39 | #pragma mark - Actions 40 | 41 | - (IBAction)onSliderChange:(UISlider *)sender { 42 | _puzzleVerifyView.puzzleYPercentage = sender.value; 43 | } 44 | 45 | @end 46 | 47 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGSquarePatternVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // TTGSquarePatternVC.h 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TTGSquarePatternVC : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/TTGSquarePatternVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTGSquarePatternVC.m 3 | // TTGPuzzleVerify 4 | // 5 | // Created by tutuge on 2016/12/11. 6 | // Copyright © 2016年 zekunyan. All rights reserved. 7 | // 8 | 9 | #import "TTGSquarePatternVC.h" 10 | #import 11 | 12 | @interface TTGSquarePatternVC () 13 | @property (weak, nonatomic) IBOutlet TTGPuzzleVerifyView *puzzleVerifyView; 14 | @property (weak, nonatomic) IBOutlet UILabel *logLabel; 15 | @end 16 | 17 | @implementation TTGSquarePatternVC 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | _puzzleVerifyView.image = [UIImage imageNamed:@"pic3"]; 23 | _puzzleVerifyView.puzzlePattern = TTGPuzzleVerifySquarePattern; 24 | _puzzleVerifyView.puzzleBlankPosition = CGPointMake(200, 40); 25 | _puzzleVerifyView.puzzlePosition = CGPointMake(10, 40); 26 | _puzzleVerifyView.puzzleXPercentage = 0.1; 27 | _puzzleVerifyView.delegate = self; 28 | } 29 | 30 | #pragma mark - TTGPuzzleVerifyViewDelegate 31 | 32 | - (void)puzzleVerifyView:(TTGPuzzleVerifyView *)puzzleVerifyView didChangedVerification:(BOOL)isVerified { 33 | if ([_puzzleVerifyView isVerified]) { 34 | [_puzzleVerifyView completeVerificationWithAnimation:YES]; 35 | _puzzleVerifyView.enable = NO; 36 | _logLabel.text = @"Verify done !"; 37 | } 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Example/TTGPuzzleVerify/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // TTGPuzzleVerify 4 | // 5 | // Created by zekunyan on 12/05/2016. 6 | // Copyright (c) 2016 zekunyan. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | #import "TTGAppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) 13 | { 14 | @autoreleasepool { 15 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([TTGAppDelegate class])); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Example/Tests/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 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Example/Tests/Tests-Prefix.pch: -------------------------------------------------------------------------------- 1 | // The contents of this file are implicitly included at the beginning of every test case source file. 2 | 3 | #ifdef __OBJC__ 4 | 5 | 6 | 7 | #endif 8 | -------------------------------------------------------------------------------- /Example/Tests/Tests.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTGPuzzleVerifyTests.m 3 | // TTGPuzzleVerifyTests 4 | // 5 | // Created by zekunyan on 12/05/2016. 6 | // Copyright (c) 2016 zekunyan. All rights reserved. 7 | // 8 | 9 | @import XCTest; 10 | 11 | @interface Tests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation Tests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | } 20 | 21 | - (void)tearDown { 22 | [super tearDown]; 23 | } 24 | 25 | - (void)testExample { 26 | } 27 | 28 | @end 29 | 30 | -------------------------------------------------------------------------------- /Example/Tests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 zekunyan 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TTGPuzzleVerify 2 | 3 | [![CI Status](http://img.shields.io/travis/zekunyan/TTGPuzzleVerify.svg?style=flat)](https://travis-ci.org/zekunyan/TTGPuzzleVerify) 4 | [![Version](https://img.shields.io/cocoapods/v/TTGPuzzleVerify.svg?style=flat)](http://cocoapods.org/pods/TTGPuzzleVerify) 5 | [![License](https://img.shields.io/cocoapods/l/TTGPuzzleVerify.svg?style=flat)](http://cocoapods.org/pods/TTGPuzzleVerify) 6 | [![Platform](https://img.shields.io/cocoapods/p/TTGPuzzleVerify.svg?style=flat)](http://cocoapods.org/pods/TTGPuzzleVerify) 7 | 8 | ![Screenshot](https://github.com/zekunyan/TTGPuzzleVerify/raw/master/Resources/TTGPuzzleVerify.jpeg) 9 | 10 | ![Gif](https://github.com/zekunyan/TTGPuzzleVerify/raw/master/Resources/TTGPuzzleVerify.gif) 11 | 12 | ## What 13 | By completing **image puzzle game**, TTGPuzzleVerify is a **more user-friendly** verification tool on iOS, which is highly customizable and easy to use. It supports square, circle, classic or custom puzzle shape. User can complete the verification by sliding horizontally, vertically or directly dragging the puzzle block. 14 | 15 | ## Features 16 | * More user-friendly 17 | * Highly Customizable 18 | * Classic, square, circle or custom puzzle shape 19 | * Slide horizontally or vertically or drag the puzzle directly 20 | 21 | ## Example 22 | 23 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 24 | 25 | ## Requirements 26 | iOS 7 and later. 27 | 28 | ## Installation 29 | 30 | TTGPuzzleVerify is available through [CocoaPods](http://cocoapods.org). To install 31 | it, simply add the following line to your Podfile: 32 | 33 | ```ruby 34 | pod "TTGPuzzleVerify" 35 | ``` 36 | 37 | ## Usage 38 | `TTGPuzzleVerifyView` 39 | 40 | ### Basic use 41 | ``` 42 | // Import 43 | #import 44 | 45 | - (void)viewDidLoad { 46 | [super viewDidLoad]; 47 | 48 | // Create TTGPuzzleVerifyView instance 49 | _puzzleVerifyView = [[TTGPuzzleVerifyView alloc] initWithFrame:CGRectMake(20, 20, 320, 200)]; 50 | [self.view addSubview:_puzzleVerifyView]; 51 | 52 | // Set image 53 | _puzzleVerifyView.image = [UIImage imageNamed:@"pic"]; 54 | 55 | // Set the puzzle blank position 56 | _puzzleVerifyView.puzzleBlankPosition = CGPointMake(200, 40); 57 | 58 | // Set init puzzle position 59 | _puzzleVerifyView.puzzlePosition = CGPointMake(10, 40); 60 | 61 | // Callback 62 | [_puzzleVerifyView setVerificationChangeBlock:^(TTGPuzzleVerifyView *view, BOOL isVerified) { 63 | if (isVerified) { 64 | // User complete the verification 65 | } 66 | }]; 67 | } 68 | 69 | // On slide changed 70 | - (IBAction)onSliderChange:(UISlider *)sender { 71 | // Update position 72 | _puzzleVerifyView.puzzleXPercentage = sender.value; 73 | } 74 | 75 | ``` 76 | 77 | ### API 78 | #### Puzzle pattern types 79 | ``` 80 | /** 81 | * TTGPuzzleVerifyView pattern type 82 | */ 83 | typedef NS_ENUM(NSInteger, TTGPuzzleVerifyPattern) { 84 | TTGPuzzleVerifyClassicPattern = 0, // Default 85 | TTGPuzzleVerifySquarePattern, 86 | TTGPuzzleVerifyCirclePattern, 87 | TTGPuzzleVerifyCustomPattern 88 | }; 89 | 90 | // Puzzle pattern, default is TTGPuzzleVerifyClassicPattern 91 | @property (nonatomic, assign) TTGPuzzleVerifyPattern puzzlePattern; 92 | 93 | // Custom path for puzzle shape. Only work when puzzlePattern is TTGPuzzleVerifyCustomPattern 94 | @property (nonatomic, strong) UIBezierPath *customPuzzlePatternPath; 95 | ``` 96 | 97 | #### Complete the puzzle with animation 98 | ``` 99 | /** 100 | Complete verification. Call this with set the puzzle to its original position and fill the blank. 101 | 102 | @param withAnimation if show animation 103 | */ 104 | - (void)completeVerificationWithAnimation:(BOOL)withAnimation; 105 | ``` 106 | 107 | #### Callback 108 | ``` 109 | /** 110 | * Verification changed callback delegate 111 | */ 112 | @protocol TTGPuzzleVerifyViewDelegate 113 | @optional 114 | - (void)puzzleVerifyView:(TTGPuzzleVerifyView *)puzzleVerifyView didChangedVerification:(BOOL)isVerified; 115 | 116 | - (void)puzzleVerifyView:(TTGPuzzleVerifyView *)puzzleVerifyView didChangedPuzzlePosition:(CGPoint)newPosition 117 | xPercentage:(CGFloat)xPercentage yPercentage:(CGFloat)yPercentage; 118 | @end 119 | 120 | // Callback block and delegate 121 | @property (nonatomic, weak) id delegate; // Callback delegate 122 | @property (nonatomic, copy) void (^verificationChangeBlock)(TTGPuzzleVerifyView *puzzleVerifyView, BOOL isVerified); // verification changed callback block 123 | ``` 124 | 125 | #### Puzzle image 126 | ``` 127 | @property (nonatomic, strong) UIImage *image; // Image for verification 128 | ``` 129 | 130 | #### Puzzle size and position 131 | ``` 132 | // Puzzle rect size,not for TTGPuzzleVerifyCustomPattern pattern 133 | @property (nonatomic, assign) CGSize puzzleSize; 134 | 135 | // Puzzle blank position 136 | @property (nonatomic, assign) CGPoint puzzleBlankPosition; 137 | 138 | // Puzzle current position 139 | @property (nonatomic, assign) CGPoint puzzlePosition; 140 | 141 | // Puzzle current X and Y position percentage, range: [0, 1] 142 | @property (nonatomic, assign) CGFloat puzzleXPercentage; 143 | @property (nonatomic, assign) CGFloat puzzleYPercentage; 144 | ``` 145 | 146 | #### Puzzle verification 147 | ``` 148 | // Verification 149 | @property (nonatomic, assign) CGFloat verificationTolerance; // Verification tolerance, default is 8 150 | @property (nonatomic, assign, readonly) BOOL isVerified; // Verification boolean 151 | ``` 152 | 153 | #### Style 154 | ``` 155 | /** 156 | * Style 157 | */ 158 | 159 | // Puzzle blank alpha, default is 0.5 160 | @property (nonatomic, assign) CGFloat puzzleBlankAlpha; 161 | 162 | // Puzzle blank inner shadow 163 | @property (nonatomic, strong) UIColor *puzzleBlankInnerShadowColor; // Default: black 164 | @property (nonatomic, assign) CGFloat puzzleBlankInnerShadowRadius; // Default: 4 165 | @property (nonatomic, assign) CGFloat puzzleBlankInnerShadowOpacity; // Default: 0.5 166 | @property (nonatomic, assign) CGSize puzzleBlankInnerShadowOffset; // Default: (0, 0) 167 | 168 | // Puzzle shadow 169 | @property (nonatomic, strong) UIColor *puzzleShadowColor; // Default: black 170 | @property (nonatomic, assign) CGFloat puzzleShadowRadius; // Default: 4 171 | @property (nonatomic, assign) CGFloat puzzleShadowOpacity; // Default: 0.5 172 | @property (nonatomic, assign) CGSize puzzleShadowOffset; // Default: (0, 0) 173 | ``` 174 | 175 | ## Example 176 | For more information, you can download the zip and run the example. 177 | 178 | ## Author 179 | 180 | zekunyan, zekunyan@163.com 181 | 182 | ## License 183 | 184 | TTGPuzzleVerify is available under the MIT license. See the LICENSE file for more info. 185 | -------------------------------------------------------------------------------- /Resources/TTGPuzzleVerify.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zekunyan/TTGPuzzleVerify/04c5c6b1ac25f12bf94821cb3668cc705fa6f93e/Resources/TTGPuzzleVerify.gif -------------------------------------------------------------------------------- /Resources/TTGPuzzleVerify.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zekunyan/TTGPuzzleVerify/04c5c6b1ac25f12bf94821cb3668cc705fa6f93e/Resources/TTGPuzzleVerify.jpeg -------------------------------------------------------------------------------- /TTGPuzzleVerify.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'TTGPuzzleVerify' 3 | s.version = '1.0.0' 4 | s.summary = 'By completing image puzzle game, TTGPuzzleVerify is a more user-friendly verification tool on iOS, which is highly customizable and easy to use.' 5 | 6 | s.description = <<-DESC 7 | By completing image puzzle game, TTGPuzzleVerify is a more user-friendly verification tool on iOS, which is highly customizable and easy to use. It supports square, circle, classic or custom puzzle shape. User can complete the verification by sliding horizontally, vertically or directly dragging the puzzle block. 8 | DESC 9 | 10 | s.homepage = 'https://github.com/zekunyan/TTGPuzzleVerify' 11 | s.license = { :type => 'MIT', :file => 'LICENSE' } 12 | s.author = { 'zekunyan' => 'zekunyan@163.com' } 13 | s.source = { :git => 'https://github.com/zekunyan/TTGPuzzleVerify.git', :tag => s.version.to_s } 14 | s.social_media_url = 'http://tutuge.me' 15 | 16 | s.ios.deployment_target = '7.0' 17 | s.requires_arc = true 18 | 19 | s.source_files = 'TTGPuzzleVerify/Classes/**/*' 20 | s.public_header_files = 'TTGPuzzleVerify/Classes/**/*.h' 21 | end 22 | -------------------------------------------------------------------------------- /TTGPuzzleVerify/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zekunyan/TTGPuzzleVerify/04c5c6b1ac25f12bf94821cb3668cc705fa6f93e/TTGPuzzleVerify/Assets/.gitkeep -------------------------------------------------------------------------------- /TTGPuzzleVerify/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zekunyan/TTGPuzzleVerify/04c5c6b1ac25f12bf94821cb3668cc705fa6f93e/TTGPuzzleVerify/Classes/.gitkeep -------------------------------------------------------------------------------- /TTGPuzzleVerify/Classes/TTGPuzzleVerifyView+PatternPathProvider.h: -------------------------------------------------------------------------------- 1 | // 2 | // TTGPuzzleVerifyView+PatternPathProvider.h 3 | // Pods 4 | // 5 | // Created by tutuge on 2016/12/10. 6 | // 7 | // 8 | 9 | #import "TTGPuzzleVerifyView.h" 10 | 11 | @interface TTGPuzzleVerifyView (PatternPathProvider) 12 | 13 | /** 14 | * Path for different puzzle pattern 15 | * @param pattern 16 | * @return 17 | */ 18 | + (UIBezierPath *)verifyPathForPattern:(TTGPuzzleVerifyPattern)pattern; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /TTGPuzzleVerify/Classes/TTGPuzzleVerifyView+PatternPathProvider.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTGPuzzleVerifyView+PatternPathProvider.m 3 | // Pods 4 | // 5 | // Created by tutuge on 2016/12/10. 6 | // 7 | // 8 | 9 | #import "TTGPuzzleVerifyView+PatternPathProvider.h" 10 | 11 | @implementation TTGPuzzleVerifyView (PatternPathProvider) 12 | 13 | + (UIBezierPath *)verifyPathForPattern:(TTGPuzzleVerifyPattern)pattern { 14 | switch (pattern) { 15 | case TTGPuzzleVerifyClassicPattern: 16 | return [self classicPuzzlePath]; 17 | case TTGPuzzleVerifySquarePattern: 18 | return [self squarePath]; 19 | case TTGPuzzleVerifyCirclePattern: 20 | return [self circlePath]; 21 | case TTGPuzzleVerifyCustomPattern: 22 | return [self classicPuzzlePath]; 23 | } 24 | } 25 | 26 | #pragma mark - Private 27 | 28 | + (UIBezierPath *)squarePath { 29 | static UIBezierPath *path = nil; 30 | 31 | static dispatch_once_t onceToken; 32 | dispatch_once(&onceToken, ^{ 33 | path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)]; 34 | }); 35 | 36 | return path; 37 | } 38 | 39 | + (UIBezierPath *)circlePath { 40 | static UIBezierPath *path = nil; 41 | 42 | static dispatch_once_t onceToken; 43 | dispatch_once(&onceToken, ^{ 44 | path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 100, 100)]; 45 | }); 46 | 47 | return path; 48 | } 49 | 50 | + (UIBezierPath *)classicPuzzlePath { 51 | static UIBezierPath *puzzleShape = nil; 52 | 53 | static dispatch_once_t onceToken; 54 | dispatch_once(&onceToken, ^{ 55 | puzzleShape = [UIBezierPath bezierPath]; 56 | [puzzleShape moveToPoint:CGPointMake(17.45, 71.16)]; 57 | [puzzleShape addCurveToPoint:CGPointMake(25, 74.69) controlPoint1:CGPointMake(20.83, 67.76) controlPoint2:CGPointMake(25, 69.2)]; 58 | [puzzleShape addLineToPoint:CGPointMake(25, 100)]; 59 | [puzzleShape addLineToPoint:CGPointMake(50.31, 100)]; 60 | [puzzleShape addCurveToPoint:CGPointMake(53.84, 92.45) controlPoint1:CGPointMake(55.79, 100) controlPoint2:CGPointMake(57.24, 95.83)]; 61 | [puzzleShape addCurveToPoint:CGPointMake(50, 85.33) controlPoint1:CGPointMake(52.18, 90.78) controlPoint2:CGPointMake(50, 89.4)]; 62 | [puzzleShape addCurveToPoint:CGPointMake(62.5, 75) controlPoint1:CGPointMake(50, 80.8) controlPoint2:CGPointMake(54.62, 75)]; 63 | [puzzleShape addCurveToPoint:CGPointMake(75, 85.33) controlPoint1:CGPointMake(70.38, 75) controlPoint2:CGPointMake(75, 80.8)]; 64 | [puzzleShape addCurveToPoint:CGPointMake(71.16, 92.45) controlPoint1:CGPointMake(75, 89.4) controlPoint2:CGPointMake(72.82, 90.78)]; 65 | [puzzleShape addCurveToPoint:CGPointMake(74.69, 100) controlPoint1:CGPointMake(67.76, 95.83) controlPoint2:CGPointMake(69.2, 100)]; 66 | [puzzleShape addLineToPoint:CGPointMake(100, 100)]; 67 | [puzzleShape addLineToPoint:CGPointMake(100, 74.69)]; 68 | [puzzleShape addCurveToPoint:CGPointMake(92.45, 71.16) controlPoint1:CGPointMake(100, 69.21) controlPoint2:CGPointMake(95.83, 67.76)]; 69 | [puzzleShape addCurveToPoint:CGPointMake(85.33, 75) controlPoint1:CGPointMake(90.78, 72.82) controlPoint2:CGPointMake(89.4, 75)]; 70 | [puzzleShape addCurveToPoint:CGPointMake(75, 62.5) controlPoint1:CGPointMake(80.8, 75) controlPoint2:CGPointMake(75, 70.38)]; 71 | [puzzleShape addCurveToPoint:CGPointMake(85.33, 50) controlPoint1:CGPointMake(75, 54.62) controlPoint2:CGPointMake(80.8, 50)]; 72 | [puzzleShape addCurveToPoint:CGPointMake(92.45, 53.84) controlPoint1:CGPointMake(89.4, 50) controlPoint2:CGPointMake(90.78, 52.18)]; 73 | [puzzleShape addCurveToPoint:CGPointMake(100, 50.31) controlPoint1:CGPointMake(95.83, 57.24) controlPoint2:CGPointMake(100, 55.8)]; 74 | [puzzleShape addLineToPoint:CGPointMake(100, 25)]; 75 | [puzzleShape addLineToPoint:CGPointMake(74.69, 25)]; 76 | [puzzleShape addCurveToPoint:CGPointMake(71.16, 17.45) controlPoint1:CGPointMake(69.21, 25) controlPoint2:CGPointMake(67.76, 20.83)]; 77 | [puzzleShape addCurveToPoint:CGPointMake(75, 10.33) controlPoint1:CGPointMake(72.82, 15.78) controlPoint2:CGPointMake(75, 14.4)]; 78 | [puzzleShape addCurveToPoint:CGPointMake(62.5, 0) controlPoint1:CGPointMake(75, 5.8) controlPoint2:CGPointMake(70.38, 0)]; 79 | [puzzleShape addCurveToPoint:CGPointMake(50, 10.33) controlPoint1:CGPointMake(54.62, 0) controlPoint2:CGPointMake(50, 5.8)]; 80 | [puzzleShape addCurveToPoint:CGPointMake(53.84, 17.45) controlPoint1:CGPointMake(50, 14.4) controlPoint2:CGPointMake(52.18, 15.78)]; 81 | [puzzleShape addCurveToPoint:CGPointMake(50.31, 25) controlPoint1:CGPointMake(57.24, 20.83) controlPoint2:CGPointMake(55.8, 25)]; 82 | [puzzleShape addLineToPoint:CGPointMake(25, 25)]; 83 | [puzzleShape addLineToPoint:CGPointMake(25, 50.31)]; 84 | [puzzleShape addCurveToPoint:CGPointMake(17.45, 53.84) controlPoint1:CGPointMake(25, 55.79) controlPoint2:CGPointMake(20.83, 57.24)]; 85 | [puzzleShape addCurveToPoint:CGPointMake(10.33, 50) controlPoint1:CGPointMake(15.78, 52.18) controlPoint2:CGPointMake(14.4, 50)]; 86 | [puzzleShape addCurveToPoint:CGPointMake(0, 62.5) controlPoint1:CGPointMake(5.8, 50) controlPoint2:CGPointMake(0, 54.62)]; 87 | [puzzleShape addCurveToPoint:CGPointMake(10.33, 75) controlPoint1:CGPointMake(0, 70.38) controlPoint2:CGPointMake(5.8, 75)]; 88 | [puzzleShape addCurveToPoint:CGPointMake(17.45, 71.16) controlPoint1:CGPointMake(14.4, 75) controlPoint2:CGPointMake(15.78, 72.82)]; 89 | [puzzleShape moveToPoint:CGPointMake(17.45, 71.16)]; 90 | [puzzleShape closePath]; 91 | }); 92 | 93 | return puzzleShape; 94 | } 95 | 96 | @end 97 | -------------------------------------------------------------------------------- /TTGPuzzleVerify/Classes/TTGPuzzleVerifyView.h: -------------------------------------------------------------------------------- 1 | // 2 | // TTGPuzzleVerifyView.h 3 | // Pods 4 | // 5 | // Created by tutuge on 2016/12/10. 6 | // 7 | // 8 | 9 | #import 10 | 11 | /** 12 | * TTGPuzzleVerifyView pattern type 13 | */ 14 | typedef NS_ENUM(NSInteger, TTGPuzzleVerifyPattern) { 15 | TTGPuzzleVerifyClassicPattern = 0, // Default 16 | TTGPuzzleVerifySquarePattern, 17 | TTGPuzzleVerifyCirclePattern, 18 | TTGPuzzleVerifyCustomPattern 19 | }; 20 | 21 | @class TTGPuzzleVerifyView; 22 | 23 | /** 24 | * Verification changed callback delegate 25 | */ 26 | @protocol TTGPuzzleVerifyViewDelegate 27 | @optional 28 | - (void)puzzleVerifyView:(TTGPuzzleVerifyView *)puzzleVerifyView didChangedVerification:(BOOL)isVerified; 29 | 30 | - (void)puzzleVerifyView:(TTGPuzzleVerifyView *)puzzleVerifyView didChangedPuzzlePosition:(CGPoint)newPosition 31 | xPercentage:(CGFloat)xPercentage yPercentage:(CGFloat)yPercentage; 32 | @end 33 | 34 | /** 35 | * TTGPuzzleVerifyView 36 | */ 37 | @interface TTGPuzzleVerifyView : UIView 38 | @property (nonatomic, strong) UIImage *image; // Image for verification 39 | 40 | // Puzzle pattern, default is TTGPuzzleVerifyClassicPattern 41 | @property (nonatomic, assign) TTGPuzzleVerifyPattern puzzlePattern; 42 | 43 | // Custom path for puzzle shape. Only work when puzzlePattern is TTGPuzzleVerifyCustomPattern 44 | @property (nonatomic, strong) UIBezierPath *customPuzzlePatternPath; 45 | 46 | // Puzzle rect size,not for TTGPuzzleVerifyCustomPattern pattern 47 | @property (nonatomic, assign) CGSize puzzleSize; 48 | 49 | // Puzzle blank position 50 | @property (nonatomic, assign) CGPoint puzzleBlankPosition; 51 | 52 | // Puzzle current position 53 | @property (nonatomic, assign) CGPoint puzzlePosition; 54 | 55 | // Puzzle current X and Y position percentage, range: [0, 1] 56 | @property (nonatomic, assign) CGFloat puzzleXPercentage; 57 | @property (nonatomic, assign) CGFloat puzzleYPercentage; 58 | 59 | // Verification 60 | @property (nonatomic, assign) CGFloat verificationTolerance; // Verification tolerance, default is 8 61 | @property (nonatomic, assign, readonly) BOOL isVerified; // Verification boolean 62 | 63 | // Enable 64 | @property (nonatomic, assign) BOOL enable; 65 | 66 | /** 67 | * Style 68 | */ 69 | 70 | // Puzzle blank alpha, default is 0.5 71 | @property (nonatomic, assign) CGFloat puzzleBlankAlpha; 72 | 73 | // Puzzle blank inner shadow 74 | @property (nonatomic, strong) UIColor *puzzleBlankInnerShadowColor; // Default: black 75 | @property (nonatomic, assign) CGFloat puzzleBlankInnerShadowRadius; // Default: 4 76 | @property (nonatomic, assign) CGFloat puzzleBlankInnerShadowOpacity; // Default: 0.5 77 | @property (nonatomic, assign) CGSize puzzleBlankInnerShadowOffset; // Default: (0, 0) 78 | 79 | // Puzzle shadow 80 | @property (nonatomic, strong) UIColor *puzzleShadowColor; // Default: black 81 | @property (nonatomic, assign) CGFloat puzzleShadowRadius; // Default: 4 82 | @property (nonatomic, assign) CGFloat puzzleShadowOpacity; // Default: 0.5 83 | @property (nonatomic, assign) CGSize puzzleShadowOffset; // Default: (0, 0) 84 | 85 | // Callback 86 | @property (nonatomic, weak) id delegate; // Callback delegate 87 | @property (nonatomic, copy) void (^verificationChangeBlock)(TTGPuzzleVerifyView *puzzleVerifyView, BOOL isVerified); // verification changed callback block 88 | 89 | 90 | /** 91 | Complete verification. Call this with set the puzzle to its original position and fill the blank. 92 | 93 | @param withAnimation if show animation 94 | */ 95 | - (void)completeVerificationWithAnimation:(BOOL)withAnimation; 96 | 97 | @end 98 | -------------------------------------------------------------------------------- /TTGPuzzleVerify/Classes/TTGPuzzleVerifyView.m: -------------------------------------------------------------------------------- 1 | // 2 | // TTGPuzzleVerifyView.m 3 | // Pods 4 | // 5 | // Created by tutuge on 2016/12/10. 6 | // 7 | // 8 | 9 | #import "TTGPuzzleVerifyView.h" 10 | #import "TTGPuzzleVerifyView+PatternPathProvider.h" 11 | 12 | static CGSize kTTGPuzzleDefaultSize; 13 | static CGFloat kTTGPuzzleAnimationDuration = 0.3; 14 | 15 | @interface TTGPuzzleVerifyView () 16 | @property (nonatomic, strong) UIImageView *backImageView; 17 | @property (nonatomic, strong) CAShapeLayer *backInnerShadowLayer; 18 | 19 | @property (nonatomic, strong) UIImageView *frontImageView; 20 | 21 | @property (nonatomic, strong) UIImageView *puzzleImageView; 22 | @property (nonatomic, strong) UIView *puzzleImageContainerView; 23 | @property (nonatomic, assign) CGPoint puzzleContainerPosition; 24 | 25 | @property (nonatomic, assign) BOOL lastVerification; 26 | @end 27 | 28 | @implementation TTGPuzzleVerifyView 29 | 30 | #pragma mark - Init 31 | 32 | - (instancetype)initWithFrame:(CGRect)frame { 33 | self = [super initWithFrame:frame]; 34 | if (self) { 35 | [self commonInit]; 36 | } 37 | return self; 38 | } 39 | 40 | - (instancetype)initWithCoder:(NSCoder *)coder { 41 | self = [super initWithCoder:coder]; 42 | if (self) { 43 | [self commonInit]; 44 | } 45 | return self; 46 | } 47 | 48 | - (void)commonInit { 49 | if (_backImageView) { 50 | return; 51 | } 52 | 53 | self.userInteractionEnabled = YES; 54 | self.clipsToBounds = YES; 55 | 56 | // Init value 57 | kTTGPuzzleDefaultSize = CGSizeMake(100, 100); 58 | self.enable = YES; 59 | self.puzzlePattern = TTGPuzzleVerifyClassicPattern; 60 | self.customPuzzlePatternPath = [self getNewScaledPuzzledPath]; 61 | self.puzzleSize = kTTGPuzzleDefaultSize; 62 | self.puzzleBlankPosition = CGPointZero; 63 | self.puzzlePosition = CGPointMake(20, 20); 64 | self.verificationTolerance = 8; 65 | 66 | self.puzzleBlankAlpha = 0.5; 67 | self.puzzleBlankInnerShadowColor = [UIColor blackColor]; 68 | self.puzzleBlankInnerShadowRadius = 4; 69 | self.puzzleBlankInnerShadowOpacity = 0.5; 70 | self.puzzleBlankInnerShadowOffset = CGSizeZero; 71 | 72 | self.puzzleShadowColor = [UIColor blackColor]; 73 | self.puzzleShadowRadius = 4; 74 | self.puzzleShadowOpacity = 0.5; 75 | self.puzzleShadowOffset = CGSizeZero; 76 | 77 | // Back puzzle blank image view 78 | _backImageView = [[UIImageView alloc] initWithFrame:self.bounds]; 79 | _backImageView.userInteractionEnabled = NO; 80 | _backImageView.contentMode = UIViewContentModeScaleToFill; 81 | _backImageView.backgroundColor = [UIColor clearColor]; 82 | _backImageView.alpha = _puzzleBlankAlpha; 83 | [self addSubview:_backImageView]; 84 | 85 | // Front puzzle hole image view 86 | _frontImageView = [[UIImageView alloc] initWithFrame:self.bounds]; 87 | _frontImageView.userInteractionEnabled = NO; 88 | _frontImageView.contentMode = UIViewContentModeScaleToFill; 89 | _frontImageView.backgroundColor = [UIColor clearColor]; 90 | [self addSubview:_frontImageView]; 91 | 92 | // Puzzle piece container view 93 | _puzzleImageContainerView = [[UIView alloc] initWithFrame:CGRectMake( 94 | _puzzleContainerPosition.x, _puzzleContainerPosition.y, 95 | CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds))]; 96 | _puzzleImageContainerView.backgroundColor = [UIColor clearColor]; 97 | _puzzleImageContainerView.userInteractionEnabled = NO; 98 | _puzzleImageContainerView.layer.shadowColor = _puzzleShadowColor.CGColor; 99 | _puzzleImageContainerView.layer.shadowRadius = _puzzleShadowRadius; 100 | _puzzleImageContainerView.layer.shadowOpacity = _puzzleShadowOpacity; 101 | _puzzleImageContainerView.layer.shadowOffset = _puzzleShadowOffset; 102 | [self addSubview:_puzzleImageContainerView]; 103 | 104 | // Puzzle piece imageView 105 | _puzzleImageView = [[UIImageView alloc] initWithFrame:_puzzleImageContainerView.bounds]; 106 | _puzzleImageView.userInteractionEnabled = NO; 107 | _puzzleImageView.contentMode = UIViewContentModeScaleToFill; 108 | _puzzleImageView.backgroundColor = [UIColor clearColor]; 109 | [_puzzleImageContainerView addSubview:_puzzleImageView]; 110 | 111 | // Inner shadow layer 112 | _backInnerShadowLayer = [CAShapeLayer layer]; 113 | _backInnerShadowLayer.frame = self.bounds; 114 | _backInnerShadowLayer.fillRule = kCAFillRuleEvenOdd; 115 | _backInnerShadowLayer.shadowColor = _puzzleBlankInnerShadowColor.CGColor; 116 | _backInnerShadowLayer.shadowRadius = _puzzleBlankInnerShadowRadius; 117 | _backInnerShadowLayer.shadowOpacity = _puzzleBlankInnerShadowOpacity; 118 | _backInnerShadowLayer.shadowOffset = _puzzleBlankInnerShadowOffset; 119 | 120 | // Pan gesture 121 | UIPanGestureRecognizer *panGestureRecognizer = [UIPanGestureRecognizer new]; 122 | [panGestureRecognizer addTarget:self action:@selector(onPanGesture:)]; 123 | [self addGestureRecognizer:panGestureRecognizer]; 124 | } 125 | 126 | #pragma mark - Public methods 127 | 128 | - (void)completeVerificationWithAnimation:(BOOL)withAnimation { 129 | if (withAnimation) { 130 | [UIView animateWithDuration:kTTGPuzzleAnimationDuration animations:^{ 131 | [self setPuzzlePosition:_puzzleBlankPosition]; 132 | _puzzleImageContainerView.layer.shadowOpacity = 0; 133 | }]; 134 | } else { 135 | [self setPuzzlePosition:_puzzleBlankPosition]; 136 | _puzzleImageContainerView.layer.shadowOpacity = 0; 137 | } 138 | } 139 | 140 | #pragma mark - Pan gesture 141 | 142 | - (void)onPanGesture:(UIPanGestureRecognizer *)panGestureRecognizer { 143 | CGPoint panLocation = [panGestureRecognizer locationInView:self]; 144 | 145 | // New position 146 | CGPoint position = CGPointZero; 147 | position.x = panLocation.x - _puzzleSize.width / 2; 148 | position.y = panLocation.y - _puzzleSize.height / 2; 149 | 150 | // Update position 151 | if (panGestureRecognizer.state == UIGestureRecognizerStateBegan) { 152 | // Animate move 153 | [UIView animateWithDuration:kTTGPuzzleAnimationDuration animations:^{ 154 | [self setPuzzlePosition:position]; 155 | }]; 156 | } else { 157 | [self setPuzzlePosition:position]; 158 | } 159 | 160 | // Callback 161 | [self performCallback]; 162 | } 163 | 164 | #pragma mark - Override 165 | 166 | - (void)layoutSubviews { 167 | [super layoutSubviews]; 168 | 169 | _backImageView.frame = self.bounds; 170 | _frontImageView.frame = self.bounds; 171 | _puzzleImageContainerView.frame = CGRectMake( 172 | _puzzleContainerPosition.x, _puzzleContainerPosition.y, 173 | CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds)); 174 | _puzzleImageView.frame = _puzzleImageContainerView.bounds; 175 | 176 | [self updatePuzzleMask]; 177 | } 178 | 179 | - (void)willMoveToSuperview:(UIView *)newSuperview { 180 | [super willMoveToSuperview:newSuperview]; 181 | if (newSuperview) { 182 | [self updatePuzzleMask]; 183 | } 184 | } 185 | 186 | #pragma mark - Update Mask layer 187 | 188 | - (void)updatePuzzleMask { 189 | if (!self.superview) { 190 | return; 191 | } 192 | 193 | // Paths 194 | UIBezierPath *puzzlePath = [self getNewScaledPuzzledPath]; 195 | 196 | UIBezierPath *maskPath = [UIBezierPath bezierPathWithRect:self.bounds]; 197 | [maskPath appendPath:[UIBezierPath bezierPathWithCGPath:puzzlePath.CGPath]]; 198 | maskPath.usesEvenOddFillRule = YES; 199 | 200 | // Layers 201 | CAShapeLayer *backMaskLayer = [CAShapeLayer new]; 202 | backMaskLayer.frame = self.bounds; 203 | backMaskLayer.path = puzzlePath.CGPath; 204 | backMaskLayer.fillRule = kCAFillRuleEvenOdd; 205 | 206 | CAShapeLayer *frontMaskLayer = [CAShapeLayer new]; 207 | frontMaskLayer.frame = self.bounds; 208 | frontMaskLayer.path = maskPath.CGPath; 209 | frontMaskLayer.fillRule = kCAFillRuleEvenOdd; 210 | 211 | CAShapeLayer *puzzleMaskLayer = [CAShapeLayer new]; 212 | puzzleMaskLayer.frame = self.bounds; 213 | puzzleMaskLayer.path = puzzlePath.CGPath; 214 | 215 | _backImageView.layer.mask = backMaskLayer; 216 | _frontImageView.layer.mask = frontMaskLayer; 217 | _puzzleImageView.layer.mask = puzzleMaskLayer; 218 | 219 | // Puzzle blank inner shadow 220 | UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:CGRectInset(self.bounds, -20, -20)]; // Outer rect 221 | [shadowPath appendPath:puzzlePath]; // Inner shape 222 | 223 | _backInnerShadowLayer.frame = self.bounds; 224 | _backInnerShadowLayer.path = shadowPath.CGPath; 225 | 226 | [[_backImageView.layer sublayers] makeObjectsPerformSelector:@selector(removeFromSuperlayer)]; 227 | [_backImageView.layer addSublayer:_backInnerShadowLayer]; 228 | } 229 | 230 | #pragma mark - Callback 231 | 232 | - (void)performCallback { 233 | // Callback for position change 234 | if ([_delegate respondsToSelector:@selector(puzzleVerifyView:didChangedPuzzlePosition:xPercentage:yPercentage:)]) { 235 | [_delegate puzzleVerifyView:self didChangedPuzzlePosition:[self puzzlePosition] 236 | xPercentage:[self puzzleXPercentage] yPercentage:[self puzzleYPercentage]]; 237 | } 238 | 239 | // Callback if verification changed 240 | if (_lastVerification != [self isVerified]) { 241 | _lastVerification = [self isVerified]; 242 | 243 | // Delegate 244 | if ([_delegate respondsToSelector:@selector(puzzleVerifyView:didChangedVerification:)]) { 245 | [_delegate puzzleVerifyView:self didChangedVerification:[self isVerified]]; 246 | } 247 | 248 | // Block 249 | if (_verificationChangeBlock) { 250 | _verificationChangeBlock(self, [self isVerified]); 251 | } 252 | } 253 | } 254 | 255 | #pragma mark - Setter and getter 256 | 257 | - (UIBezierPath *)getNewScaledPuzzledPath { 258 | UIBezierPath *path = nil; 259 | 260 | // Pattern path 261 | if (_puzzlePattern == TTGPuzzleVerifyCustomPattern) { 262 | path = [UIBezierPath bezierPathWithCGPath:_customPuzzlePatternPath.CGPath]; 263 | _puzzleSize = path.bounds.size; 264 | } else { 265 | path = [UIBezierPath bezierPathWithCGPath:[TTGPuzzleVerifyView verifyPathForPattern:_puzzlePattern].CGPath]; 266 | // Apply scale transform 267 | [path applyTransform:CGAffineTransformMakeScale( 268 | _puzzleSize.width / path.bounds.size.width, 269 | _puzzleSize.height / path.bounds.size.height)]; 270 | } 271 | 272 | // Apply position transform 273 | [path applyTransform:CGAffineTransformMakeTranslation( 274 | _puzzleBlankPosition.x - path.bounds.origin.x, 275 | _puzzleBlankPosition.y - path.bounds.origin.y)]; 276 | 277 | return path; 278 | } 279 | 280 | // Puzzle position 281 | 282 | - (void)setPuzzlePosition:(CGPoint)puzzlePosition { 283 | if (!_enable) { 284 | return; 285 | } 286 | 287 | // Limit range 288 | puzzlePosition.x = MAX([self puzzleMinX], puzzlePosition.x); 289 | puzzlePosition.x = MIN([self puzzleMaxX], puzzlePosition.x); 290 | 291 | puzzlePosition.y = MAX([self puzzleMinY], puzzlePosition.y); 292 | puzzlePosition.y = MIN([self puzzleMaxY], puzzlePosition.y); 293 | 294 | // Reset shadow 295 | _puzzleImageContainerView.layer.shadowOpacity = _puzzleShadowOpacity; 296 | 297 | // Set puzzle image container position 298 | [self setPuzzleContainerPosition:CGPointMake(puzzlePosition.x - _puzzleBlankPosition.x, 299 | puzzlePosition.y - _puzzleBlankPosition.y)]; 300 | } 301 | 302 | - (CGPoint)puzzlePosition { 303 | return CGPointMake(_puzzleContainerPosition.x + _puzzleBlankPosition.x, 304 | _puzzleContainerPosition.y + _puzzleBlankPosition.y); 305 | } 306 | 307 | // Puzzle blank position 308 | 309 | - (void)setPuzzleBlankPosition:(CGPoint)puzzleBlankPosition { 310 | _puzzleBlankPosition = puzzleBlankPosition; 311 | [self updatePuzzleMask]; 312 | } 313 | 314 | // Puzzle pattern 315 | 316 | - (void)setPuzzlePattern:(TTGPuzzleVerifyPattern)puzzlePattern { 317 | _puzzlePattern = puzzlePattern; 318 | [self updatePuzzleMask]; 319 | } 320 | 321 | // Image 322 | 323 | - (void)setImage:(UIImage *)image { 324 | _image = image; 325 | _backImageView.image = _image; 326 | _frontImageView.image = _image; 327 | _puzzleImageView.image = _image; 328 | [self updatePuzzleMask]; 329 | } 330 | 331 | // Puzzle size 332 | 333 | - (void)setPuzzleSize:(CGSize)puzzleSize { 334 | _puzzleSize = puzzleSize; 335 | [self updatePuzzleMask]; 336 | } 337 | 338 | // Puzzle custom pattern path 339 | 340 | - (void)setCustomPuzzlePatternPath:(UIBezierPath *)customPuzzlePatternPath { 341 | _customPuzzlePatternPath = customPuzzlePatternPath; 342 | [self updatePuzzleMask]; 343 | } 344 | 345 | // Puzzle container position 346 | 347 | - (void)setPuzzleContainerPosition:(CGPoint)puzzleContainerPosition { 348 | _puzzleContainerPosition = puzzleContainerPosition; 349 | CGRect frame = _puzzleImageContainerView.frame; 350 | frame.origin = puzzleContainerPosition; 351 | _puzzleImageContainerView.frame = frame; 352 | } 353 | 354 | // Puzzle X position percentage 355 | 356 | - (CGFloat)puzzleXPercentage { 357 | return ([self puzzlePosition].x - [self puzzleMinX]) / ([self puzzleMaxX] - [self puzzleMinX]); 358 | } 359 | 360 | - (void)setPuzzleXPercentage:(CGFloat)puzzleXPercentage { 361 | if (!_enable) { 362 | return; 363 | } 364 | 365 | // Limit range 366 | puzzleXPercentage = MAX(0, puzzleXPercentage); 367 | puzzleXPercentage = MIN(1, puzzleXPercentage); 368 | 369 | // Change position 370 | CGPoint position = [self puzzlePosition]; 371 | position.x = puzzleXPercentage * ([self puzzleMaxX] - [self puzzleMinX]) + [self puzzleMinX]; 372 | [self setPuzzlePosition:position]; 373 | 374 | // Callback 375 | [self performCallback]; 376 | } 377 | 378 | // Puzzle Y position percentage 379 | 380 | - (CGFloat)puzzleYPercentage { 381 | return ([self puzzlePosition].y - [self puzzleMinY]) / ([self puzzleMaxY] - [self puzzleMinY]); 382 | } 383 | 384 | - (void)setPuzzleYPercentage:(CGFloat)puzzleYPercentage { 385 | if (!_enable) { 386 | return; 387 | } 388 | 389 | // Limit range 390 | puzzleYPercentage = MAX(0, puzzleYPercentage); 391 | puzzleYPercentage = MIN(1, puzzleYPercentage); 392 | 393 | // Change position 394 | CGPoint position = [self puzzlePosition]; 395 | position.y = puzzleYPercentage * ([self puzzleMaxY] - [self puzzleMinY]) + [self puzzleMinY]; 396 | [self setPuzzlePosition:position]; 397 | 398 | // Callback 399 | [self performCallback]; 400 | } 401 | 402 | // isVerified 403 | 404 | - (BOOL)isVerified { 405 | return fabsf([self puzzlePosition].x - _puzzleBlankPosition.x) <= _verificationTolerance && 406 | fabsf([self puzzlePosition].y - _puzzleBlankPosition.y) <= _verificationTolerance; 407 | } 408 | 409 | // Puzzle position range 410 | 411 | - (CGFloat)puzzleMinX { 412 | return 0; 413 | } 414 | 415 | - (CGFloat)puzzleMaxX { 416 | return CGRectGetWidth(self.bounds) - _puzzleSize.width; 417 | } 418 | 419 | - (CGFloat)puzzleMinY { 420 | return 0; 421 | } 422 | 423 | - (CGFloat)puzzleMaxY { 424 | return CGRectGetHeight(self.bounds) - _puzzleSize.height; 425 | } 426 | 427 | // Puzzle shadow 428 | 429 | - (void)setPuzzleShadowColor:(UIColor *)puzzleShadowColor { 430 | _puzzleShadowColor = puzzleShadowColor; 431 | _puzzleImageContainerView.layer.shadowColor = puzzleShadowColor.CGColor; 432 | } 433 | 434 | - (void)setPuzzleShadowRadius:(CGFloat)puzzleShadowRadius { 435 | _puzzleShadowRadius = puzzleShadowRadius; 436 | _puzzleImageContainerView.layer.shadowRadius = puzzleShadowRadius; 437 | } 438 | 439 | - (void)setPuzzleShadowOpacity:(CGFloat)puzzleShadowOpacity { 440 | _puzzleShadowOpacity = puzzleShadowOpacity; 441 | _puzzleImageContainerView.layer.shadowOpacity = puzzleShadowOpacity; 442 | } 443 | 444 | - (void)setPuzzleShadowOffset:(CGSize)puzzleShadowOffset { 445 | _puzzleShadowOffset = puzzleShadowOffset; 446 | _puzzleImageContainerView.layer.shadowOffset = puzzleShadowOffset; 447 | } 448 | 449 | // Puzzle blank alpha 450 | 451 | - (void)setPuzzleBlankAlpha:(CGFloat)puzzleBlankAlpha { 452 | _puzzleBlankAlpha = puzzleBlankAlpha; 453 | _backImageView.alpha = puzzleBlankAlpha; 454 | } 455 | 456 | // Puzzle blank inner shadow 457 | 458 | - (void)setPuzzleBlankInnerShadowColor:(UIColor *)puzzleBlankInnerShadowColor { 459 | _puzzleBlankInnerShadowColor = puzzleBlankInnerShadowColor; 460 | _backInnerShadowLayer.shadowColor = puzzleBlankInnerShadowColor.CGColor; 461 | } 462 | 463 | - (void)setPuzzleBlankInnerShadowRadius:(CGFloat)puzzleBlankInnerShadowRadius { 464 | _puzzleBlankInnerShadowRadius = puzzleBlankInnerShadowRadius; 465 | _backInnerShadowLayer.shadowRadius = puzzleBlankInnerShadowRadius; 466 | } 467 | 468 | - (void)setPuzzleBlankInnerShadowOpacity:(CGFloat)puzzleBlankInnerShadowOpacity { 469 | _puzzleBlankInnerShadowOpacity = puzzleBlankInnerShadowOpacity; 470 | _backInnerShadowLayer.shadowOpacity = puzzleBlankInnerShadowOpacity; 471 | } 472 | 473 | - (void)setPuzzleBlankInnerShadowOffset:(CGSize)puzzleBlankInnerShadowOffset { 474 | _puzzleBlankInnerShadowOffset = puzzleBlankInnerShadowOffset; 475 | _backInnerShadowLayer.shadowOffset = puzzleBlankInnerShadowOffset; 476 | } 477 | 478 | @end 479 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj --------------------------------------------------------------------------------