├── Vanilla.ttf ├── Cubano-Regular.otf ├── HKTQCard ├── Assets.xcassets │ ├── Contents.json │ ├── CardBack │ │ ├── Contents.json │ │ ├── Card_Back_1.imageset │ │ │ ├── Card_Back_01.png │ │ │ └── Contents.json │ │ ├── Card_Back_2.imageset │ │ │ ├── Card_Back_02.png │ │ │ └── Contents.json │ │ ├── Card_Back_3.imageset │ │ │ ├── Card_Back_03.png │ │ │ └── Contents.json │ │ ├── Card_Back_4.imageset │ │ │ ├── Card_Back_04.png │ │ │ └── Contents.json │ │ ├── Card_Back_5.imageset │ │ │ ├── Card_Back_05.png │ │ │ └── Contents.json │ │ ├── Card_Back_6.imageset │ │ │ ├── Card_Back_06.png │ │ │ └── Contents.json │ │ ├── Card_Back_7.imageset │ │ │ ├── Card_Back_07.png │ │ │ └── Contents.json │ │ ├── Card_Back_8.imageset │ │ │ ├── Card_Back_08.png │ │ │ └── Contents.json │ │ ├── Card_Back_9.imageset │ │ │ ├── Card_Back_09.png │ │ │ └── Contents.json │ │ ├── Card_Back_10.imageset │ │ │ ├── Card_Back_10.png │ │ │ └── Contents.json │ │ ├── Card_Back_11.imageset │ │ │ ├── Card_Back_11.png │ │ │ └── Contents.json │ │ ├── Card_Back_12.imageset │ │ │ ├── Card_Back_12.png │ │ │ └── Contents.json │ │ ├── Card_Back_13.imageset │ │ │ ├── Card_Back_13.png │ │ │ └── Contents.json │ │ ├── Card_Back_14.imageset │ │ │ ├── Card_Back_14.png │ │ │ └── Contents.json │ │ ├── Card_Back_15.imageset │ │ │ ├── Card_Back_15.png │ │ │ └── Contents.json │ │ ├── Card_Back_16.imageset │ │ │ ├── Card_Back_16.png │ │ │ └── Contents.json │ │ ├── Card_Back_17.imageset │ │ │ ├── Card_Back_17.png │ │ │ └── Contents.json │ │ └── Card_Back_18.imageset │ │ │ ├── Card_Back_18.png │ │ │ └── Contents.json │ ├── CardFront │ │ ├── Contents.json │ │ ├── Gem_3.imageset │ │ │ ├── Float.png │ │ │ └── Contents.json │ │ ├── Gem_1.imageset │ │ │ ├── Anchor.png │ │ │ └── Contents.json │ │ ├── Gem_10.imageset │ │ │ ├── Gem_10.png │ │ │ └── Contents.json │ │ ├── Gem_11.imageset │ │ │ ├── Gem_11.png │ │ │ └── Contents.json │ │ ├── Gem_12.imageset │ │ │ ├── Gem_12.png │ │ │ └── Contents.json │ │ ├── Gem_4.imageset │ │ │ ├── Parrot.png │ │ │ └── Contents.json │ │ ├── Gem_5.imageset │ │ │ ├── Pirate Hat.png │ │ │ └── Contents.json │ │ ├── Gem_7.imageset │ │ │ ├── Ship Wheel.png │ │ │ └── Contents.json │ │ ├── Gem_8.imageset │ │ │ ├── Starfish.png │ │ │ └── Contents.json │ │ ├── Gem_9.imageset │ │ │ ├── Telescope.png │ │ │ └── Contents.json │ │ ├── Gem_2.imageset │ │ │ ├── Coconut Tree.png │ │ │ └── Contents.json │ │ └── Gem_6.imageset │ │ │ ├── Pirate Hook.png │ │ │ └── Contents.json │ ├── cloud.imageset │ │ ├── cloud.png │ │ └── Contents.json │ ├── tqbg.imageset │ │ ├── lawreybg.png │ │ └── Contents.json │ ├── Boy Pirate.imageset │ │ ├── Boy Pirate.png │ │ └── Contents.json │ ├── tqsplashpng.imageset │ │ ├── tqsplashpng.png │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-57x57@1x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ ├── Icon-App-83.5x83.5@2x.png │ │ └── Contents.json │ └── LaunchImage.launchimage │ │ ├── tqsplashpng-2.png │ │ ├── tqsplashpng-3.png │ │ └── Contents.json ├── LawreyMCGame-Bridging-Header.h ├── PlayerScore.swift ├── Array+Shuffle.swift ├── Card.swift ├── FCGameCardCollectionViewCell.xib ├── Info.plist ├── AppDelegate.swift ├── FCGameCardCollectionViewCell.swift ├── CNPPopupController.h ├── Device.swift ├── CMCardDealerManager.swift ├── Main.storyboard ├── FCGameBoardCollectionViewController.swift └── CNPPopupController.m ├── LawreyMCGame.xcodeproj ├── project.xcworkspace │ ├── xcuserdata │ │ └── Lawrey.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── contents.xcworkspacedata ├── xcuserdata │ └── Lawrey.xcuserdatad │ │ ├── xcschemes │ │ ├── xcschememanagement.plist │ │ └── LawreyMCGame.xcscheme │ │ └── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist └── project.pbxproj ├── Assets.xcassets └── AppIcon.appiconset │ └── Contents.json ├── LICENSE.txt └── README.md /Vanilla.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/Vanilla.ttf -------------------------------------------------------------------------------- /Cubano-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/Cubano-Regular.otf -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/cloud.imageset/cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/cloud.imageset/cloud.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/tqbg.imageset/lawreybg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/tqbg.imageset/lawreybg.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/Boy Pirate.imageset/Boy Pirate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/Boy Pirate.imageset/Boy Pirate.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_3.imageset/Float.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_3.imageset/Float.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_1.imageset/Anchor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_1.imageset/Anchor.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_10.imageset/Gem_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_10.imageset/Gem_10.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_11.imageset/Gem_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_11.imageset/Gem_11.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_12.imageset/Gem_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_12.imageset/Gem_12.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_4.imageset/Parrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_4.imageset/Parrot.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/tqsplashpng.imageset/tqsplashpng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/tqsplashpng.imageset/tqsplashpng.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_5.imageset/Pirate Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_5.imageset/Pirate Hat.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_7.imageset/Ship Wheel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_7.imageset/Ship Wheel.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_8.imageset/Starfish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_8.imageset/Starfish.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_9.imageset/Telescope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_9.imageset/Telescope.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_2.imageset/Coconut Tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_2.imageset/Coconut Tree.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_6.imageset/Pirate Hook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardFront/Gem_6.imageset/Pirate Hook.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/LaunchImage.launchimage/tqsplashpng-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/LaunchImage.launchimage/tqsplashpng-2.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/LaunchImage.launchimage/tqsplashpng-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/LaunchImage.launchimage/tqsplashpng-3.png -------------------------------------------------------------------------------- /HKTQCard/LawreyMCGame-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import "CNPPopupController.h" 6 | -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_1.imageset/Card_Back_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_1.imageset/Card_Back_01.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_2.imageset/Card_Back_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_2.imageset/Card_Back_02.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_3.imageset/Card_Back_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_3.imageset/Card_Back_03.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_4.imageset/Card_Back_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_4.imageset/Card_Back_04.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_5.imageset/Card_Back_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_5.imageset/Card_Back_05.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_6.imageset/Card_Back_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_6.imageset/Card_Back_06.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_7.imageset/Card_Back_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_7.imageset/Card_Back_07.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_8.imageset/Card_Back_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_8.imageset/Card_Back_08.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_9.imageset/Card_Back_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_9.imageset/Card_Back_09.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_10.imageset/Card_Back_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_10.imageset/Card_Back_10.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_11.imageset/Card_Back_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_11.imageset/Card_Back_11.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_12.imageset/Card_Back_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_12.imageset/Card_Back_12.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_13.imageset/Card_Back_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_13.imageset/Card_Back_13.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_14.imageset/Card_Back_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_14.imageset/Card_Back_14.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_15.imageset/Card_Back_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_15.imageset/Card_Back_15.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_16.imageset/Card_Back_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_16.imageset/Card_Back_16.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_17.imageset/Card_Back_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_17.imageset/Card_Back_17.png -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_18.imageset/Card_Back_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/HKTQCard/Assets.xcassets/CardBack/Card_Back_18.imageset/Card_Back_18.png -------------------------------------------------------------------------------- /LawreyMCGame.xcodeproj/project.xcworkspace/xcuserdata/Lawrey.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lawreyios/ios-memorycardgame2/HEAD/LawreyMCGame.xcodeproj/project.xcworkspace/xcuserdata/Lawrey.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /LawreyMCGame.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/tqsplashpng.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "ipad", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "ipad", 9 | "filename" : "tqsplashpng.png", 10 | "scale" : "2x" 11 | } 12 | ], 13 | "info" : { 14 | "version" : 1, 15 | "author" : "xcode" 16 | } 17 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/cloud.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cloud.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/tqbg.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "lawreybg.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/Boy Pirate.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Boy Pirate.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Anchor.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Gem_10.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_11.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Gem_11.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_12.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Gem_12.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Float.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Parrot.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Coconut Tree.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Pirate Hat.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Pirate Hook.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Ship Wheel.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Starfish.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardFront/Gem_9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Telescope.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_01.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_02.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_03.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_04.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_05.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_06.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_07.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_08.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_09.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_10.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_11.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_11.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_12.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_12.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_13.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_13.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_14.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_14.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_15.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_15.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_16.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_16.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_17.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_17.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/CardBack/Card_Back_18.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Card_Back_18.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HKTQCard/PlayerScore.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlayerScore.swift 3 | // ColourMemory 4 | // 5 | // Created by 2359 Lawrence on 16/5/16. 6 | // Copyright © 2016 Lawrence Tan. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct PlayerScore { 12 | 13 | var name : String? = "" 14 | var score : Int? = 0 15 | 16 | init(name: String, score: Int){ 17 | 18 | self.name = name 19 | self.score = score 20 | 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /HKTQCard/Array+Shuffle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Array+Shuffle.swift 3 | // ColourMemory 4 | // 5 | // Created by Lawrence Tan on 16/5/16. 6 | // Copyright © 2016 Lawrence Tan. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension Array 12 | { 13 | /** Randomizes the order of an array's elements. */ 14 | mutating func shuffle() 15 | { 16 | for _ in 0..<8 17 | { 18 | sort { (_,_) in arc4random() < arc4random() } 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /LawreyMCGame.xcodeproj/xcuserdata/Lawrey.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | LawreyMCGame.xcscheme 8 | 9 | orderHint 10 | 1 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | ABDD9DA31DA17453008B25F8 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /HKTQCard/Card.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Card.swift 3 | // ColourMemory 4 | // 5 | // Created by Lawrence Tan on 15/5/16. 6 | // Copyright © 2016 Lawrence Tan. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | let kCardBgImageName = "cardBack" 12 | 13 | struct Card { 14 | 15 | var cardId: Int = -1 16 | var imageBack : String = "" 17 | var imageFront : String = "" 18 | var value : Int = 0 19 | var flipped : Bool = false 20 | 21 | init(valueFront: Int, valueBack: Int){ 22 | 23 | self.imageFront = "Gem_\(valueFront)" 24 | self.imageBack = "Card_Back_\(valueBack)" 25 | 26 | self.value = valueFront 27 | 28 | self.flipped = false 29 | 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "landscape", 5 | "idiom" : "ipad", 6 | "extent" : "full-screen", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "orientation" : "landscape", 11 | "idiom" : "ipad", 12 | "filename" : "tqsplashpng-3.png", 13 | "extent" : "full-screen", 14 | "scale" : "2x" 15 | }, 16 | { 17 | "orientation" : "landscape", 18 | "idiom" : "ipad", 19 | "extent" : "full-screen", 20 | "minimum-system-version" : "7.0", 21 | "scale" : "1x" 22 | }, 23 | { 24 | "orientation" : "landscape", 25 | "idiom" : "ipad", 26 | "filename" : "tqsplashpng-2.png", 27 | "extent" : "full-screen", 28 | "minimum-system-version" : "7.0", 29 | "scale" : "2x" 30 | } 31 | ], 32 | "info" : { 33 | "version" : 1, 34 | "author" : "xcode" 35 | } 36 | } -------------------------------------------------------------------------------- /Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "ipad", 5 | "size" : "20x20", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "ipad", 10 | "size" : "20x20", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "ipad", 15 | "size" : "29x29", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "ipad", 20 | "size" : "29x29", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "ipad", 25 | "size" : "40x40", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "ipad", 30 | "size" : "40x40", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "76x76", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "76x76", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "83.5x83.5", 46 | "scale" : "2x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Lawrence Tan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /HKTQCard/FCGameCardCollectionViewCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /HKTQCard/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIcons 10 | 11 | CFBundleIcons~ipad 12 | 13 | CFBundleIdentifier 14 | $(PRODUCT_BUNDLE_IDENTIFIER) 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | $(PRODUCT_NAME) 19 | CFBundlePackageType 20 | APPL 21 | CFBundleShortVersionString 22 | 1.0 23 | CFBundleVersion 24 | 8 25 | Fabric 26 | 27 | APIKey 28 | ccecd894afb473edc8152a03eea12a134cb9e970 29 | Kits 30 | 31 | 32 | KitInfo 33 | 34 | KitName 35 | Crashlytics 36 | 37 | 38 | 39 | LSRequiresIPhoneOS 40 | 41 | UIAppFonts 42 | 43 | Cubano-Regular.otf 44 | Vanilla.ttf 45 | 46 | UIMainStoryboardFile 47 | Main 48 | UIRequiredDeviceCapabilities 49 | 50 | armv7 51 | 52 | UIStatusBarHidden~ipad 53 | 54 | UISupportedInterfaceOrientations 55 | 56 | UIInterfaceOrientationLandscapeLeft 57 | 58 | UISupportedInterfaceOrientations~ipad 59 | 60 | UIInterfaceOrientationLandscapeLeft 61 | 62 | UIViewControllerBasedStatusBarAppearance 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /HKTQCard/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // HKTQCard 4 | // 5 | // Created by Lawrence Tan on 3/10/16. 6 | // Copyright © 2016 2359 Media Pte Ltd. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | 20 | return true 21 | } 22 | 23 | func applicationWillResignActive(_ application: UIApplication) { 24 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 25 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 26 | } 27 | 28 | func applicationDidEnterBackground(_ application: UIApplication) { 29 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 31 | } 32 | 33 | func applicationWillEnterForeground(_ application: UIApplication) { 34 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 35 | } 36 | 37 | func applicationDidBecomeActive(_ application: UIApplication) { 38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 39 | } 40 | 41 | func applicationWillTerminate(_ application: UIApplication) { 42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 43 | } 44 | 45 | 46 | } 47 | 48 | -------------------------------------------------------------------------------- /HKTQCard/FCGameCardCollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FCGameCardCollectionViewCell.swift 3 | // FlipCollectionViewCell 4 | // 5 | // Created by Lawrence Tan on 1/10/16. 6 | // Copyright © 2016 2359 Media Pte Ltd. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class FCGameCardCollectionViewCell: UICollectionViewCell { 12 | 13 | let kCardBackTag: Int = 0 14 | let kCardFrontTag: Int = 1 15 | 16 | var cardViews : (frontView: UIImageView, backView: UIImageView)? 17 | 18 | var imgViewFront: UIImageView! 19 | var imgViewBack: UIImageView! 20 | 21 | override func awakeFromNib() { 22 | imgViewFront = self.createCardViewWithImage(imageName: "", tag: self.kCardFrontTag) 23 | imgViewFront.layer.cornerRadius = 2.5 24 | imgViewFront.layer.borderWidth = 5.0 25 | imgViewFront.layer.borderColor = UIColor.black.cgColor 26 | imgViewFront.clipsToBounds = true 27 | imgViewBack = self.createCardViewWithImage(imageName: "", tag: self.kCardBackTag) 28 | imgViewBack.layer.cornerRadius = 2.5 29 | imgViewBack.layer.borderWidth = 5.0 30 | imgViewBack.layer.borderColor = UIColor.white.cgColor 31 | imgViewBack.clipsToBounds = true 32 | cardViews = (frontView: imgViewFront, backView: imgViewBack) 33 | contentView.addSubview(imgViewBack) 34 | } 35 | 36 | func setCardCell(card: Card) { 37 | imgViewFront.image = UIImage(named: card.imageFront) 38 | imgViewBack.image = UIImage(named: card.imageBack) 39 | } 40 | 41 | func flipCardAnimation(indexPath: IndexPath) { 42 | 43 | if (imgViewBack.superview != nil) { 44 | cardViews = (frontView: imgViewFront, backView: imgViewBack) 45 | }else{ 46 | cardViews = (frontView: imgViewBack, backView: imgViewFront) 47 | } 48 | 49 | let transitionOptions = UIViewAnimationOptions.transitionFlipFromLeft 50 | 51 | UIView.transition(with: self.contentView, duration: 0.5, options: transitionOptions, animations: { 52 | 53 | self.cardViews!.backView.removeFromSuperview() 54 | 55 | self.contentView.addSubview(self.cardViews!.frontView) 56 | 57 | }, completion: { finished in 58 | print(indexPath) 59 | }) 60 | 61 | } 62 | 63 | private func createCardViewWithImage(imageName: String, tag: Int) -> UIImageView { 64 | let newCardImageView = UIImageView(frame: self.frame) 65 | newCardImageView.image = UIImage(named: imageName) 66 | newCardImageView.contentMode = .scaleAspectFill 67 | newCardImageView.tag = tag 68 | return newCardImageView 69 | } 70 | 71 | 72 | } 73 | -------------------------------------------------------------------------------- /LawreyMCGame.xcodeproj/xcuserdata/Lawrey.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 20 | 21 | 22 | 24 | 36 | 37 | 38 | 40 | 52 | 53 | 54 | 56 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /HKTQCard/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "57x57", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-57x57@1x.png", 49 | "scale" : "1x" 50 | }, 51 | { 52 | "idiom" : "iphone", 53 | "size" : "57x57", 54 | "scale" : "2x" 55 | }, 56 | { 57 | "size" : "60x60", 58 | "idiom" : "iphone", 59 | "filename" : "Icon-App-60x60@2x.png", 60 | "scale" : "2x" 61 | }, 62 | { 63 | "size" : "60x60", 64 | "idiom" : "iphone", 65 | "filename" : "Icon-App-60x60@3x.png", 66 | "scale" : "3x" 67 | }, 68 | { 69 | "size" : "20x20", 70 | "idiom" : "ipad", 71 | "filename" : "Icon-App-20x20@1x.png", 72 | "scale" : "1x" 73 | }, 74 | { 75 | "size" : "20x20", 76 | "idiom" : "ipad", 77 | "filename" : "Icon-App-20x20@2x.png", 78 | "scale" : "2x" 79 | }, 80 | { 81 | "size" : "29x29", 82 | "idiom" : "ipad", 83 | "filename" : "Icon-App-29x29@1x.png", 84 | "scale" : "1x" 85 | }, 86 | { 87 | "size" : "29x29", 88 | "idiom" : "ipad", 89 | "filename" : "Icon-App-29x29@2x.png", 90 | "scale" : "2x" 91 | }, 92 | { 93 | "size" : "40x40", 94 | "idiom" : "ipad", 95 | "filename" : "Icon-App-40x40@1x.png", 96 | "scale" : "1x" 97 | }, 98 | { 99 | "size" : "40x40", 100 | "idiom" : "ipad", 101 | "filename" : "Icon-App-40x40@2x.png", 102 | "scale" : "2x" 103 | }, 104 | { 105 | "size" : "76x76", 106 | "idiom" : "ipad", 107 | "filename" : "Icon-App-76x76@1x.png", 108 | "scale" : "1x" 109 | }, 110 | { 111 | "size" : "76x76", 112 | "idiom" : "ipad", 113 | "filename" : "Icon-App-76x76@2x.png", 114 | "scale" : "2x" 115 | }, 116 | { 117 | "size" : "83.5x83.5", 118 | "idiom" : "ipad", 119 | "filename" : "Icon-App-83.5x83.5@2x.png", 120 | "scale" : "2x" 121 | } 122 | ], 123 | "info" : { 124 | "version" : 1, 125 | "author" : "xcode" 126 | } 127 | } -------------------------------------------------------------------------------- /LawreyMCGame.xcodeproj/xcuserdata/Lawrey.xcuserdatad/xcschemes/LawreyMCGame.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /HKTQCard/CNPPopupController.h: -------------------------------------------------------------------------------- 1 | // 2 | // CNPPopupController.h 3 | // CNPPopupController 4 | // 5 | // Created by Carson Perrotti on 2014-09-28. 6 | // Copyright (c) 2014 Carson Perrotti. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol CNPPopupControllerDelegate; 12 | @class CNPPopupTheme, CNPPopupButton; 13 | 14 | @interface CNPPopupController : NSObject 15 | 16 | @property (nonatomic, strong) CNPPopupTheme *_Nonnull theme; 17 | @property (nonatomic, weak) id _Nullable delegate; 18 | 19 | - (nonnull instancetype) init __attribute__((unavailable("You cannot initialize through init - please use initWithContents:"))); 20 | - (nonnull instancetype)initWithContents:(nonnull NSArray *)contents NS_DESIGNATED_INITIALIZER; 21 | 22 | - (void)presentPopupControllerAnimated:(BOOL)flag; 23 | - (void)dismissPopupControllerAnimated:(BOOL)flag; 24 | 25 | @end 26 | 27 | @protocol CNPPopupControllerDelegate 28 | 29 | @optional 30 | - (void)popupControllerWillPresent:(nonnull CNPPopupController *)controller; 31 | - (void)popupControllerDidPresent:(nonnull CNPPopupController *)controller; 32 | - (void)popupControllerWillDismiss:(nonnull CNPPopupController *)controller; 33 | - (void)popupControllerDidDismiss:(nonnull CNPPopupController *)controller; 34 | 35 | @end 36 | 37 | typedef void(^SelectionHandler) (CNPPopupButton *_Nonnull button); 38 | 39 | @interface CNPPopupButton : UIButton 40 | 41 | @property (nonatomic, copy) SelectionHandler _Nullable selectionHandler; 42 | 43 | @end 44 | 45 | // CNPPopupStyle: Controls how the popup looks once presented 46 | typedef NS_ENUM(NSUInteger, CNPPopupStyle) { 47 | CNPPopupStyleActionSheet = 0, // Displays the popup similar to an action sheet from the bottom. 48 | CNPPopupStyleCentered, // Displays the popup in the center of the screen. 49 | CNPPopupStyleFullscreen // Displays the popup similar to a fullscreen viewcontroller. 50 | }; 51 | 52 | // CNPPopupPresentationStyle: Controls how the popup is presented 53 | typedef NS_ENUM(NSInteger, CNPPopupPresentationStyle) { 54 | CNPPopupPresentationStyleFadeIn = 0, 55 | CNPPopupPresentationStyleSlideInFromTop, 56 | CNPPopupPresentationStyleSlideInFromBottom, 57 | CNPPopupPresentationStyleSlideInFromLeft, 58 | CNPPopupPresentationStyleSlideInFromRight 59 | }; 60 | 61 | // CNPPopupMaskType 62 | typedef NS_ENUM(NSInteger, CNPPopupMaskType) { 63 | CNPPopupMaskTypeClear, 64 | CNPPopupMaskTypeDimmed 65 | }; 66 | 67 | NS_ASSUME_NONNULL_BEGIN 68 | @interface CNPPopupTheme : NSObject 69 | 70 | @property (nonatomic, strong) UIColor *backgroundColor; // Background color of the popup content view (Default white) 71 | @property (nonatomic, assign) CGFloat cornerRadius; // Corner radius of the popup content view (Default 4.0) 72 | @property (nonatomic, assign) UIEdgeInsets popupContentInsets; // Inset of labels, images and buttons on the popup content view (Default 16.0 on all sides) 73 | @property (nonatomic, assign) CNPPopupStyle popupStyle; // How the popup looks once presented (Default centered) 74 | @property (nonatomic, assign) CNPPopupPresentationStyle presentationStyle; // How the popup is presented (Defauly slide in from bottom. NOTE: Only applicable to CNPPopupStyleCentered) 75 | @property (nonatomic, assign) CNPPopupMaskType maskType; // Backgound mask of the popup (Default dimmed) 76 | @property (nonatomic, assign) BOOL dismissesOppositeDirection; // If presented from a direction, should it dismiss in the opposite? (Defaults to NO. i.e. Goes back the way it came in) 77 | @property (nonatomic, assign) BOOL shouldDismissOnBackgroundTouch; // Popup should dismiss on tapping on background mask (Default yes) 78 | @property (nonatomic, assign) BOOL movesAboveKeyboard; // Popup should move up when the keyboard appears (Default yes) 79 | @property (nonatomic, assign) CGFloat contentVerticalPadding; // Spacing between each vertical element (Default 12.0) 80 | @property (nonatomic, assign) CGFloat maxPopupWidth; // Maxiumum width that the popup should be (Default 300) 81 | @property (nonatomic, assign) CGFloat animationDuration; // Duration of presentation animations (Default 0.3s) 82 | 83 | // Factory method to help build a default theme 84 | + (CNPPopupTheme *)defaultTheme; 85 | 86 | @end 87 | NS_ASSUME_NONNULL_END 88 | -------------------------------------------------------------------------------- /HKTQCard/Device.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Device.swift 3 | // MySingTel 4 | // 5 | // Created by 2359 Lawrence on 4/1/16. 6 | // 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | @objc class Device: NSObject { 13 | 14 | // MARK: Singletons 15 | 16 | static var TheCurrentDevice: UIDevice { 17 | struct Singleton { 18 | static let device = UIDevice.current 19 | } 20 | return Singleton.device 21 | } 22 | 23 | static var TheCurrentDeviceHeight: CGFloat { 24 | struct Singleton { 25 | static let height = UIScreen.main.bounds.size.height 26 | } 27 | return Singleton.height 28 | } 29 | 30 | static var FontSizeToIncreaseBy: CGFloat { 31 | if self.IS_4_7_INCHES(){ 32 | return 1 33 | }else if self.IS_5_5_INCHES_OR_LARGER(){ 34 | return 2 35 | }else{ 36 | return 0 37 | } 38 | } 39 | 40 | // MARK: iOS version 41 | 42 | static func IS_IOS8_OR_ABOVE() -> Bool { 43 | let result = (UIDevice.current.systemVersion as NSString).compare("8.0", options: NSString.CompareOptions.numeric) != ComparisonResult.orderedAscending 44 | return result 45 | } 46 | 47 | // MARK: - Device Size Checks 48 | 49 | enum Heights: CGFloat { 50 | case Inches_3_5 = 480 51 | case Inches_4 = 568 52 | case Inches_4_7 = 667 53 | case Inches_5_5 = 736 54 | } 55 | 56 | static func isSize(height: Heights) -> Bool { 57 | return TheCurrentDeviceHeight == height.rawValue 58 | } 59 | 60 | static func isSizeOrLarger(height: Heights) -> Bool { 61 | return TheCurrentDeviceHeight >= height.rawValue 62 | } 63 | 64 | static func isSizeOrSmaller(height: Heights) -> Bool { 65 | return TheCurrentDeviceHeight <= height.rawValue 66 | } 67 | 68 | static var CURRENT_SIZE: String { 69 | if IS_3_5_INCHES() { 70 | return "3.5 Inches" 71 | } else if IS_4_INCHES() { 72 | return "4 Inches" 73 | } else if IS_4_7_INCHES() { 74 | return "4.7 Inches" 75 | } else if IS_5_5_INCHES() { 76 | return "5.5 Inches" 77 | } 78 | return "\(TheCurrentDeviceHeight) Points" 79 | } 80 | 81 | // MARK: Retina Check 82 | 83 | static func IS_RETINA() -> Bool { 84 | return UIScreen.main.responds(to: #selector(NSDecimalNumberBehaviors.scale)) 85 | } 86 | 87 | static func isPhone() -> Bool { 88 | return TheCurrentDevice.userInterfaceIdiom == .phone 89 | } 90 | 91 | // MARK: 3.5 Inch Checks 92 | 93 | static func IS_3_5_INCHES() -> Bool { 94 | return isPhone() && isSize(height: .Inches_3_5) 95 | } 96 | 97 | static func IS_3_5_INCHES_OR_LARGER() -> Bool { 98 | return isPhone() && isSizeOrLarger(height: .Inches_3_5) 99 | } 100 | 101 | static func IS_3_5_INCHES_OR_SMALLER() -> Bool { 102 | return isPhone() && isSizeOrSmaller(height: .Inches_3_5) 103 | } 104 | 105 | // MARK: 4 Inch Checks 106 | 107 | static func IS_4_INCHES() -> Bool { 108 | return isPhone() && isSize(height: .Inches_4) 109 | } 110 | 111 | static func IS_4_INCHES_OR_LARGER() -> Bool { 112 | return isPhone() && isSizeOrLarger(height: .Inches_4) 113 | } 114 | 115 | static func IS_4_INCHES_OR_SMALLER() -> Bool { 116 | return isPhone() && isSizeOrSmaller(height: .Inches_4) 117 | } 118 | 119 | // MARK: 4.7 Inch Checks 120 | 121 | static func IS_4_7_INCHES() -> Bool { 122 | return isPhone() && isSize(height: .Inches_4_7) 123 | } 124 | 125 | static func IS_4_7_INCHES_OR_LARGER() -> Bool { 126 | return isPhone() && isSizeOrLarger(height: .Inches_4_7) 127 | } 128 | 129 | static func IS_4_7_INCHES_OR_SMALLER() -> Bool { 130 | return isPhone() && isSizeOrLarger(height: .Inches_4_7) 131 | } 132 | 133 | // MARK: 5.5 Inch Checks 134 | 135 | static func IS_5_5_INCHES() -> Bool { 136 | return isPhone() && isSize(height: .Inches_5_5) 137 | } 138 | 139 | static func IS_5_5_INCHES_OR_LARGER() -> Bool { 140 | return isPhone() && isSizeOrLarger(height: .Inches_5_5) 141 | } 142 | 143 | static func IS_5_5_INCHES_OR_SMALLER() -> Bool { 144 | return isPhone() && isSizeOrLarger(height: .Inches_5_5) 145 | } 146 | 147 | func changeLabelFontSize (label: UILabel, size: CGFloat) -> UIFont { 148 | let font: UIFont = UIFont(name: label.font.fontName, size: size)! 149 | return font 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /HKTQCard/CMCardDealerManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CMCardDealerManager.swift 3 | // ColourMemory 4 | // 5 | // Created by 2359 Lawrence on 16/5/16. 6 | // Copyright © 2016 Lawrence Tan. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | //Notifications 12 | let kMisMatchNotificationName = "MisMatchedNotification" 13 | let kMatchNotificationName = "MatchedNotification" 14 | let kGameEndNotificationName = "GameEndNotification" 15 | 16 | let kMaxPair = 9 17 | let kDelayTimeInSeconds = Double(1) 18 | let kCorrectPoints = 2 19 | let kIncorrectPoints = -1 20 | 21 | class CMCardDealerManager { 22 | 23 | //Card Cards Result 24 | var result = 0 25 | 26 | //Current Game Variables 27 | var currentActiveDeck = [Card]() 28 | var currentActiveChosenCards = [Card]() 29 | var currentActiveChosenCardsIdx = [IndexPath]() 30 | var flippedCards = [IndexPath]() 31 | 32 | var currentScore = 0 33 | var currentPairsFlipped = 0 34 | 35 | static let singleton = CMCardDealerManager() 36 | 37 | class func sharedInstance() -> CMCardDealerManager { 38 | return singleton 39 | } 40 | 41 | func createDeckOfCards() { 42 | 43 | currentScore = 0 44 | currentActiveDeck.removeAll() 45 | currentActiveChosenCards.removeAll() 46 | currentActiveChosenCardsIdx.removeAll() 47 | flippedCards.removeAll() 48 | 49 | var totalCards = kMaxPair * 2 50 | var gemCardCounter = 1 51 | var backCardCounter = 1 52 | 53 | while(totalCards>0){ 54 | 55 | var newCard1 = Card(valueFront: gemCardCounter, valueBack: backCardCounter) 56 | newCard1.cardId = backCardCounter 57 | currentActiveDeck.append(newCard1) 58 | backCardCounter+=1 59 | 60 | var newCard2 = Card(valueFront: gemCardCounter, valueBack: backCardCounter) 61 | newCard2.cardId = backCardCounter 62 | currentActiveDeck.append(newCard2) 63 | gemCardCounter+=1 64 | totalCards-=2 65 | } 66 | 67 | currentActiveDeck.shuffle() 68 | 69 | backCardCounter = 1 70 | for card in currentActiveDeck { 71 | var tempCard = card 72 | tempCard.imageBack = "Card_Back_\(backCardCounter)" 73 | tempCard.cardId = backCardCounter 74 | currentActiveDeck[backCardCounter-1] = tempCard 75 | backCardCounter += 1 76 | } 77 | 78 | } 79 | 80 | func selectCard(card: Card, indexPath: IndexPath) { 81 | if currentActiveChosenCards.count <= 1 { 82 | let chosenCard = card 83 | currentActiveChosenCards.append(chosenCard) 84 | currentActiveChosenCardsIdx.append(indexPath) 85 | flippedCards.append(indexPath) 86 | if currentActiveChosenCards.count == 2 { 87 | DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { 88 | // your function here 89 | self.checkCards() 90 | } 91 | 92 | } 93 | } 94 | } 95 | 96 | // Card Result : 97 | // 0 - First Card, Do Nothing, reload 98 | // 1 - Second Card, Matched, Score, reload 99 | // 2 - Second Card, MisMatch, Minus Score, reload 100 | // 3 - Last Pair, Game End 101 | 102 | private func checkCards() { 103 | let isMatched = checkIfMatch() 104 | if isMatched == true { 105 | currentActiveChosenCards.removeAll() 106 | currentActiveChosenCardsIdx.removeAll() 107 | currentScore += 1 108 | if currentScore == kMaxPair { 109 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kGameEndNotificationName), object: nil) 110 | }else{ 111 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kMatchNotificationName), object: nil) 112 | } 113 | }else{ 114 | let firstCard = currentActiveChosenCardsIdx[0] 115 | let secondCard = currentActiveChosenCardsIdx[1] 116 | flippedCards = flippedCards.filter({$0 != firstCard}) 117 | flippedCards = flippedCards.filter({$0 != secondCard}) 118 | currentActiveChosenCards.removeAll() 119 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kMisMatchNotificationName), object: nil) 120 | } 121 | } 122 | 123 | private func checkIfMatch() -> Bool { 124 | let firstCard = currentActiveChosenCards[0] 125 | let secondCard = currentActiveChosenCards[1] 126 | if firstCard.value == secondCard.value { 127 | return true 128 | } 129 | return false 130 | } 131 | 132 | } 133 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LawreyMemoryCardSwift 2 | 3 | ![](https://puu.sh/rV8qy/55d41e6658.gif) 4 | 5 | # Requirements 6 | Xcode 8.0+, Swift 3.0 7 | 8 | # Usage 9 | You may clone this entire project and run it in Xcode. 10 | 11 | # Purpose 12 | This mini game was developed to bring fun and excitement to a big group of children at a big children's day party. It is played on a big LED screen with Apple TV and it has stirred up the excitement of many children. The game was also built in a Treasure Quest Theme and I am sharing this project to help developers that are in similar situations as me, needed a game, to help you save time in reinventing the wheels. 13 | 14 | # How it works 15 | ## View 16 | ### FCGameBoardCollectionViewController 17 | 18 | This is the main view controller that controls the game board. These are the basic configurations of the game, total time in seconds and states of the game. 19 | 20 | ``` 21 | let kMaxTimeInSeconds: Int = 120 22 | 23 | enum GameState: NSInteger { 24 | case Playing 25 | case NotPlaying 26 | case GameEnd 27 | } 28 | ``` 29 | This part is where we call the tap of every card. While the game is ongoing, check if its the first or second card, based on each type of card, we apply flip animation and card selectCard function. 30 | 31 | ``` 32 | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 33 | if currentGameState == .NotPlaying { 34 | currentGameState = .Playing 35 | startTimer() 36 | btnReset.setTitle("Stop", for: .normal) 37 | } 38 | if !cardManager.currentActiveChosenCardsIdx.contains(indexPath) && !cardManager.flippedCards.contains(indexPath){ 39 | //showPopupWithStyle(.centered) 40 | let cell = collectionView.cellForItem(at: indexPath) as! FCGameCardCollectionViewCell 41 | let card = cardManager.currentActiveDeck[indexPath.row] 42 | if cardManager.currentActiveChosenCards.count <= 1 { 43 | if cardManager.currentActiveChosenCards.count == 1 { 44 | if cardManager.currentActiveChosenCards[0].cardId != card.cardId { 45 | cell.flipCardAnimation(indexPath: indexPath) 46 | cardManager.selectCard(card: card, indexPath: indexPath) 47 | } 48 | }else{ 49 | cell.flipCardAnimation(indexPath: indexPath) 50 | cardManager.selectCard(card: card, indexPath: indexPath) 51 | } 52 | } 53 | } 54 | } 55 | ``` 56 | ### FCGameCardCollectionViewCell 57 | This is the Collection View Cell for every single card 58 | 59 | ## Manager 60 | ### CMCardDealerManager 61 | This is the brain of the game. 62 | 63 | We set simple configurations here, MaxPair, DelayInSeconds after each card and points. 64 | ``` 65 | let kMaxPair = 9 66 | let kDelayTimeInSeconds = Double(1) 67 | let kCorrectPoints = 2 68 | let kIncorrectPoints = -1 69 | ``` 70 | Here we create a deck of randomly-ordered cards 71 | 72 | ``` 73 | func createDeckOfCards() { 74 | 75 | currentScore = 0 76 | currentActiveDeck.removeAll() 77 | currentActiveChosenCards.removeAll() 78 | currentActiveChosenCardsIdx.removeAll() 79 | flippedCards.removeAll() 80 | 81 | var totalCards = kMaxPair * 2 82 | var gemCardCounter = 1 83 | var backCardCounter = 1 84 | 85 | while(totalCards>0){ 86 | 87 | var newCard1 = Card(valueFront: gemCardCounter, valueBack: backCardCounter) 88 | newCard1.cardId = backCardCounter 89 | currentActiveDeck.append(newCard1) 90 | backCardCounter+=1 91 | 92 | var newCard2 = Card(valueFront: gemCardCounter, valueBack: backCardCounter) 93 | newCard2.cardId = backCardCounter 94 | currentActiveDeck.append(newCard2) 95 | gemCardCounter+=1 96 | totalCards-=2 97 | } 98 | 99 | currentActiveDeck.shuffle() 100 | 101 | backCardCounter = 1 102 | for card in currentActiveDeck { 103 | var tempCard = card 104 | tempCard.imageBack = "Card_Back_\(backCardCounter)" 105 | tempCard.cardId = backCardCounter 106 | currentActiveDeck[backCardCounter-1] = tempCard 107 | backCardCounter += 1 108 | } 109 | 110 | } 111 | ``` 112 | Here we deal with a card that is being tapped 113 | 114 | ``` 115 | func selectCard(card: Card, indexPath: IndexPath) { 116 | if currentActiveChosenCards.count <= 1 { 117 | let chosenCard = card 118 | currentActiveChosenCards.append(chosenCard) 119 | currentActiveChosenCardsIdx.append(indexPath) 120 | flippedCards.append(indexPath) 121 | if currentActiveChosenCards.count == 2 { 122 | DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { 123 | // your function here 124 | self.checkCards() 125 | } 126 | 127 | } 128 | } 129 | } 130 | ``` 131 | 132 | Here we check compare 2 cards once there are 2 cards 133 | 134 | ``` 135 | // Card Result : 136 | // 0 - First Card, Do Nothing, reload 137 | // 1 - Second Card, Matched, Score, reload 138 | // 2 - Second Card, MisMatch, Minus Score, reload 139 | // 3 - Last Pair, Game End 140 | 141 | private func checkCards() { 142 | let isMatched = checkIfMatch() 143 | if isMatched == true { 144 | currentActiveChosenCards.removeAll() 145 | currentActiveChosenCardsIdx.removeAll() 146 | currentScore += 1 147 | if currentScore == kMaxPair { 148 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kGameEndNotificationName), object: nil) 149 | }else{ 150 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kMatchNotificationName), object: nil) 151 | } 152 | }else{ 153 | let firstCard = currentActiveChosenCardsIdx[0] 154 | let secondCard = currentActiveChosenCardsIdx[1] 155 | flippedCards = flippedCards.filter({$0 != firstCard}) 156 | flippedCards = flippedCards.filter({$0 != secondCard}) 157 | currentActiveChosenCards.removeAll() 158 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kMisMatchNotificationName), object: nil) 159 | } 160 | } 161 | 162 | private func checkIfMatch() -> Bool { 163 | let firstCard = currentActiveChosenCards[0] 164 | let secondCard = currentActiveChosenCards[1] 165 | if firstCard.value == secondCard.value { 166 | return true 167 | } 168 | return false 169 | } 170 | ``` 171 | 172 | ## CNPPopupController 173 | I also used this very interesting PopupController by CN to show the slide up dialog box as an end game interaction. 174 | 175 | # Release Notes 176 | Version 1.0 177 | * Only allow cards to be flipped if it is unflipped 178 | * Supports iPad only 179 | 180 | # Credits 181 | * Joanna C (Designer of the individual graphics) 182 | * Joanna S (Testing and conceptualizing it) 183 | 184 | # License 185 | MIT License 186 | 187 | Copyright (c) 2016 Lawrence Tan 188 | 189 | Permission is hereby granted, free of charge, to any person obtaining a copy 190 | of this software and associated documentation files (the "Software"), to deal 191 | in the Software without restriction, including without limitation the rights 192 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 193 | copies of the Software, and to permit persons to whom the Software is 194 | furnished to do so, subject to the following conditions: 195 | 196 | The above copyright notice and this permission notice shall be included in all 197 | copies or substantial portions of the Software. 198 | 199 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 200 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 201 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 202 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 203 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 204 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 205 | SOFTWARE. 206 | -------------------------------------------------------------------------------- /HKTQCard/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Cubano-Regular 12 | 13 | 14 | Vanilla 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 57 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /HKTQCard/FCGameBoardCollectionViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FCGameBoardCollectionViewController.swift 3 | // FlipCollectionViewCell 4 | // 5 | // Created by Lawrence Tan on 1/10/16. 6 | // Copyright © 2016 2359 Media Pte Ltd. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | private let reuseIdentifier = "FCGameCardCollectionViewCell" 12 | 13 | let kMaxTimeInSeconds: Int = 120 14 | 15 | enum GameState: NSInteger { 16 | 17 | case Playing 18 | case NotPlaying 19 | case GameEnd 20 | } 21 | 22 | class FCGameBoardCollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { 23 | 24 | var numberOfSeconds: Int = kMaxTimeInSeconds 25 | var timer: Timer? 26 | 27 | let formatter = DateFormatter() 28 | let calendar = Calendar.current 29 | let components: CFCalendarUnit = [.second, .minute] 30 | 31 | @IBOutlet weak var btnReset: UIButton! 32 | @IBOutlet weak var lblTimer: UILabel! 33 | @IBOutlet weak var bgImageView: UIImageView! 34 | @IBOutlet weak var collectionView: UICollectionView! 35 | 36 | var currentGameState: GameState = .NotPlaying 37 | let cardManager = CMCardDealerManager.sharedInstance() 38 | var popupController: CNPPopupController? 39 | 40 | var lblGameover: UILabel? 41 | 42 | override func viewDidLoad() { 43 | super.viewDidLoad() 44 | collectionView!.register(UINib(nibName: "FCGameCardCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: reuseIdentifier) 45 | NotificationCenter.default.addObserver(self, selector: #selector(self.onMisMatch), name: NSNotification.Name(rawValue: kMisMatchNotificationName), object: nil) 46 | NotificationCenter.default.addObserver(self, selector: #selector(self.onMatch), name: NSNotification.Name(rawValue: kMatchNotificationName), object: nil) 47 | NotificationCenter.default.addObserver(self, selector: #selector(self.onGameEnd), name: NSNotification.Name(rawValue: kGameEndNotificationName), object: nil) 48 | collectionView.backgroundColor = UIColor.clear 49 | btnReset.setTitle("Ready?", for: .normal) 50 | 51 | //243,108,46 52 | 53 | let strokeTextAttributes = [ 54 | NSStrokeColorAttributeName : UIColor.white, 55 | NSForegroundColorAttributeName : UIColor(colorLiteralRed: 243.0/255, green: 108/255, blue: 46/255, alpha: 1.0), 56 | NSStrokeWidthAttributeName : -8.0, 57 | ] as [String : Any] 58 | 59 | lblGameover = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 110)) 60 | lblGameover?.center = view.center 61 | lblGameover?.textAlignment = .center 62 | lblGameover?.font = UIFont(name: "Vanilla", size: 100) 63 | lblGameover?.text = "Game Over" 64 | lblGameover?.attributedText = NSAttributedString(string: "Game Over", attributes: strokeTextAttributes) 65 | lblGameover?.alpha = 0 66 | view.addSubview(lblGameover!) 67 | } 68 | 69 | override func viewWillAppear(_ animated: Bool) { 70 | super.viewWillAppear(animated) 71 | cardManager.createDeckOfCards() 72 | collectionView?.reloadData() 73 | } 74 | 75 | override var prefersStatusBarHidden: Bool { 76 | return true 77 | } 78 | 79 | // MARK: UICollectionViewDataSource 80 | 81 | func numberOfSections(in collectionView: UICollectionView) -> Int { 82 | return 1 83 | } 84 | 85 | 86 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 87 | return cardManager.currentActiveDeck.count 88 | } 89 | 90 | 91 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 92 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! FCGameCardCollectionViewCell 93 | let card = cardManager.currentActiveDeck[indexPath.row] 94 | cell.setCardCell(card: card) 95 | return cell 96 | } 97 | 98 | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 99 | if currentGameState == .NotPlaying { 100 | currentGameState = .Playing 101 | startTimer() 102 | btnReset.setTitle("Stop", for: .normal) 103 | } 104 | if !cardManager.currentActiveChosenCardsIdx.contains(indexPath) && !cardManager.flippedCards.contains(indexPath){ 105 | //showPopupWithStyle(.centered) 106 | let cell = collectionView.cellForItem(at: indexPath) as! FCGameCardCollectionViewCell 107 | let card = cardManager.currentActiveDeck[indexPath.row] 108 | if cardManager.currentActiveChosenCards.count <= 1 { 109 | if cardManager.currentActiveChosenCards.count == 1 { 110 | if cardManager.currentActiveChosenCards[0].cardId != card.cardId { 111 | cell.flipCardAnimation(indexPath: indexPath) 112 | cardManager.selectCard(card: card, indexPath: indexPath) 113 | } 114 | }else{ 115 | cell.flipCardAnimation(indexPath: indexPath) 116 | cardManager.selectCard(card: card, indexPath: indexPath) 117 | } 118 | } 119 | } 120 | } 121 | 122 | func onMatch() { 123 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 124 | // your function here 125 | self.popupController?.dismiss(animated: true) 126 | } 127 | } 128 | 129 | func onMisMatch() { 130 | for indexPath in cardManager.currentActiveChosenCardsIdx { 131 | let cell = collectionView?.cellForItem(at: indexPath) as! FCGameCardCollectionViewCell 132 | cell.flipCardAnimation(indexPath: indexPath) 133 | } 134 | cardManager.currentActiveChosenCardsIdx.removeAll() 135 | } 136 | 137 | @IBAction func onReset(_ sender: AnyObject) { 138 | if currentGameState == .Playing || currentGameState == .GameEnd { 139 | let alertView = UIAlertController(title: "Are you sure?", message: "Reset Game?", preferredStyle: .alert) 140 | let actionYes = UIAlertAction(title: "Yes", style: .default, handler: { (action) in 141 | for unflippedCard in self.cardManager.flippedCards { 142 | let cell = self.collectionView?.cellForItem(at: unflippedCard) as! FCGameCardCollectionViewCell 143 | cell.flipCardAnimation(indexPath: unflippedCard) 144 | } 145 | self.cardManager.createDeckOfCards() 146 | self.collectionView?.reloadData() 147 | self.currentGameState = .NotPlaying 148 | self.stopTimer() 149 | self.numberOfSeconds = kMaxTimeInSeconds 150 | self.btnReset.setTitle("Ready?", for: .normal) 151 | self.lblTimer.text = self.timeFormatted(totalSeconds: self.numberOfSeconds) 152 | UIView.animate(withDuration: 1) { 153 | self.lblGameover?.alpha = 0 154 | } 155 | self.collectionView.isUserInteractionEnabled = true 156 | }) 157 | let actionNo = UIAlertAction(title: "No", style: .cancel, handler: { (action) in 158 | 159 | }) 160 | alertView.addAction(actionYes) 161 | alertView.addAction(actionNo) 162 | present(alertView, animated: true, completion: nil) 163 | } 164 | } 165 | 166 | func showPopupWithStyle(_ popupStyle: CNPPopupStyle) { 167 | 168 | let paragraphStyle = NSMutableParagraphStyle() 169 | paragraphStyle.lineBreakMode = NSLineBreakMode.byWordWrapping 170 | paragraphStyle.alignment = NSTextAlignment.center 171 | 172 | let title = NSAttributedString(string: "Aye! Aye! You collected \(cardManager.currentScore) treasures in", attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 24), NSParagraphStyleAttributeName: paragraphStyle]) 173 | let lineOne = NSAttributedString(string: "\(kMaxTimeInSeconds-numberOfSeconds-1) seconds!", attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 36), NSParagraphStyleAttributeName: paragraphStyle]) 174 | 175 | 176 | let titleLabel = UILabel() 177 | titleLabel.numberOfLines = 0; 178 | titleLabel.attributedText = title 179 | titleLabel.font = UIFont(name: "Cubano-Regular", size: 22) 180 | 181 | let lineOneLabel = UILabel() 182 | lineOneLabel.numberOfLines = 0; 183 | lineOneLabel.attributedText = lineOne; 184 | lineOneLabel.font = UIFont(name: "Cubano-Regular", size: 36) 185 | 186 | let imageView = UIImageView.init(image: UIImage.init(named: "Boy Pirate")) 187 | imageView.frame = CGRect(x: 20, y: lineOneLabel.frame.origin.y+8, width: 132, height: 200) 188 | imageView.contentMode = .scaleAspectFit 189 | 190 | 191 | let popupController = CNPPopupController(contents:[titleLabel, lineOneLabel, imageView]) 192 | popupController.theme = CNPPopupTheme.default() 193 | popupController.theme.popupStyle = popupStyle 194 | popupController.delegate = self 195 | self.popupController = popupController 196 | popupController.present(animated: true) 197 | } 198 | 199 | // MARK: Timer 200 | 201 | func startTimer() { 202 | timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.updateTimer), userInfo: nil, repeats: true) 203 | } 204 | 205 | func stopTimer() { 206 | timer?.invalidate() 207 | } 208 | 209 | func updateTimer() { 210 | if numberOfSeconds >= 0 { 211 | lblTimer.text = timeFormatted(totalSeconds: numberOfSeconds) 212 | numberOfSeconds-=1 213 | }else{ 214 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: kGameEndNotificationName), object: nil) 215 | stopTimer() 216 | } 217 | } 218 | 219 | private func timeFormatted(totalSeconds: Int) -> String { 220 | let seconds: Int = totalSeconds % 60 221 | let minutes: Int = (totalSeconds / 60) % 60 222 | return String(format: "%02d:%02d", minutes, seconds) 223 | } 224 | 225 | func onGameEnd() { 226 | stopTimer() 227 | showPopupWithStyle(.centered) 228 | btnReset.setTitle("Reset", for: .normal) 229 | currentGameState = .GameEnd 230 | UIView.animate(withDuration: 1) { 231 | self.lblGameover?.alpha = 1 232 | } 233 | self.collectionView.isUserInteractionEnabled = false 234 | } 235 | } 236 | 237 | extension FCGameBoardCollectionViewController : CNPPopupControllerDelegate { 238 | 239 | func popupControllerWillDismiss(_ controller: CNPPopupController) { 240 | print("Popup controller will be dismissed") 241 | } 242 | 243 | func popupControllerDidPresent(_ controller: CNPPopupController) { 244 | print("Popup controller presented") 245 | } 246 | 247 | } 248 | -------------------------------------------------------------------------------- /HKTQCard/CNPPopupController.m: -------------------------------------------------------------------------------- 1 | // 2 | // CNPPopupController.m 3 | // CNPPopupController 4 | // 5 | // Created by Carson Perrotti on 2014-09-28. 6 | // Copyright (c) 2014 Carson Perrotti. All rights reserved. 7 | // 8 | 9 | #import "CNPPopupController.h" 10 | 11 | #define CNP_SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending) 12 | #define CNP_IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 13 | 14 | static inline UIViewAnimationOptions UIViewAnimationCurveToAnimationOptions(UIViewAnimationCurve curve) 15 | { 16 | return curve << 16; 17 | } 18 | 19 | @interface CNPPopupController () 20 | 21 | @property (nonatomic, strong) UIWindow *applicationWindow; 22 | @property (nonatomic, strong) UIView *maskView; 23 | @property (nonatomic, strong) UITapGestureRecognizer *backgroundTapRecognizer; 24 | @property (nonatomic, strong) UIView *popupView; 25 | @property (nonatomic, strong) NSArray *views; 26 | @property (nonatomic) BOOL dismissAnimated; 27 | 28 | @end 29 | 30 | @implementation CNPPopupController 31 | 32 | 33 | - (instancetype)initWithContents:(NSArray *)contents { 34 | self = [super init]; 35 | if (self) { 36 | 37 | self.views = contents; 38 | 39 | self.popupView = [[UIView alloc] initWithFrame:CGRectZero]; 40 | self.popupView.backgroundColor = [UIColor whiteColor]; 41 | self.popupView.clipsToBounds = YES; 42 | 43 | self.maskView = [[UIView alloc] initWithFrame:self.applicationWindow.bounds]; 44 | self.maskView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.7]; 45 | self.backgroundTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleBackgroundTapGesture:)]; 46 | self.backgroundTapRecognizer.delegate = self; 47 | [self.maskView addGestureRecognizer:self.backgroundTapRecognizer]; 48 | [self.maskView addSubview:self.popupView]; 49 | 50 | self.theme = [CNPPopupTheme defaultTheme]; 51 | 52 | [self addPopupContents]; 53 | 54 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 55 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 56 | 57 | [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 58 | [[NSNotificationCenter defaultCenter] addObserver:self 59 | selector:@selector(orientationWillChange) 60 | name:UIApplicationWillChangeStatusBarOrientationNotification 61 | object:nil]; 62 | [[NSNotificationCenter defaultCenter] addObserver:self 63 | selector:@selector(orientationChanged) 64 | name:UIApplicationDidChangeStatusBarOrientationNotification 65 | object:nil]; 66 | } 67 | return self; 68 | } 69 | 70 | - (instancetype)init { 71 | self = [self initWithContents:@[]]; 72 | return self; 73 | } 74 | 75 | - (void)dealloc { 76 | [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 77 | [[NSNotificationCenter defaultCenter]removeObserver:self name:UIApplicationWillChangeStatusBarOrientationNotification object:nil]; 78 | [[NSNotificationCenter defaultCenter]removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; 79 | [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 80 | [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 81 | } 82 | 83 | - (void)orientationWillChange { 84 | 85 | [UIView animateWithDuration:self.theme.animationDuration animations:^{ 86 | self.maskView.frame = self.applicationWindow.bounds; 87 | self.popupView.center = [self endingPoint]; 88 | }]; 89 | } 90 | 91 | - (void)orientationChanged { 92 | 93 | UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation; 94 | CGFloat angle = CNP_UIInterfaceOrientationAngleOfOrientation(statusBarOrientation); 95 | CGAffineTransform transform = CGAffineTransformMakeRotation(angle); 96 | 97 | [UIView animateWithDuration:self.theme.animationDuration animations:^{ 98 | self.maskView.frame = self.applicationWindow.bounds; 99 | self.popupView.center = [self endingPoint]; 100 | if (CNP_SYSTEM_VERSION_LESS_THAN(@"8.0")) { 101 | self.popupView.transform = transform; 102 | } 103 | }]; 104 | } 105 | 106 | CGFloat CNP_UIInterfaceOrientationAngleOfOrientation(UIInterfaceOrientation orientation) 107 | { 108 | CGFloat angle; 109 | 110 | switch (orientation) 111 | { 112 | case UIInterfaceOrientationPortraitUpsideDown: 113 | angle = M_PI; 114 | break; 115 | case UIInterfaceOrientationLandscapeLeft: 116 | angle = -M_PI_2; 117 | break; 118 | case UIInterfaceOrientationLandscapeRight: 119 | angle = M_PI_2; 120 | break; 121 | default: 122 | angle = 0.0; 123 | break; 124 | } 125 | 126 | return angle; 127 | } 128 | 129 | 130 | #pragma mark - Theming 131 | 132 | - (void)applyTheme { 133 | if (self.theme.popupStyle == CNPPopupStyleFullscreen) { 134 | self.theme.presentationStyle = CNPPopupPresentationStyleFadeIn; 135 | } 136 | if (self.theme.popupStyle == CNPPopupStyleActionSheet) { 137 | self.theme.presentationStyle = CNPPopupPresentationStyleSlideInFromBottom; 138 | } 139 | self.popupView.layer.cornerRadius = self.theme.popupStyle == CNPPopupStyleCentered?self.theme.cornerRadius:0; 140 | self.popupView.backgroundColor = self.theme.backgroundColor; 141 | UIColor *maskBackgroundColor; 142 | if (self.theme.popupStyle == CNPPopupStyleFullscreen) { 143 | maskBackgroundColor = self.popupView.backgroundColor; 144 | } 145 | else { 146 | maskBackgroundColor = self.theme.maskType == CNPPopupMaskTypeClear?[UIColor clearColor] : [UIColor colorWithWhite:0.0 alpha:0.7]; 147 | } 148 | self.maskView.backgroundColor = maskBackgroundColor; 149 | } 150 | 151 | #pragma mark - Popup Building 152 | 153 | - (void)addPopupContents { 154 | for (UIView *view in self.views) 155 | { 156 | [self.popupView addSubview:view]; 157 | } 158 | } 159 | 160 | - (CGSize)calculateContentSizeThatFits:(CGSize)size andUpdateLayout:(BOOL)update 161 | { 162 | UIEdgeInsets inset = self.theme.popupContentInsets; 163 | size.width -= (inset.left + inset.right); 164 | size.height -= (inset.top + inset.bottom); 165 | 166 | CGSize result = CGSizeMake(0, inset.top); 167 | for (UIView *view in self.popupView.subviews) 168 | { 169 | view.autoresizingMask = UIViewAutoresizingNone; 170 | if (!view.hidden) 171 | { 172 | CGSize _size = view.frame.size; 173 | if (CGSizeEqualToSize(_size, CGSizeZero)) 174 | { 175 | _size = [view sizeThatFits:size]; 176 | _size.width = size.width; 177 | if (update) view.frame = CGRectMake(inset.left, result.height, _size.width, _size.height); 178 | } 179 | else { 180 | if (update) { 181 | view.frame = CGRectMake(0, result.height, _size.width, _size.height); 182 | } 183 | } 184 | result.height += _size.height + self.theme.contentVerticalPadding; 185 | result.width = MAX(result.width, _size.width); 186 | } 187 | } 188 | 189 | result.height -= self.theme.contentVerticalPadding; 190 | result.width += inset.left + inset.right; 191 | result.height = MIN(INFINITY, MAX(0.0f, result.height + inset.bottom)); 192 | if (update) { 193 | for (UIView *view in self.popupView.subviews) { 194 | view.frame = CGRectMake((result.width - view.frame.size.width) * 0.5, view.frame.origin.y, view.frame.size.width, view.frame.size.height); 195 | } 196 | self.popupView.frame = CGRectMake(0, 0, result.width, result.height); 197 | } 198 | return result; 199 | } 200 | 201 | - (CGSize)sizeThatFits:(CGSize)size 202 | { 203 | return [self calculateContentSizeThatFits:size andUpdateLayout:NO]; 204 | } 205 | 206 | #pragma mark - Keyboard 207 | 208 | - (void)keyboardWillShow:(NSNotification*)notification 209 | { 210 | if (self.theme.movesAboveKeyboard) { 211 | CGRect frame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; 212 | frame = [self.popupView convertRect:frame fromView:nil]; 213 | NSTimeInterval duration = [(notification.userInfo)[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 214 | UIViewAnimationCurve curve = [(notification.userInfo)[UIKeyboardAnimationCurveUserInfoKey] integerValue]; 215 | 216 | [self keyboardWithEndFrame:frame willShowAfterDuration:duration withOptions:UIViewAnimationCurveToAnimationOptions(curve)]; 217 | } 218 | } 219 | 220 | - (void)keyboardWithEndFrame:(CGRect)keyboardFrame willShowAfterDuration:(NSTimeInterval)duration withOptions:(UIViewAnimationOptions)options 221 | { 222 | CGRect popupViewIntersection = CGRectIntersection(self.popupView.frame, keyboardFrame); 223 | 224 | if (popupViewIntersection.size.height > 0) { 225 | CGRect maskViewIntersection = CGRectIntersection(self.maskView.frame, keyboardFrame); 226 | 227 | [UIView animateWithDuration:duration delay:0.0f options:options animations:^{ 228 | self.popupView.center = CGPointMake(self.popupView.center.x, (CGRectGetHeight(self.maskView.frame) - maskViewIntersection.size.height) / 2); 229 | } completion:nil]; 230 | } 231 | } 232 | 233 | - (void)keyboardWillHide:(NSNotification*)notification 234 | { 235 | if (self.theme.movesAboveKeyboard) { 236 | CGRect frame = [notification.userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue]; 237 | frame = [self.popupView convertRect:frame fromView:nil]; 238 | NSTimeInterval duration = [(notification.userInfo)[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 239 | UIViewAnimationCurve curve = [(notification.userInfo)[UIKeyboardAnimationCurveUserInfoKey] integerValue]; 240 | 241 | [self keyboardWithStartFrame:frame willHideAfterDuration:duration withOptions:UIViewAnimationCurveToAnimationOptions(curve)]; 242 | } 243 | } 244 | 245 | - (void)keyboardWithStartFrame:(CGRect)keyboardFrame willHideAfterDuration:(NSTimeInterval)duration withOptions:(UIViewAnimationOptions)options 246 | { 247 | [UIView animateWithDuration:duration delay:0.0f options:options animations:^{ 248 | self.popupView.center = [self endingPoint]; 249 | } completion:nil]; 250 | } 251 | 252 | #pragma mark - Presentation 253 | 254 | - (void)presentPopupControllerAnimated:(BOOL)flag { 255 | 256 | if ([self.delegate respondsToSelector:@selector(popupControllerWillPresent:)]) { 257 | [self.delegate popupControllerWillPresent:self]; 258 | } 259 | 260 | // Keep a record of if the popup was presented with animation 261 | self.dismissAnimated = flag; 262 | 263 | [self applyTheme]; 264 | [self calculateContentSizeThatFits:CGSizeMake([self popupWidth], self.maskView.bounds.size.height) andUpdateLayout:YES]; 265 | self.popupView.center = [self originPoint]; 266 | [self.applicationWindow addSubview:self.maskView]; 267 | self.maskView.alpha = 0; 268 | [UIView animateWithDuration:flag?self.theme.animationDuration:0.0 animations:^{ 269 | self.maskView.alpha = 1.0; 270 | self.popupView.center = [self endingPoint];; 271 | } completion:^(BOOL finished) { 272 | self.popupView.userInteractionEnabled = YES; 273 | if ([self.delegate respondsToSelector:@selector(popupControllerDidPresent:)]) { 274 | [self.delegate popupControllerDidPresent:self]; 275 | } 276 | }]; 277 | } 278 | 279 | - (void)dismissPopupControllerAnimated:(BOOL)flag { 280 | if ([self.delegate respondsToSelector:@selector(popupControllerWillDismiss:)]) { 281 | [self.delegate popupControllerWillDismiss:self]; 282 | } 283 | [UIView animateWithDuration:flag?self.theme.animationDuration:0.0 animations:^{ 284 | self.maskView.alpha = 0.0; 285 | self.popupView.center = [self dismissedPoint];; 286 | } completion:^(BOOL finished) { 287 | [self.maskView removeFromSuperview]; 288 | if ([self.delegate respondsToSelector:@selector(popupControllerDidDismiss:)]) { 289 | [self.delegate popupControllerDidDismiss:self]; 290 | } 291 | }]; 292 | } 293 | 294 | - (CGPoint)originPoint { 295 | CGPoint origin; 296 | switch (self.theme.presentationStyle) { 297 | case CNPPopupPresentationStyleFadeIn: 298 | origin = self.maskView.center; 299 | break; 300 | case CNPPopupPresentationStyleSlideInFromBottom: 301 | origin = CGPointMake(self.maskView.center.x, self.maskView.bounds.size.height + self.popupView.bounds.size.height); 302 | break; 303 | case CNPPopupPresentationStyleSlideInFromLeft: 304 | origin = CGPointMake(-self.popupView.bounds.size.width, self.maskView.center.y); 305 | break; 306 | case CNPPopupPresentationStyleSlideInFromRight: 307 | origin = CGPointMake(self.maskView.bounds.size.width+self.popupView.bounds.size.width, self.maskView.center.y); 308 | break; 309 | case CNPPopupPresentationStyleSlideInFromTop: 310 | origin = CGPointMake(self.maskView.center.x, -self.popupView.bounds.size.height); 311 | break; 312 | default: 313 | origin = self.maskView.center; 314 | break; 315 | } 316 | return origin; 317 | } 318 | 319 | - (CGPoint)endingPoint { 320 | CGPoint center; 321 | if (self.theme.popupStyle == CNPPopupStyleActionSheet) { 322 | center = CGPointMake(self.maskView.center.x, self.maskView.bounds.size.height-(self.popupView.bounds.size.height * 0.5)); 323 | } 324 | else { 325 | center = self.maskView.center; 326 | } 327 | return center; 328 | } 329 | 330 | - (CGPoint)dismissedPoint { 331 | CGPoint dismissed; 332 | switch (self.theme.presentationStyle) { 333 | case CNPPopupPresentationStyleFadeIn: 334 | dismissed = self.maskView.center; 335 | break; 336 | case CNPPopupPresentationStyleSlideInFromBottom: 337 | dismissed = self.theme.dismissesOppositeDirection?CGPointMake(self.maskView.center.x, -self.popupView.bounds.size.height):CGPointMake(self.maskView.center.x, self.maskView.bounds.size.height + self.popupView.bounds.size.height); 338 | if (self.theme.popupStyle == CNPPopupStyleActionSheet) { 339 | dismissed = CGPointMake(self.maskView.center.x, self.maskView.bounds.size.height + self.popupView.bounds.size.height); 340 | } 341 | break; 342 | case CNPPopupPresentationStyleSlideInFromLeft: 343 | dismissed = self.theme.dismissesOppositeDirection?CGPointMake(self.maskView.bounds.size.width+self.popupView.bounds.size.width, self.maskView.center.y):CGPointMake(-self.popupView.bounds.size.width, self.maskView.center.y); 344 | break; 345 | case CNPPopupPresentationStyleSlideInFromRight: 346 | dismissed = self.theme.dismissesOppositeDirection?CGPointMake(-self.popupView.bounds.size.width, self.maskView.center.y):CGPointMake(self.maskView.bounds.size.width+self.popupView.bounds.size.width, self.maskView.center.y); 347 | break; 348 | case CNPPopupPresentationStyleSlideInFromTop: 349 | dismissed = self.theme.dismissesOppositeDirection?CGPointMake(self.maskView.center.x, self.maskView.bounds.size.height + self.popupView.bounds.size.height):CGPointMake(self.maskView.center.x, -self.popupView.bounds.size.height); 350 | break; 351 | default: 352 | dismissed = self.maskView.center; 353 | break; 354 | } 355 | return dismissed; 356 | } 357 | 358 | - (CGFloat)popupWidth { 359 | CGFloat width = self.theme.maxPopupWidth; 360 | if ((self.theme.popupStyle == CNPPopupStyleActionSheet && !CNP_IS_IPAD ) || self.theme.popupStyle == CNPPopupStyleFullscreen) { 361 | width = self.maskView.bounds.size.width; 362 | } 363 | return width; 364 | } 365 | 366 | #pragma mark - UIGestureRecognizerDelegate 367 | 368 | - (void)handleBackgroundTapGesture:(id)sender { 369 | if (self.theme.shouldDismissOnBackgroundTouch) { 370 | [self.popupView endEditing:YES]; 371 | [self dismissPopupControllerAnimated:self.dismissAnimated]; 372 | } 373 | } 374 | 375 | - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 376 | { 377 | if ([touch.view isDescendantOfView:self.popupView]) 378 | return NO; 379 | return YES; 380 | } 381 | 382 | - (UIWindow *)applicationWindow { 383 | return [UIApplication sharedApplication].keyWindow; 384 | } 385 | 386 | @end 387 | 388 | #pragma mark - CNPPopupButton Methods 389 | 390 | @implementation CNPPopupButton 391 | 392 | - (instancetype)initWithFrame:(CGRect)frame { 393 | self = [super initWithFrame:frame]; 394 | if (self) { 395 | [self addTarget:self action:@selector(buttonTouched) forControlEvents:UIControlEventTouchUpInside]; 396 | } 397 | return self; 398 | } 399 | 400 | - (void)buttonTouched { 401 | if (self.selectionHandler) { 402 | self.selectionHandler(self); 403 | } 404 | } 405 | 406 | @end 407 | 408 | #pragma mark - CNPPopupTheme Methods 409 | 410 | @implementation CNPPopupTheme 411 | 412 | + (CNPPopupTheme *)defaultTheme { 413 | CNPPopupTheme *defaultTheme = [[CNPPopupTheme alloc] init]; 414 | defaultTheme.backgroundColor = [UIColor whiteColor]; 415 | defaultTheme.cornerRadius = 4.0f; 416 | defaultTheme.popupContentInsets = UIEdgeInsetsMake(16.0f, 16.0f, 16.0f, 16.0f); 417 | defaultTheme.popupStyle = CNPPopupStyleCentered; 418 | defaultTheme.presentationStyle = CNPPopupPresentationStyleSlideInFromBottom; 419 | defaultTheme.dismissesOppositeDirection = NO; 420 | defaultTheme.maskType = CNPPopupMaskTypeDimmed; 421 | defaultTheme.shouldDismissOnBackgroundTouch = YES; 422 | defaultTheme.movesAboveKeyboard = YES; 423 | defaultTheme.contentVerticalPadding = 16.0f; 424 | defaultTheme.maxPopupWidth = 300.0f; 425 | defaultTheme.animationDuration = 0.3f; 426 | return defaultTheme; 427 | } 428 | 429 | @end 430 | -------------------------------------------------------------------------------- /LawreyMCGame.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | ABDD9DA81DA17453008B25F8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DA71DA17453008B25F8 /* AppDelegate.swift */; }; 11 | ABDD9DAF1DA17453008B25F8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ABDD9DAE1DA17453008B25F8 /* Assets.xcassets */; }; 12 | ABDD9DBD1DA17481008B25F8 /* Card.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DBB1DA17481008B25F8 /* Card.swift */; }; 13 | ABDD9DBE1DA17481008B25F8 /* PlayerScore.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DBC1DA17481008B25F8 /* PlayerScore.swift */; }; 14 | ABDD9DC21DA17488008B25F8 /* CNPPopupController.m in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DC11DA17488008B25F8 /* CNPPopupController.m */; }; 15 | ABDD9DC61DA1749A008B25F8 /* Array+Shuffle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DC31DA1749A008B25F8 /* Array+Shuffle.swift */; }; 16 | ABDD9DC71DA1749A008B25F8 /* Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DC41DA1749A008B25F8 /* Device.swift */; }; 17 | ABDD9DC81DA1749A008B25F8 /* CMCardDealerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DC51DA1749A008B25F8 /* CMCardDealerManager.swift */; }; 18 | ABDD9DCC1DA174A2008B25F8 /* FCGameBoardCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DC91DA174A2008B25F8 /* FCGameBoardCollectionViewController.swift */; }; 19 | ABDD9DCD1DA174A2008B25F8 /* FCGameCardCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABDD9DCA1DA174A2008B25F8 /* FCGameCardCollectionViewCell.swift */; }; 20 | ABDD9DCE1DA174A2008B25F8 /* FCGameCardCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = ABDD9DCB1DA174A2008B25F8 /* FCGameCardCollectionViewCell.xib */; }; 21 | ABDD9DD01DA174F3008B25F8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = ABDD9DCF1DA174F3008B25F8 /* Main.storyboard */; }; 22 | ABFCBC701DA4023A00A1DE00 /* Vanilla.ttf in Resources */ = {isa = PBXBuildFile; fileRef = ABFCBC6F1DA4023A00A1DE00 /* Vanilla.ttf */; }; 23 | ABFCBC721DA403F100A1DE00 /* Cubano-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = ABFCBC711DA403F100A1DE00 /* Cubano-Regular.otf */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXFileReference section */ 27 | ABDD9DA41DA17453008B25F8 /* LawreyMCGame.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LawreyMCGame.app; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | ABDD9DA71DA17453008B25F8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 29 | ABDD9DAE1DA17453008B25F8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 30 | ABDD9DB31DA17453008B25F8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 31 | ABDD9DBB1DA17481008B25F8 /* Card.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Card.swift; sourceTree = ""; }; 32 | ABDD9DBC1DA17481008B25F8 /* PlayerScore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlayerScore.swift; sourceTree = ""; }; 33 | ABDD9DBF1DA17487008B25F8 /* LawreyMCGame-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "LawreyMCGame-Bridging-Header.h"; path = "HKTQCard/LawreyMCGame-Bridging-Header.h"; sourceTree = ""; }; 34 | ABDD9DC01DA17488008B25F8 /* CNPPopupController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CNPPopupController.h; sourceTree = ""; }; 35 | ABDD9DC11DA17488008B25F8 /* CNPPopupController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CNPPopupController.m; sourceTree = ""; }; 36 | ABDD9DC31DA1749A008B25F8 /* Array+Shuffle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Array+Shuffle.swift"; sourceTree = ""; }; 37 | ABDD9DC41DA1749A008B25F8 /* Device.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Device.swift; sourceTree = ""; }; 38 | ABDD9DC51DA1749A008B25F8 /* CMCardDealerManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMCardDealerManager.swift; sourceTree = ""; }; 39 | ABDD9DC91DA174A2008B25F8 /* FCGameBoardCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FCGameBoardCollectionViewController.swift; sourceTree = ""; }; 40 | ABDD9DCA1DA174A2008B25F8 /* FCGameCardCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FCGameCardCollectionViewCell.swift; sourceTree = ""; }; 41 | ABDD9DCB1DA174A2008B25F8 /* FCGameCardCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FCGameCardCollectionViewCell.xib; sourceTree = ""; }; 42 | ABDD9DCF1DA174F3008B25F8 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; 43 | ABFCBC6F1DA4023A00A1DE00 /* Vanilla.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Vanilla.ttf; sourceTree = ""; }; 44 | ABFCBC711DA403F100A1DE00 /* Cubano-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Cubano-Regular.otf"; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | ABDD9DA11DA17453008B25F8 /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | ABDD9D9B1DA17453008B25F8 = { 59 | isa = PBXGroup; 60 | children = ( 61 | ABDD9DBF1DA17487008B25F8 /* LawreyMCGame-Bridging-Header.h */, 62 | ABF161051DBFA67800352B20 /* Fonts */, 63 | ABDD9DA61DA17453008B25F8 /* HKTQCard */, 64 | ABDD9DA51DA17453008B25F8 /* Products */, 65 | ); 66 | sourceTree = ""; 67 | }; 68 | ABDD9DA51DA17453008B25F8 /* Products */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | ABDD9DA41DA17453008B25F8 /* LawreyMCGame.app */, 72 | ); 73 | name = Products; 74 | sourceTree = ""; 75 | }; 76 | ABDD9DA61DA17453008B25F8 /* HKTQCard */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | ABDD9DC01DA17488008B25F8 /* CNPPopupController.h */, 80 | ABDD9DC11DA17488008B25F8 /* CNPPopupController.m */, 81 | ABDD9DBA1DA1747A008B25F8 /* Helper */, 82 | ABDD9DB91DA17473008B25F8 /* Model */, 83 | ABDD9DA71DA17453008B25F8 /* AppDelegate.swift */, 84 | ABDD9DCF1DA174F3008B25F8 /* Main.storyboard */, 85 | ABDD9DC91DA174A2008B25F8 /* FCGameBoardCollectionViewController.swift */, 86 | ABDD9DCA1DA174A2008B25F8 /* FCGameCardCollectionViewCell.swift */, 87 | ABDD9DCB1DA174A2008B25F8 /* FCGameCardCollectionViewCell.xib */, 88 | ABDD9DAE1DA17453008B25F8 /* Assets.xcassets */, 89 | ABDD9DB31DA17453008B25F8 /* Info.plist */, 90 | ); 91 | path = HKTQCard; 92 | sourceTree = ""; 93 | }; 94 | ABDD9DB91DA17473008B25F8 /* Model */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | ABDD9DBB1DA17481008B25F8 /* Card.swift */, 98 | ABDD9DBC1DA17481008B25F8 /* PlayerScore.swift */, 99 | ); 100 | name = Model; 101 | sourceTree = ""; 102 | }; 103 | ABDD9DBA1DA1747A008B25F8 /* Helper */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | ABDD9DC31DA1749A008B25F8 /* Array+Shuffle.swift */, 107 | ABDD9DC41DA1749A008B25F8 /* Device.swift */, 108 | ABDD9DC51DA1749A008B25F8 /* CMCardDealerManager.swift */, 109 | ); 110 | name = Helper; 111 | sourceTree = ""; 112 | }; 113 | ABF161051DBFA67800352B20 /* Fonts */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | ABFCBC6F1DA4023A00A1DE00 /* Vanilla.ttf */, 117 | ABFCBC711DA403F100A1DE00 /* Cubano-Regular.otf */, 118 | ); 119 | name = Fonts; 120 | sourceTree = ""; 121 | }; 122 | /* End PBXGroup section */ 123 | 124 | /* Begin PBXNativeTarget section */ 125 | ABDD9DA31DA17453008B25F8 /* LawreyMCGame */ = { 126 | isa = PBXNativeTarget; 127 | buildConfigurationList = ABDD9DB61DA17453008B25F8 /* Build configuration list for PBXNativeTarget "LawreyMCGame" */; 128 | buildPhases = ( 129 | ABDD9DA01DA17453008B25F8 /* Sources */, 130 | ABDD9DA11DA17453008B25F8 /* Frameworks */, 131 | ABDD9DA21DA17453008B25F8 /* Resources */, 132 | ); 133 | buildRules = ( 134 | ); 135 | dependencies = ( 136 | ); 137 | name = LawreyMCGame; 138 | productName = HKTQCard; 139 | productReference = ABDD9DA41DA17453008B25F8 /* LawreyMCGame.app */; 140 | productType = "com.apple.product-type.application"; 141 | }; 142 | /* End PBXNativeTarget section */ 143 | 144 | /* Begin PBXProject section */ 145 | ABDD9D9C1DA17453008B25F8 /* Project object */ = { 146 | isa = PBXProject; 147 | attributes = { 148 | LastSwiftUpdateCheck = 0800; 149 | LastUpgradeCheck = 0800; 150 | ORGANIZATIONNAME = "2359 Media Pte Ltd"; 151 | TargetAttributes = { 152 | ABDD9DA31DA17453008B25F8 = { 153 | CreatedOnToolsVersion = 8.0; 154 | DevelopmentTeam = BXU3B85A8F; 155 | LastSwiftMigration = 0800; 156 | ProvisioningStyle = Manual; 157 | }; 158 | }; 159 | }; 160 | buildConfigurationList = ABDD9D9F1DA17453008B25F8 /* Build configuration list for PBXProject "LawreyMCGame" */; 161 | compatibilityVersion = "Xcode 3.2"; 162 | developmentRegion = English; 163 | hasScannedForEncodings = 0; 164 | knownRegions = ( 165 | en, 166 | Base, 167 | ); 168 | mainGroup = ABDD9D9B1DA17453008B25F8; 169 | productRefGroup = ABDD9DA51DA17453008B25F8 /* Products */; 170 | projectDirPath = ""; 171 | projectRoot = ""; 172 | targets = ( 173 | ABDD9DA31DA17453008B25F8 /* LawreyMCGame */, 174 | ); 175 | }; 176 | /* End PBXProject section */ 177 | 178 | /* Begin PBXResourcesBuildPhase section */ 179 | ABDD9DA21DA17453008B25F8 /* Resources */ = { 180 | isa = PBXResourcesBuildPhase; 181 | buildActionMask = 2147483647; 182 | files = ( 183 | ABDD9DAF1DA17453008B25F8 /* Assets.xcassets in Resources */, 184 | ABDD9DCE1DA174A2008B25F8 /* FCGameCardCollectionViewCell.xib in Resources */, 185 | ABFCBC721DA403F100A1DE00 /* Cubano-Regular.otf in Resources */, 186 | ABFCBC701DA4023A00A1DE00 /* Vanilla.ttf in Resources */, 187 | ABDD9DD01DA174F3008B25F8 /* Main.storyboard in Resources */, 188 | ); 189 | runOnlyForDeploymentPostprocessing = 0; 190 | }; 191 | /* End PBXResourcesBuildPhase section */ 192 | 193 | /* Begin PBXSourcesBuildPhase section */ 194 | ABDD9DA01DA17453008B25F8 /* Sources */ = { 195 | isa = PBXSourcesBuildPhase; 196 | buildActionMask = 2147483647; 197 | files = ( 198 | ABDD9DC21DA17488008B25F8 /* CNPPopupController.m in Sources */, 199 | ABDD9DA81DA17453008B25F8 /* AppDelegate.swift in Sources */, 200 | ABDD9DCC1DA174A2008B25F8 /* FCGameBoardCollectionViewController.swift in Sources */, 201 | ABDD9DC81DA1749A008B25F8 /* CMCardDealerManager.swift in Sources */, 202 | ABDD9DBE1DA17481008B25F8 /* PlayerScore.swift in Sources */, 203 | ABDD9DC71DA1749A008B25F8 /* Device.swift in Sources */, 204 | ABDD9DC61DA1749A008B25F8 /* Array+Shuffle.swift in Sources */, 205 | ABDD9DBD1DA17481008B25F8 /* Card.swift in Sources */, 206 | ABDD9DCD1DA174A2008B25F8 /* FCGameCardCollectionViewCell.swift in Sources */, 207 | ); 208 | runOnlyForDeploymentPostprocessing = 0; 209 | }; 210 | /* End PBXSourcesBuildPhase section */ 211 | 212 | /* Begin XCBuildConfiguration section */ 213 | ABDD9DB41DA17453008B25F8 /* Debug */ = { 214 | isa = XCBuildConfiguration; 215 | buildSettings = { 216 | ALWAYS_SEARCH_USER_PATHS = NO; 217 | CLANG_ANALYZER_NONNULL = YES; 218 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 219 | CLANG_CXX_LIBRARY = "libc++"; 220 | CLANG_ENABLE_MODULES = YES; 221 | CLANG_ENABLE_OBJC_ARC = YES; 222 | CLANG_WARN_BOOL_CONVERSION = YES; 223 | CLANG_WARN_CONSTANT_CONVERSION = YES; 224 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 225 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 226 | CLANG_WARN_EMPTY_BODY = YES; 227 | CLANG_WARN_ENUM_CONVERSION = YES; 228 | CLANG_WARN_INFINITE_RECURSION = YES; 229 | CLANG_WARN_INT_CONVERSION = YES; 230 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 231 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 232 | CLANG_WARN_UNREACHABLE_CODE = YES; 233 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 234 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 235 | COPY_PHASE_STRIP = NO; 236 | DEBUG_INFORMATION_FORMAT = dwarf; 237 | ENABLE_STRICT_OBJC_MSGSEND = YES; 238 | ENABLE_TESTABILITY = YES; 239 | GCC_C_LANGUAGE_STANDARD = gnu99; 240 | GCC_DYNAMIC_NO_PIC = NO; 241 | GCC_NO_COMMON_BLOCKS = YES; 242 | GCC_OPTIMIZATION_LEVEL = 0; 243 | GCC_PREPROCESSOR_DEFINITIONS = ( 244 | "DEBUG=1", 245 | "$(inherited)", 246 | ); 247 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 248 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 249 | GCC_WARN_UNDECLARED_SELECTOR = YES; 250 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 251 | GCC_WARN_UNUSED_FUNCTION = YES; 252 | GCC_WARN_UNUSED_VARIABLE = YES; 253 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 254 | MTL_ENABLE_DEBUG_INFO = YES; 255 | ONLY_ACTIVE_ARCH = YES; 256 | SDKROOT = iphoneos; 257 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 258 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 259 | TARGETED_DEVICE_FAMILY = 2; 260 | }; 261 | name = Debug; 262 | }; 263 | ABDD9DB51DA17453008B25F8 /* Release */ = { 264 | isa = XCBuildConfiguration; 265 | buildSettings = { 266 | ALWAYS_SEARCH_USER_PATHS = NO; 267 | CLANG_ANALYZER_NONNULL = YES; 268 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 269 | CLANG_CXX_LIBRARY = "libc++"; 270 | CLANG_ENABLE_MODULES = YES; 271 | CLANG_ENABLE_OBJC_ARC = YES; 272 | CLANG_WARN_BOOL_CONVERSION = YES; 273 | CLANG_WARN_CONSTANT_CONVERSION = YES; 274 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 275 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 276 | CLANG_WARN_EMPTY_BODY = YES; 277 | CLANG_WARN_ENUM_CONVERSION = YES; 278 | CLANG_WARN_INFINITE_RECURSION = YES; 279 | CLANG_WARN_INT_CONVERSION = YES; 280 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 281 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 282 | CLANG_WARN_UNREACHABLE_CODE = YES; 283 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 284 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 285 | COPY_PHASE_STRIP = NO; 286 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 287 | ENABLE_NS_ASSERTIONS = NO; 288 | ENABLE_STRICT_OBJC_MSGSEND = YES; 289 | GCC_C_LANGUAGE_STANDARD = gnu99; 290 | GCC_NO_COMMON_BLOCKS = YES; 291 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 292 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 293 | GCC_WARN_UNDECLARED_SELECTOR = YES; 294 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 295 | GCC_WARN_UNUSED_FUNCTION = YES; 296 | GCC_WARN_UNUSED_VARIABLE = YES; 297 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 298 | MTL_ENABLE_DEBUG_INFO = NO; 299 | SDKROOT = iphoneos; 300 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 301 | TARGETED_DEVICE_FAMILY = 2; 302 | VALIDATE_PRODUCT = YES; 303 | }; 304 | name = Release; 305 | }; 306 | ABDD9DB71DA17453008B25F8 /* Debug */ = { 307 | isa = XCBuildConfiguration; 308 | buildSettings = { 309 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 310 | CLANG_ENABLE_MODULES = YES; 311 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; 312 | DEVELOPMENT_TEAM = BXU3B85A8F; 313 | FRAMEWORK_SEARCH_PATHS = ( 314 | "$(inherited)", 315 | "$(PROJECT_DIR)", 316 | ); 317 | INFOPLIST_FILE = "$(SRCROOT)/HKTQCard/Info.plist"; 318 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 319 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 320 | PRODUCT_BUNDLE_IDENTIFIER = com.lawrey.lawreymcgame; 321 | PRODUCT_NAME = "$(TARGET_NAME)"; 322 | PROVISIONING_PROFILE = "fbc7d51e-5257-4ba0-aafd-6159d91cc1ed"; 323 | PROVISIONING_PROFILE_SPECIFIER = "Wildcard In House"; 324 | SWIFT_OBJC_BRIDGING_HEADER = "HKTQCard/LawreyMCGame-Bridging-Header.h"; 325 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 326 | SWIFT_VERSION = 3.0; 327 | TARGETED_DEVICE_FAMILY = 2; 328 | }; 329 | name = Debug; 330 | }; 331 | ABDD9DB81DA17453008B25F8 /* Release */ = { 332 | isa = XCBuildConfiguration; 333 | buildSettings = { 334 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 335 | CLANG_ENABLE_MODULES = YES; 336 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: 2359 Media Pte Ltd"; 337 | DEVELOPMENT_TEAM = BXU3B85A8F; 338 | FRAMEWORK_SEARCH_PATHS = ( 339 | "$(inherited)", 340 | "$(PROJECT_DIR)", 341 | ); 342 | INFOPLIST_FILE = "$(SRCROOT)/HKTQCard/Info.plist"; 343 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 344 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 345 | PRODUCT_BUNDLE_IDENTIFIER = com.lawrey.lawreymcgame; 346 | PRODUCT_NAME = "$(TARGET_NAME)"; 347 | PROVISIONING_PROFILE = "fbc7d51e-5257-4ba0-aafd-6159d91cc1ed"; 348 | PROVISIONING_PROFILE_SPECIFIER = "Wildcard In House"; 349 | SWIFT_OBJC_BRIDGING_HEADER = "HKTQCard/LawreyMCGame-Bridging-Header.h"; 350 | SWIFT_VERSION = 3.0; 351 | TARGETED_DEVICE_FAMILY = 2; 352 | }; 353 | name = Release; 354 | }; 355 | /* End XCBuildConfiguration section */ 356 | 357 | /* Begin XCConfigurationList section */ 358 | ABDD9D9F1DA17453008B25F8 /* Build configuration list for PBXProject "LawreyMCGame" */ = { 359 | isa = XCConfigurationList; 360 | buildConfigurations = ( 361 | ABDD9DB41DA17453008B25F8 /* Debug */, 362 | ABDD9DB51DA17453008B25F8 /* Release */, 363 | ); 364 | defaultConfigurationIsVisible = 0; 365 | defaultConfigurationName = Release; 366 | }; 367 | ABDD9DB61DA17453008B25F8 /* Build configuration list for PBXNativeTarget "LawreyMCGame" */ = { 368 | isa = XCConfigurationList; 369 | buildConfigurations = ( 370 | ABDD9DB71DA17453008B25F8 /* Debug */, 371 | ABDD9DB81DA17453008B25F8 /* Release */, 372 | ); 373 | defaultConfigurationIsVisible = 0; 374 | defaultConfigurationName = Release; 375 | }; 376 | /* End XCConfigurationList section */ 377 | }; 378 | rootObject = ABDD9D9C1DA17453008B25F8 /* Project object */; 379 | } 380 | --------------------------------------------------------------------------------