├── Find the Differences
├── Assets.xcassets
│ ├── Contents.json
│ ├── found.imageset
│ │ ├── found.png
│ │ └── Contents.json
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Actions.sks
├── GameScene.sks
├── resources
│ ├── level1_1.png
│ ├── level1_2.png
│ ├── level1_3.png
│ ├── level1_4.png
│ ├── level1_5.png
│ └── level1_incomplete.png
├── views
│ ├── GameScene.swift
│ └── GameViewController.swift
├── modal
│ ├── PictureObject.swift
│ └── Level.swift
├── controller
│ └── Controller.swift
├── Info.plist
├── Base.lproj
│ ├── Main.storyboard
│ └── LaunchScreen.storyboard
└── AppDelegate.swift
├── Find the Differences.xcodeproj
├── xcuserdata
│ └── Araib.xcuserdatad
│ │ ├── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ ├── xcuserdata
│ │ └── Araib.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── project.pbxproj
├── README.md
├── Find the DifferencesTests
├── Info.plist
└── Find_the_DifferencesTests.swift
└── Find the DifferencesUITests
├── Info.plist
└── Find_the_DifferencesUITests.swift
/Find the Differences/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Find the Differences/Actions.sks:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/HEAD/Find the Differences/Actions.sks
--------------------------------------------------------------------------------
/Find the Differences/GameScene.sks:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/HEAD/Find the Differences/GameScene.sks
--------------------------------------------------------------------------------
/Find the Differences/resources/level1_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/HEAD/Find the Differences/resources/level1_1.png
--------------------------------------------------------------------------------
/Find the Differences/resources/level1_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/HEAD/Find the Differences/resources/level1_2.png
--------------------------------------------------------------------------------
/Find the Differences/resources/level1_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/HEAD/Find the Differences/resources/level1_3.png
--------------------------------------------------------------------------------
/Find the Differences/resources/level1_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/HEAD/Find the Differences/resources/level1_4.png
--------------------------------------------------------------------------------
/Find the Differences/resources/level1_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/HEAD/Find the Differences/resources/level1_5.png
--------------------------------------------------------------------------------
/Find the Differences/resources/level1_incomplete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/HEAD/Find the Differences/resources/level1_incomplete.png
--------------------------------------------------------------------------------
/Find the Differences/Assets.xcassets/found.imageset/found.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/HEAD/Find the Differences/Assets.xcassets/found.imageset/found.png
--------------------------------------------------------------------------------
/Find the Differences.xcodeproj/xcuserdata/Araib.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/Find the Differences.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Find the Differences.xcodeproj/project.xcworkspace/xcuserdata/Araib.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/HEAD/Find the Differences.xcodeproj/project.xcworkspace/xcuserdata/Araib.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Find the Differences.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Find the Differences/Assets.xcassets/found.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "universal",
9 | "scale" : "2x"
10 | },
11 | {
12 | "idiom" : "universal",
13 | "filename" : "found.png",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/Find the Differences.xcodeproj/xcuserdata/Araib.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Find the Differences.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Find all Differences - Game - iOS
2 | Find all differences - a popular game on iOS - find the difference between two seemingly similar images.
3 |
4 | Two images - find the difference between these two images.
5 |
6 | ## Functionality
7 | - Both images can be zoomed together.
8 | - You can tap on both images to find objects.
9 |
10 | ## Screenshot
11 | 
12 |
13 | ## Demo App
14 | https://apps.apple.com/us/app/find-all-differences/id1482886951?ls=1
15 |
16 | ## Star
17 | Please star if the project was helpful to you. :)
18 |
19 | ## Contact me
20 | https://www.syedaraib.com
21 |
--------------------------------------------------------------------------------
/Find the DifferencesTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Find the DifferencesUITests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Find the Differences/views/GameScene.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GameScene.swift
3 | // Find the Differences
4 | //
5 | // Created by Araib on 13/11/2019.
6 | // Copyright © 2019 Woody Apps. All rights reserved.
7 | //
8 |
9 | import SpriteKit
10 | import GameplayKit
11 |
12 | class GameScene: SKScene {
13 | var gameViewController : GameViewController?
14 |
15 | private var label : SKLabelNode?
16 | private var spinnyNode : SKShapeNode?
17 |
18 | override func didMove(to view: SKView) {
19 | self.backgroundColor = SKColor.white
20 | // Get label node from scene and store it for use later
21 | self.anchorPoint = CGPoint.init(x: 0.5, y: 0.5)
22 |
23 | // Get label node from scene and store it for use later
24 | gameViewController?.createGamePlay()
25 | }
26 | func launchGame (count : Int) {
27 |
28 | }
29 |
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/Find the DifferencesTests/Find_the_DifferencesTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Find_the_DifferencesTests.swift
3 | // Find the DifferencesTests
4 | //
5 | // Created by Araib on 13/11/2019.
6 | // Copyright © 2019 Woody Apps. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | @testable import Find_the_Differences
11 |
12 | class Find_the_DifferencesTests: XCTestCase {
13 |
14 | override func setUp() {
15 | // Put setup code here. This method is called before the invocation of each test method in the class.
16 | }
17 |
18 | override func tearDown() {
19 | // Put teardown code here. This method is called after the invocation of each test method in the class.
20 | }
21 |
22 | func testExample() {
23 | // This is an example of a functional test case.
24 | // Use XCTAssert and related functions to verify your tests produce the correct results.
25 | }
26 |
27 | func testPerformanceExample() {
28 | // This is an example of a performance test case.
29 | self.measure {
30 | // Put the code you want to measure the time of here.
31 | }
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/Find the Differences/modal/PictureObject.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Objects.swift
3 | // Find the Differences
4 | //
5 | // Created by Araib on 13/11/2019.
6 | // Copyright © 2019 Woody Apps. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import SpriteKit
11 |
12 | enum PictureType {
13 | case hidden
14 | case colorchange
15 | case inverted
16 | }
17 | class PictureObject {
18 | var x = 0.0
19 | var y = 0.0
20 | var hiddenSprite : UIImageView?
21 | var visibleSprite : UIImageView?
22 | var imageName = String ()
23 | var imageName_correct = String ()
24 | var index = 0
25 | var isFound = false
26 | var pictureType : PictureType = .hidden
27 | init(index : Int, x : Double, y: Double, image : String, type : PictureType) {
28 | self.x = x
29 | self.y = y
30 | imageName = image
31 | self.index = index
32 | self.pictureType = type
33 | if(pictureType == .colorchange){
34 | imageName_correct = image + "_c"
35 | }else if(pictureType == .inverted){
36 | imageName_correct = image + "_c"
37 | }
38 | }
39 |
40 |
41 | }
42 |
--------------------------------------------------------------------------------
/Find the Differences/controller/Controller.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Level.swift
3 | // Find the Differences
4 | //
5 | // Created by Araib on 14/11/2019.
6 | // Copyright © 2019 Woody Apps. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 |
12 | class Controller {
13 | var numberOfObjectsFound = 0
14 | var level : Level!
15 | init(levelIndex: Int) {
16 | level = Level(index :levelIndex)
17 | }
18 |
19 | func foundObject (pictureObject : PictureObject){
20 | pictureObject.isFound = true
21 | numberOfObjectsFound += 1
22 | //setting tags to negative.
23 | //you can use some other logic.
24 | if let sprite = pictureObject.visibleSprite, sprite != nil {
25 | sprite.tag = -100
26 | }
27 | if let sprite = pictureObject.hiddenSprite, sprite != nil {
28 | sprite.tag = -100
29 | }
30 |
31 | }
32 |
33 | func checkObjectWithTag (tag : Int) -> Bool{
34 | for view in level.allPictureObjects {
35 | if(view.visibleSprite!.tag == tag && view.hiddenSprite!.tag == tag){
36 | foundObject(pictureObject: view)
37 | return true
38 | }
39 | }
40 | return false
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Find the Differences/modal/Level.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Level.swift
3 | // Find the Differences
4 | //
5 | // Created by Araib on 14/11/2019.
6 | // Copyright © 2019 Woody Apps. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Level {
12 | var allPictureObjects = [PictureObject] ()
13 | var imageName = String()
14 | init(index : Int){
15 | initLevel()
16 | }
17 | func initLevel (){
18 | imageName = "level1_incomplete"
19 | allPictureObjects.append(makePictureObject(x:1070.439, y: 211.704, stage: 1, index: 1,type: .hidden))
20 | allPictureObjects.append(makePictureObject(x:586.54, y: 456.556, stage: 1, index: 2,type: .hidden))
21 | allPictureObjects.append(makePictureObject(x:1570.613, y: 1258.103, stage: 1, index: 3,type: .hidden))
22 | allPictureObjects.append(makePictureObject(x:318.91, y: 1325.9, stage: 1, index: 4,type: .hidden))
23 | allPictureObjects.append(makePictureObject(x:1895.008, y: 169.526, stage: 1, index: 5,type: .hidden))
24 |
25 | }
26 | func makePictureObject (x: Double, y: Double, stage : Int, index: Int, type: PictureType ) -> PictureObject{
27 | let picture = PictureObject(index: index,x: x, y: y, image : "level"+"\(stage)"+"_"+"\(index)", type:type)
28 | return picture
29 | }
30 | }
31 |
32 |
--------------------------------------------------------------------------------
/Find the Differences/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UILaunchStoryboardName
24 | LaunchScreen
25 | UIMainStoryboardFile
26 | Main
27 | UIRequiredDeviceCapabilities
28 |
29 | armv7
30 |
31 | UIRequiresFullScreen
32 |
33 | UIStatusBarHidden
34 |
35 | UISupportedInterfaceOrientations
36 |
37 | UIInterfaceOrientationPortrait
38 |
39 | UISupportedInterfaceOrientations~ipad
40 |
41 | UIInterfaceOrientationPortrait
42 | UIInterfaceOrientationPortraitUpsideDown
43 | UIInterfaceOrientationLandscapeLeft
44 | UIInterfaceOrientationLandscapeRight
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/Find the DifferencesUITests/Find_the_DifferencesUITests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Find_the_DifferencesUITests.swift
3 | // Find the DifferencesUITests
4 | //
5 | // Created by Araib on 13/11/2019.
6 | // Copyright © 2019 Woody Apps. All rights reserved.
7 | //
8 |
9 | import XCTest
10 |
11 | class Find_the_DifferencesUITests: XCTestCase {
12 |
13 | override func setUp() {
14 | // Put setup code here. This method is called before the invocation of each test method in the class.
15 |
16 | // In UI tests it is usually best to stop immediately when a failure occurs.
17 | continueAfterFailure = false
18 |
19 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
20 | }
21 |
22 | override func tearDown() {
23 | // Put teardown code here. This method is called after the invocation of each test method in the class.
24 | }
25 |
26 | func testExample() {
27 | // UI tests must launch the application that they test.
28 | let app = XCUIApplication()
29 | app.launch()
30 |
31 | // Use recording to get started writing UI tests.
32 | // Use XCTAssert and related functions to verify your tests produce the correct results.
33 | }
34 |
35 | func testLaunchPerformance() {
36 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) {
37 | // This measures how long it takes to launch your application.
38 | measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) {
39 | XCUIApplication().launch()
40 | }
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/Find the Differences/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Find the Differences/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Find the Differences/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // Find the Differences
4 | //
5 | // Created by Araib on 13/11/2019.
6 | // Copyright © 2019 Woody Apps. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
18 | // Override point for customization after application launch.
19 | return true
20 | }
21 |
22 | func applicationWillResignActive(_ application: UIApplication) {
23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
25 | }
26 |
27 | func applicationDidEnterBackground(_ application: UIApplication) {
28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
29 | }
30 |
31 | func applicationWillEnterForeground(_ application: UIApplication) {
32 | // 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.
33 | }
34 |
35 | func applicationDidBecomeActive(_ application: UIApplication) {
36 | // 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.
37 | }
38 |
39 |
40 | }
41 |
42 |
--------------------------------------------------------------------------------
/Find the Differences/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/Find the Differences/views/GameViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GameViewController.swift
3 | // Find the Differences
4 | //
5 | // Created by Araib on 13/11/2019.
6 | // Copyright © 2019 Woody Apps. All rights reserved.
7 | //
8 |
9 |
10 | // Find all Difference - Find the differences between two images.
11 | // 'fullImageWithVisibleItems' & 'fullImageWithHiddenItems' are ImageViews used to display the full images without objects (hidden/visible)
12 | // Objects are added to both imagesviews but hidden in the 'fullImageWithHiddenItems'
13 | // Scrollviews is used to zoom and pan imageviews. Both imageviews are zoomed together.
14 | // tap gesture is used to tap the hidden and visible objects in both imageviews.
15 | // As in iOS, hidden views are not tappable hence it is necessary to track them through their locations and tags.
16 |
17 |
18 | import UIKit
19 | import SpriteKit
20 | import GameplayKit
21 |
22 |
23 |
24 | class GameViewController: UIViewController, UIScrollViewDelegate, UIGestureRecognizerDelegate {
25 | // MARK: Properties
26 | var gameScene : GameScene!
27 |
28 | var controller : Controller!
29 | var scrollView1 = UIScrollView ()
30 | var scrollView2 = UIScrollView ()
31 |
32 |
33 | //need global imageviews for tracking objects.
34 | var fullImageWithVisibleItems = UIImageView ()
35 | var fullImageWithHiddenItems = UIImageView ()
36 | func launchGameScene (){
37 | let skView = view as! SKView
38 | skView.isMultipleTouchEnabled = false
39 | skView.ignoresSiblingOrder = false
40 | gameScene = GameScene(size: skView.bounds.size)
41 | gameScene.gameViewController = self
42 |
43 | gameScene.scaleMode = .aspectFill
44 | skView.presentScene(self.gameScene)
45 |
46 | }
47 | // MARK: GameViewController's functions
48 | override func viewDidLoad() {
49 | super.viewDidLoad()
50 |
51 | launchGameScene ()
52 | }
53 |
54 | override var shouldAutorotate: Bool {
55 | return true
56 | }
57 |
58 | override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
59 | if UIDevice.current.userInterfaceIdiom == .phone {
60 | return .allButUpsideDown
61 | } else {
62 | return .all
63 | }
64 | }
65 |
66 | override var prefersStatusBarHidden: Bool {
67 | return true
68 | }
69 |
70 |
71 |
72 | // MARK: Create GamePlay
73 | func createGamePlay (){
74 |
75 | //creating PictureObjects to be placed in the ImageViews.
76 | controller = Controller(levelIndex: 1)
77 | //calculating height and width with respect to the provided Image.
78 | let spacing = CGFloat(10.0)
79 | let originalImage = UIImage.init(named: controller.level.imageName)
80 | let originalWidthOfImage = Double(originalImage!.size.width)
81 | let originalHeightOfImage = Double(originalImage!.size.height)
82 | let ratio = originalHeightOfImage/originalWidthOfImage
83 | let mainViewWidth = view.frame.size.width
84 | let viewWidth = CGFloat(mainViewWidth - spacing)
85 | let viewHeight = CGFloat(ratio) * CGFloat(viewWidth)
86 |
87 | //initializing ScrollView 1
88 | scrollView1 = UIScrollView.init(frame: CGRect.init(x: 5.0, y: self.view.frame.size.height * 0.5 - (viewHeight) - 10 , width: (viewWidth), height: (viewHeight)))
89 |
90 | let width = viewWidth
91 | let height = viewHeight
92 |
93 | scrollView1.delegate = self
94 | scrollView1.isScrollEnabled = true
95 | scrollView1.minimumZoomScale = 1.0
96 | scrollView1.maximumZoomScale = 3.0
97 | scrollView1.tag = 1
98 | scrollView1.backgroundColor = UIColor.white
99 |
100 | fullImageWithVisibleItems = UIImageView.init(image: originalImage)
101 | fullImageWithVisibleItems.frame = CGRect.init(x: 0, y: 0 , width: (viewWidth), height: (viewHeight))
102 | scrollView1.addSubview(fullImageWithVisibleItems)
103 | fullImageWithVisibleItems.isUserInteractionEnabled = true
104 | view.addSubview(scrollView1)
105 |
106 | //initializing ScrollView 2
107 | //adding spacing between two scrollview -> 10
108 | scrollView2 = UIScrollView.init(frame: CGRect.init(x: 5.0, y: view.frame.size.height * 0.5 + 10 , width: (viewWidth), height: (viewHeight)))
109 |
110 |
111 | scrollView2.delegate = self
112 | scrollView2.isScrollEnabled = true
113 | scrollView2.minimumZoomScale = 1.0
114 | scrollView2.maximumZoomScale = 3.0
115 | scrollView2.tag = 2
116 | scrollView2.backgroundColor = UIColor.white
117 |
118 | fullImageWithHiddenItems = UIImageView.init(image: originalImage)
119 |
120 | fullImageWithHiddenItems.frame = CGRect.init(x: 0, y: 0 , width: (viewWidth), height: (viewHeight))
121 | scrollView2.addSubview(fullImageWithHiddenItems)
122 |
123 | view.addSubview(scrollView2)
124 |
125 | scrollView2.alwaysBounceHorizontal = false
126 | scrollView2.bounces = false
127 |
128 | scrollView1.alwaysBounceHorizontal = false
129 | scrollView1.bounces = false
130 |
131 | //adding objects to first ImageView -> Hidden
132 | for i in 0 ..< controller.level.allPictureObjects.count {
133 | let picture = controller.level.allPictureObjects[i]
134 | let object = UIImage.init(named: picture.imageName)
135 |
136 | let widthChange = object!.size.width/CGFloat(originalWidthOfImage)
137 | let heightChange = object!.size.height/CGFloat(originalHeightOfImage)
138 | let newObjectImage = object?.resize(size: CGSize.init(width: viewWidth * widthChange, height: viewHeight * heightChange))
139 | let objectView = UIImageView.init(image: object)
140 | objectView.tag = i + 1
141 | let newPointX = picture.x/originalWidthOfImage * Double(width)
142 | let newPointY = picture.y/originalHeightOfImage * Double(height)
143 | objectView.frame = CGRect.init(x: CGFloat(newPointX), y: CGFloat(newPointY), width: newObjectImage!.size.width, height: newObjectImage!.size.height)
144 | fullImageWithVisibleItems.addSubview(objectView)
145 | picture.hiddenSprite = objectView
146 | objectView.isHidden = true
147 | if (picture.pictureType == .colorchange){
148 | objectView.isHidden = false
149 | }else if (picture.pictureType == .inverted){
150 | objectView.isHidden = false
151 | }
152 | }
153 | //Setting tap gestures
154 | let tapGesture1 = UITapGestureRecognizer(target: self, action: #selector(tappedImageWithHiddenItems(_:)))
155 | tapGesture1.numberOfTapsRequired = 1
156 | tapGesture1.numberOfTouchesRequired = 1
157 | fullImageWithHiddenItems.isUserInteractionEnabled = true
158 | tapGesture1.cancelsTouchesInView = false
159 | tapGesture1.delegate = self
160 | fullImageWithVisibleItems.addGestureRecognizer(tapGesture1)
161 | let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tappedImageWithVisibleItems(_:)))
162 | tapGesture.numberOfTapsRequired = 1
163 | tapGesture.numberOfTouchesRequired = 1
164 | fullImageWithHiddenItems.isUserInteractionEnabled = true
165 | tapGesture.cancelsTouchesInView = false
166 | tapGesture.delegate = self
167 | fullImageWithHiddenItems.addGestureRecognizer(tapGesture)
168 | //adding objects to second ImageView -> Visible.
169 |
170 | for i in 0 ..< controller.level.allPictureObjects.count {
171 |
172 | let picture = controller.level.allPictureObjects[i]
173 | var object = UIImage.init(named: picture.imageName)
174 | if(picture.pictureType == .colorchange){
175 | object = UIImage.init(named: picture.imageName_correct)
176 | }else if (picture.pictureType == .inverted){
177 | object = UIImage.init(named: picture.imageName_correct)
178 | }
179 | let widthChange = object!.size.width/CGFloat(originalWidthOfImage)
180 | let heightChange = object!.size.height/CGFloat(originalHeightOfImage)
181 | let newWidth = widthChange * viewWidth
182 | let newHeight = heightChange * viewHeight
183 | let objectView = UIImageView.init(image: object)
184 | objectView.tag = i + 1
185 | let newPointX = picture.x/2600 * Double(width)
186 | let newPointY = picture.y/1703 * Double(height)
187 | print(newPointX)
188 | print(newPointY)
189 | objectView.frame = CGRect.init(x: CGFloat(newPointX), y: CGFloat(newPointY), width: newWidth, height: newHeight)
190 | fullImageWithHiddenItems.addSubview(objectView)
191 | picture.visibleSprite = objectView
192 | }
193 |
194 | self.gameScene.launchGame(count : controller.level.allPictureObjects.count)
195 |
196 | scrollView2.delaysContentTouches = false
197 |
198 |
199 |
200 | }
201 | // MARK: tap gesture methods.
202 | @objc func tappedImageWithHiddenItems(_ sender: UITapGestureRecognizer) {
203 | let location = sender.location(in: fullImageWithVisibleItems)
204 | var locationInView = CGPoint.zero
205 | let subViews = fullImageWithVisibleItems.subviews
206 | for subview in subViews {
207 | locationInView = subview.convert(location, from: fullImageWithVisibleItems)
208 | if subview.point(inside: locationInView, with: nil){
209 | if(subview.tag > 0) {
210 | verifyObjects(subview: subview, tag: subview.tag)
211 | }
212 | }
213 | }
214 |
215 | }
216 | @objc func tappedImageWithVisibleItems(_ sender: UITapGestureRecognizer) {
217 | let location = sender.location(in: fullImageWithHiddenItems)
218 | var locationInView = CGPoint.zero
219 | let subViews = fullImageWithHiddenItems.subviews
220 | for subview in subViews {
221 | locationInView = subview.convert(location, from: fullImageWithHiddenItems)
222 | if subview.point(inside: locationInView, with: nil){
223 | if(subview.tag > 0) {
224 | verifyObjects(subview: subview, tag: subview.tag)
225 | }
226 | }
227 | }
228 | }
229 |
230 | // MARK: tap inputs
231 | func verifyObjects (subview: UIView, tag : Int){
232 |
233 | let success = controller.checkObjectWithTag (tag : tag)
234 | if(success) {
235 | foundObject (subview: subview)
236 | }
237 |
238 | }
239 | func foundObject (subview: UIView){
240 |
241 | addFoundCircle(parent: self.fullImageWithVisibleItems, x: subview.frame.origin.x + subview.frame.size.width/2 , y: subview.frame.origin.y + subview.frame.size.height/2)
242 | addFoundCircle(parent: self.fullImageWithHiddenItems, x: subview.frame.origin.x + subview.frame.size.width/2 , y: subview.frame.origin.y + subview.frame.size.height/2)
243 | }
244 |
245 | func addFoundCircle (parent : UIImageView, x : CGFloat, y: CGFloat){
246 | let image = UIImage.init(named: "found")
247 | let imageView = UIImageView.init(image: image)
248 | let xPos = x - (image!.size.height/2)
249 | let yPos = y - (image!.size.height/2)
250 | imageView.frame = CGRect.init(x: xPos, y: yPos, width: (image!.size.width), height: (image!.size.height))
251 | parent.addSubview(imageView)
252 | }
253 | // MARK: Delegate methods
254 | func viewForZooming(in scrollView: UIScrollView) -> UIView? {
255 | if(scrollView.tag == 1){
256 | return fullImageWithVisibleItems
257 | }else{
258 | return fullImageWithHiddenItems
259 | }
260 |
261 | }
262 |
263 | func scrollViewDidScroll(_ scrollView: UIScrollView) {
264 |
265 | if(scrollView.tag == 1){
266 | self.scrollView2.contentOffset = scrollView.contentOffset
267 | self.scrollView2.zoomScale = scrollView.zoomScale
268 |
269 |
270 | }else{
271 | self.scrollView1.contentOffset = scrollView.contentOffset
272 | self.scrollView1.zoomScale = scrollView.zoomScale
273 | }
274 |
275 | }
276 |
277 | func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
278 | return true
279 | }
280 |
281 | }
282 | extension UIImage {
283 | func resize(width: CGFloat) -> UIImage {
284 | let height = (width/self.size.width)*self.size.height
285 | return self.resize(size: CGSize(width: width, height: height))
286 | }
287 |
288 | func resize(height: CGFloat) -> UIImage {
289 | let width = (height/self.size.height)*self.size.width
290 | return self.resize(size: CGSize(width: width, height: height))
291 | }
292 |
293 | func resize(size: CGSize) -> UIImage {
294 | let widthRatio = size.width/self.size.width
295 | let heightRatio = size.height/self.size.height
296 | var updateSize = size
297 | if(widthRatio > heightRatio) {
298 | updateSize = CGSize(width:self.size.width*heightRatio, height:self.size.height*heightRatio)
299 | } else if heightRatio > widthRatio {
300 | updateSize = CGSize(width:self.size.width*widthRatio, height:self.size.height*widthRatio)
301 | }
302 | UIGraphicsBeginImageContextWithOptions(updateSize, false, UIScreen.main.scale)
303 | self.draw(in: CGRect(origin: .zero, size: updateSize))
304 | let newImage = UIGraphicsGetImageFromCurrentImageContext()
305 | UIGraphicsEndImageContext()
306 | return newImage!
307 | }
308 |
309 | }
310 | extension UIView {
311 | /// Remove all subview
312 | func removeAllSubviews() {
313 | subviews.forEach { $0.removeFromSuperview() }
314 | }
315 |
316 | /// Remove all subview with specific type
317 | func removeAllSubviews(type: T.Type) {
318 | subviews
319 | .filter { $0.isMember(of: type) }
320 | .forEach { $0.removeFromSuperview() }
321 | }
322 | }
323 |
--------------------------------------------------------------------------------
/Find the Differences.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 3629DA74237C635D000E46A3 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3629DA73237C635D000E46A3 /* AppDelegate.swift */; };
11 | 3629DA76237C635D000E46A3 /* GameScene.sks in Resources */ = {isa = PBXBuildFile; fileRef = 3629DA75237C635D000E46A3 /* GameScene.sks */; };
12 | 3629DA78237C635D000E46A3 /* Actions.sks in Resources */ = {isa = PBXBuildFile; fileRef = 3629DA77237C635D000E46A3 /* Actions.sks */; };
13 | 3629DA7A237C635D000E46A3 /* GameScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3629DA79237C635D000E46A3 /* GameScene.swift */; };
14 | 3629DA7C237C635D000E46A3 /* GameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3629DA7B237C635D000E46A3 /* GameViewController.swift */; };
15 | 3629DA7F237C635D000E46A3 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3629DA7D237C635D000E46A3 /* Main.storyboard */; };
16 | 3629DA81237C635F000E46A3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3629DA80237C635F000E46A3 /* Assets.xcassets */; };
17 | 3629DA84237C635F000E46A3 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3629DA82237C635F000E46A3 /* LaunchScreen.storyboard */; };
18 | 3629DA8F237C635F000E46A3 /* Find_the_DifferencesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3629DA8E237C635F000E46A3 /* Find_the_DifferencesTests.swift */; };
19 | 3629DA9A237C635F000E46A3 /* Find_the_DifferencesUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3629DA99237C635F000E46A3 /* Find_the_DifferencesUITests.swift */; };
20 | 3629DAA8237C6509000E46A3 /* PictureObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3629DAA7237C6509000E46A3 /* PictureObject.swift */; };
21 | 3629DAB0237C68CA000E46A3 /* level1_incomplete.png in Resources */ = {isa = PBXBuildFile; fileRef = 3629DAAA237C68C9000E46A3 /* level1_incomplete.png */; };
22 | 3629DAB1237C68CA000E46A3 /* level1_2.png in Resources */ = {isa = PBXBuildFile; fileRef = 3629DAAB237C68C9000E46A3 /* level1_2.png */; };
23 | 3629DAB2237C68CA000E46A3 /* level1_3.png in Resources */ = {isa = PBXBuildFile; fileRef = 3629DAAC237C68C9000E46A3 /* level1_3.png */; };
24 | 3629DAB3237C68CA000E46A3 /* level1_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 3629DAAD237C68C9000E46A3 /* level1_1.png */; };
25 | 3629DAB4237C68CA000E46A3 /* level1_4.png in Resources */ = {isa = PBXBuildFile; fileRef = 3629DAAE237C68C9000E46A3 /* level1_4.png */; };
26 | 3629DAB5237C68CA000E46A3 /* level1_5.png in Resources */ = {isa = PBXBuildFile; fileRef = 3629DAAF237C68C9000E46A3 /* level1_5.png */; };
27 | 3629DAB9237CA6DA000E46A3 /* Controller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3629DAB8237CA6DA000E46A3 /* Controller.swift */; };
28 | 3629DABB237CAE97000E46A3 /* Level.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3629DABA237CAE97000E46A3 /* Level.swift */; };
29 | /* End PBXBuildFile section */
30 |
31 | /* Begin PBXContainerItemProxy section */
32 | 3629DA8B237C635F000E46A3 /* PBXContainerItemProxy */ = {
33 | isa = PBXContainerItemProxy;
34 | containerPortal = 3629DA68237C635D000E46A3 /* Project object */;
35 | proxyType = 1;
36 | remoteGlobalIDString = 3629DA6F237C635D000E46A3;
37 | remoteInfo = "Find the Differences";
38 | };
39 | 3629DA96237C635F000E46A3 /* PBXContainerItemProxy */ = {
40 | isa = PBXContainerItemProxy;
41 | containerPortal = 3629DA68237C635D000E46A3 /* Project object */;
42 | proxyType = 1;
43 | remoteGlobalIDString = 3629DA6F237C635D000E46A3;
44 | remoteInfo = "Find the Differences";
45 | };
46 | /* End PBXContainerItemProxy section */
47 |
48 | /* Begin PBXFileReference section */
49 | 3629DA70237C635D000E46A3 /* Find the Differences.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Find the Differences.app"; sourceTree = BUILT_PRODUCTS_DIR; };
50 | 3629DA73237C635D000E46A3 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
51 | 3629DA75237C635D000E46A3 /* GameScene.sks */ = {isa = PBXFileReference; lastKnownFileType = file.sks; path = GameScene.sks; sourceTree = ""; };
52 | 3629DA77237C635D000E46A3 /* Actions.sks */ = {isa = PBXFileReference; lastKnownFileType = file.sks; path = Actions.sks; sourceTree = ""; };
53 | 3629DA79237C635D000E46A3 /* GameScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameScene.swift; sourceTree = ""; };
54 | 3629DA7B237C635D000E46A3 /* GameViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameViewController.swift; sourceTree = ""; };
55 | 3629DA7E237C635D000E46A3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
56 | 3629DA80237C635F000E46A3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
57 | 3629DA83237C635F000E46A3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
58 | 3629DA85237C635F000E46A3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
59 | 3629DA8A237C635F000E46A3 /* Find the DifferencesTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Find the DifferencesTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
60 | 3629DA8E237C635F000E46A3 /* Find_the_DifferencesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Find_the_DifferencesTests.swift; sourceTree = ""; };
61 | 3629DA90237C635F000E46A3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
62 | 3629DA95237C635F000E46A3 /* Find the DifferencesUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Find the DifferencesUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
63 | 3629DA99237C635F000E46A3 /* Find_the_DifferencesUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Find_the_DifferencesUITests.swift; sourceTree = ""; };
64 | 3629DA9B237C635F000E46A3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
65 | 3629DAA7237C6509000E46A3 /* PictureObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PictureObject.swift; sourceTree = ""; };
66 | 3629DAAA237C68C9000E46A3 /* level1_incomplete.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = level1_incomplete.png; sourceTree = ""; };
67 | 3629DAAB237C68C9000E46A3 /* level1_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = level1_2.png; sourceTree = ""; };
68 | 3629DAAC237C68C9000E46A3 /* level1_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = level1_3.png; sourceTree = ""; };
69 | 3629DAAD237C68C9000E46A3 /* level1_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = level1_1.png; sourceTree = ""; };
70 | 3629DAAE237C68C9000E46A3 /* level1_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = level1_4.png; sourceTree = ""; };
71 | 3629DAAF237C68C9000E46A3 /* level1_5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = level1_5.png; sourceTree = ""; };
72 | 3629DAB8237CA6DA000E46A3 /* Controller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Controller.swift; sourceTree = ""; };
73 | 3629DABA237CAE97000E46A3 /* Level.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Level.swift; sourceTree = ""; };
74 | /* End PBXFileReference section */
75 |
76 | /* Begin PBXFrameworksBuildPhase section */
77 | 3629DA6D237C635D000E46A3 /* Frameworks */ = {
78 | isa = PBXFrameworksBuildPhase;
79 | buildActionMask = 2147483647;
80 | files = (
81 | );
82 | runOnlyForDeploymentPostprocessing = 0;
83 | };
84 | 3629DA87237C635F000E46A3 /* Frameworks */ = {
85 | isa = PBXFrameworksBuildPhase;
86 | buildActionMask = 2147483647;
87 | files = (
88 | );
89 | runOnlyForDeploymentPostprocessing = 0;
90 | };
91 | 3629DA92237C635F000E46A3 /* Frameworks */ = {
92 | isa = PBXFrameworksBuildPhase;
93 | buildActionMask = 2147483647;
94 | files = (
95 | );
96 | runOnlyForDeploymentPostprocessing = 0;
97 | };
98 | /* End PBXFrameworksBuildPhase section */
99 |
100 | /* Begin PBXGroup section */
101 | 3629DA67237C635D000E46A3 = {
102 | isa = PBXGroup;
103 | children = (
104 | 3629DA72237C635D000E46A3 /* Find the Differences */,
105 | 3629DA8D237C635F000E46A3 /* Find the DifferencesTests */,
106 | 3629DA98237C635F000E46A3 /* Find the DifferencesUITests */,
107 | 3629DA71237C635D000E46A3 /* Products */,
108 | );
109 | sourceTree = "";
110 | };
111 | 3629DA71237C635D000E46A3 /* Products */ = {
112 | isa = PBXGroup;
113 | children = (
114 | 3629DA70237C635D000E46A3 /* Find the Differences.app */,
115 | 3629DA8A237C635F000E46A3 /* Find the DifferencesTests.xctest */,
116 | 3629DA95237C635F000E46A3 /* Find the DifferencesUITests.xctest */,
117 | );
118 | name = Products;
119 | sourceTree = "";
120 | };
121 | 3629DA72237C635D000E46A3 /* Find the Differences */ = {
122 | isa = PBXGroup;
123 | children = (
124 | 3629DABE237CB172000E46A3 /* controller */,
125 | 3629DABD237CB162000E46A3 /* views */,
126 | 3629DABC237CB14F000E46A3 /* modal */,
127 | 3629DAA9237C68C9000E46A3 /* resources */,
128 | 3629DA73237C635D000E46A3 /* AppDelegate.swift */,
129 | 3629DA75237C635D000E46A3 /* GameScene.sks */,
130 | 3629DA77237C635D000E46A3 /* Actions.sks */,
131 | 3629DA7D237C635D000E46A3 /* Main.storyboard */,
132 | 3629DA80237C635F000E46A3 /* Assets.xcassets */,
133 | 3629DA82237C635F000E46A3 /* LaunchScreen.storyboard */,
134 | 3629DA85237C635F000E46A3 /* Info.plist */,
135 | );
136 | path = "Find the Differences";
137 | sourceTree = "";
138 | };
139 | 3629DA8D237C635F000E46A3 /* Find the DifferencesTests */ = {
140 | isa = PBXGroup;
141 | children = (
142 | 3629DA8E237C635F000E46A3 /* Find_the_DifferencesTests.swift */,
143 | 3629DA90237C635F000E46A3 /* Info.plist */,
144 | );
145 | path = "Find the DifferencesTests";
146 | sourceTree = "";
147 | };
148 | 3629DA98237C635F000E46A3 /* Find the DifferencesUITests */ = {
149 | isa = PBXGroup;
150 | children = (
151 | 3629DA99237C635F000E46A3 /* Find_the_DifferencesUITests.swift */,
152 | 3629DA9B237C635F000E46A3 /* Info.plist */,
153 | );
154 | path = "Find the DifferencesUITests";
155 | sourceTree = "";
156 | };
157 | 3629DAA9237C68C9000E46A3 /* resources */ = {
158 | isa = PBXGroup;
159 | children = (
160 | 3629DAAA237C68C9000E46A3 /* level1_incomplete.png */,
161 | 3629DAAB237C68C9000E46A3 /* level1_2.png */,
162 | 3629DAAC237C68C9000E46A3 /* level1_3.png */,
163 | 3629DAAD237C68C9000E46A3 /* level1_1.png */,
164 | 3629DAAE237C68C9000E46A3 /* level1_4.png */,
165 | 3629DAAF237C68C9000E46A3 /* level1_5.png */,
166 | );
167 | path = resources;
168 | sourceTree = "";
169 | };
170 | 3629DABC237CB14F000E46A3 /* modal */ = {
171 | isa = PBXGroup;
172 | children = (
173 | 3629DAA7237C6509000E46A3 /* PictureObject.swift */,
174 | 3629DABA237CAE97000E46A3 /* Level.swift */,
175 | );
176 | path = modal;
177 | sourceTree = "";
178 | };
179 | 3629DABD237CB162000E46A3 /* views */ = {
180 | isa = PBXGroup;
181 | children = (
182 | 3629DA79237C635D000E46A3 /* GameScene.swift */,
183 | 3629DA7B237C635D000E46A3 /* GameViewController.swift */,
184 | );
185 | path = views;
186 | sourceTree = "";
187 | };
188 | 3629DABE237CB172000E46A3 /* controller */ = {
189 | isa = PBXGroup;
190 | children = (
191 | 3629DAB8237CA6DA000E46A3 /* Controller.swift */,
192 | );
193 | path = controller;
194 | sourceTree = "";
195 | };
196 | /* End PBXGroup section */
197 |
198 | /* Begin PBXNativeTarget section */
199 | 3629DA6F237C635D000E46A3 /* Find the Differences */ = {
200 | isa = PBXNativeTarget;
201 | buildConfigurationList = 3629DA9E237C635F000E46A3 /* Build configuration list for PBXNativeTarget "Find the Differences" */;
202 | buildPhases = (
203 | 3629DA6C237C635D000E46A3 /* Sources */,
204 | 3629DA6D237C635D000E46A3 /* Frameworks */,
205 | 3629DA6E237C635D000E46A3 /* Resources */,
206 | );
207 | buildRules = (
208 | );
209 | dependencies = (
210 | );
211 | name = "Find the Differences";
212 | productName = "Find the Differences";
213 | productReference = 3629DA70237C635D000E46A3 /* Find the Differences.app */;
214 | productType = "com.apple.product-type.application";
215 | };
216 | 3629DA89237C635F000E46A3 /* Find the DifferencesTests */ = {
217 | isa = PBXNativeTarget;
218 | buildConfigurationList = 3629DAA1237C635F000E46A3 /* Build configuration list for PBXNativeTarget "Find the DifferencesTests" */;
219 | buildPhases = (
220 | 3629DA86237C635F000E46A3 /* Sources */,
221 | 3629DA87237C635F000E46A3 /* Frameworks */,
222 | 3629DA88237C635F000E46A3 /* Resources */,
223 | );
224 | buildRules = (
225 | );
226 | dependencies = (
227 | 3629DA8C237C635F000E46A3 /* PBXTargetDependency */,
228 | );
229 | name = "Find the DifferencesTests";
230 | productName = "Find the DifferencesTests";
231 | productReference = 3629DA8A237C635F000E46A3 /* Find the DifferencesTests.xctest */;
232 | productType = "com.apple.product-type.bundle.unit-test";
233 | };
234 | 3629DA94237C635F000E46A3 /* Find the DifferencesUITests */ = {
235 | isa = PBXNativeTarget;
236 | buildConfigurationList = 3629DAA4237C635F000E46A3 /* Build configuration list for PBXNativeTarget "Find the DifferencesUITests" */;
237 | buildPhases = (
238 | 3629DA91237C635F000E46A3 /* Sources */,
239 | 3629DA92237C635F000E46A3 /* Frameworks */,
240 | 3629DA93237C635F000E46A3 /* Resources */,
241 | );
242 | buildRules = (
243 | );
244 | dependencies = (
245 | 3629DA97237C635F000E46A3 /* PBXTargetDependency */,
246 | );
247 | name = "Find the DifferencesUITests";
248 | productName = "Find the DifferencesUITests";
249 | productReference = 3629DA95237C635F000E46A3 /* Find the DifferencesUITests.xctest */;
250 | productType = "com.apple.product-type.bundle.ui-testing";
251 | };
252 | /* End PBXNativeTarget section */
253 |
254 | /* Begin PBXProject section */
255 | 3629DA68237C635D000E46A3 /* Project object */ = {
256 | isa = PBXProject;
257 | attributes = {
258 | LastSwiftUpdateCheck = 1120;
259 | LastUpgradeCheck = 1120;
260 | ORGANIZATIONNAME = "Woody Apps";
261 | TargetAttributes = {
262 | 3629DA6F237C635D000E46A3 = {
263 | CreatedOnToolsVersion = 11.2.1;
264 | };
265 | 3629DA89237C635F000E46A3 = {
266 | CreatedOnToolsVersion = 11.2.1;
267 | TestTargetID = 3629DA6F237C635D000E46A3;
268 | };
269 | 3629DA94237C635F000E46A3 = {
270 | CreatedOnToolsVersion = 11.2.1;
271 | TestTargetID = 3629DA6F237C635D000E46A3;
272 | };
273 | };
274 | };
275 | buildConfigurationList = 3629DA6B237C635D000E46A3 /* Build configuration list for PBXProject "Find the Differences" */;
276 | compatibilityVersion = "Xcode 9.3";
277 | developmentRegion = en;
278 | hasScannedForEncodings = 0;
279 | knownRegions = (
280 | en,
281 | Base,
282 | );
283 | mainGroup = 3629DA67237C635D000E46A3;
284 | productRefGroup = 3629DA71237C635D000E46A3 /* Products */;
285 | projectDirPath = "";
286 | projectRoot = "";
287 | targets = (
288 | 3629DA6F237C635D000E46A3 /* Find the Differences */,
289 | 3629DA89237C635F000E46A3 /* Find the DifferencesTests */,
290 | 3629DA94237C635F000E46A3 /* Find the DifferencesUITests */,
291 | );
292 | };
293 | /* End PBXProject section */
294 |
295 | /* Begin PBXResourcesBuildPhase section */
296 | 3629DA6E237C635D000E46A3 /* Resources */ = {
297 | isa = PBXResourcesBuildPhase;
298 | buildActionMask = 2147483647;
299 | files = (
300 | 3629DA7F237C635D000E46A3 /* Main.storyboard in Resources */,
301 | 3629DAB5237C68CA000E46A3 /* level1_5.png in Resources */,
302 | 3629DA76237C635D000E46A3 /* GameScene.sks in Resources */,
303 | 3629DAB2237C68CA000E46A3 /* level1_3.png in Resources */,
304 | 3629DA81237C635F000E46A3 /* Assets.xcassets in Resources */,
305 | 3629DA84237C635F000E46A3 /* LaunchScreen.storyboard in Resources */,
306 | 3629DAB4237C68CA000E46A3 /* level1_4.png in Resources */,
307 | 3629DAB3237C68CA000E46A3 /* level1_1.png in Resources */,
308 | 3629DAB0237C68CA000E46A3 /* level1_incomplete.png in Resources */,
309 | 3629DA78237C635D000E46A3 /* Actions.sks in Resources */,
310 | 3629DAB1237C68CA000E46A3 /* level1_2.png in Resources */,
311 | );
312 | runOnlyForDeploymentPostprocessing = 0;
313 | };
314 | 3629DA88237C635F000E46A3 /* Resources */ = {
315 | isa = PBXResourcesBuildPhase;
316 | buildActionMask = 2147483647;
317 | files = (
318 | );
319 | runOnlyForDeploymentPostprocessing = 0;
320 | };
321 | 3629DA93237C635F000E46A3 /* Resources */ = {
322 | isa = PBXResourcesBuildPhase;
323 | buildActionMask = 2147483647;
324 | files = (
325 | );
326 | runOnlyForDeploymentPostprocessing = 0;
327 | };
328 | /* End PBXResourcesBuildPhase section */
329 |
330 | /* Begin PBXSourcesBuildPhase section */
331 | 3629DA6C237C635D000E46A3 /* Sources */ = {
332 | isa = PBXSourcesBuildPhase;
333 | buildActionMask = 2147483647;
334 | files = (
335 | 3629DABB237CAE97000E46A3 /* Level.swift in Sources */,
336 | 3629DA7A237C635D000E46A3 /* GameScene.swift in Sources */,
337 | 3629DAA8237C6509000E46A3 /* PictureObject.swift in Sources */,
338 | 3629DA7C237C635D000E46A3 /* GameViewController.swift in Sources */,
339 | 3629DAB9237CA6DA000E46A3 /* Controller.swift in Sources */,
340 | 3629DA74237C635D000E46A3 /* AppDelegate.swift in Sources */,
341 | );
342 | runOnlyForDeploymentPostprocessing = 0;
343 | };
344 | 3629DA86237C635F000E46A3 /* Sources */ = {
345 | isa = PBXSourcesBuildPhase;
346 | buildActionMask = 2147483647;
347 | files = (
348 | 3629DA8F237C635F000E46A3 /* Find_the_DifferencesTests.swift in Sources */,
349 | );
350 | runOnlyForDeploymentPostprocessing = 0;
351 | };
352 | 3629DA91237C635F000E46A3 /* Sources */ = {
353 | isa = PBXSourcesBuildPhase;
354 | buildActionMask = 2147483647;
355 | files = (
356 | 3629DA9A237C635F000E46A3 /* Find_the_DifferencesUITests.swift in Sources */,
357 | );
358 | runOnlyForDeploymentPostprocessing = 0;
359 | };
360 | /* End PBXSourcesBuildPhase section */
361 |
362 | /* Begin PBXTargetDependency section */
363 | 3629DA8C237C635F000E46A3 /* PBXTargetDependency */ = {
364 | isa = PBXTargetDependency;
365 | target = 3629DA6F237C635D000E46A3 /* Find the Differences */;
366 | targetProxy = 3629DA8B237C635F000E46A3 /* PBXContainerItemProxy */;
367 | };
368 | 3629DA97237C635F000E46A3 /* PBXTargetDependency */ = {
369 | isa = PBXTargetDependency;
370 | target = 3629DA6F237C635D000E46A3 /* Find the Differences */;
371 | targetProxy = 3629DA96237C635F000E46A3 /* PBXContainerItemProxy */;
372 | };
373 | /* End PBXTargetDependency section */
374 |
375 | /* Begin PBXVariantGroup section */
376 | 3629DA7D237C635D000E46A3 /* Main.storyboard */ = {
377 | isa = PBXVariantGroup;
378 | children = (
379 | 3629DA7E237C635D000E46A3 /* Base */,
380 | );
381 | name = Main.storyboard;
382 | sourceTree = "";
383 | };
384 | 3629DA82237C635F000E46A3 /* LaunchScreen.storyboard */ = {
385 | isa = PBXVariantGroup;
386 | children = (
387 | 3629DA83237C635F000E46A3 /* Base */,
388 | );
389 | name = LaunchScreen.storyboard;
390 | sourceTree = "";
391 | };
392 | /* End PBXVariantGroup section */
393 |
394 | /* Begin XCBuildConfiguration section */
395 | 3629DA9C237C635F000E46A3 /* Debug */ = {
396 | isa = XCBuildConfiguration;
397 | buildSettings = {
398 | ALWAYS_SEARCH_USER_PATHS = NO;
399 | CLANG_ANALYZER_NONNULL = YES;
400 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
401 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
402 | CLANG_CXX_LIBRARY = "libc++";
403 | CLANG_ENABLE_MODULES = YES;
404 | CLANG_ENABLE_OBJC_ARC = YES;
405 | CLANG_ENABLE_OBJC_WEAK = YES;
406 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
407 | CLANG_WARN_BOOL_CONVERSION = YES;
408 | CLANG_WARN_COMMA = YES;
409 | CLANG_WARN_CONSTANT_CONVERSION = YES;
410 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
411 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
412 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
413 | CLANG_WARN_EMPTY_BODY = YES;
414 | CLANG_WARN_ENUM_CONVERSION = YES;
415 | CLANG_WARN_INFINITE_RECURSION = YES;
416 | CLANG_WARN_INT_CONVERSION = YES;
417 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
418 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
419 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
420 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
421 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
422 | CLANG_WARN_STRICT_PROTOTYPES = YES;
423 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
424 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
425 | CLANG_WARN_UNREACHABLE_CODE = YES;
426 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
427 | COPY_PHASE_STRIP = NO;
428 | DEBUG_INFORMATION_FORMAT = dwarf;
429 | ENABLE_STRICT_OBJC_MSGSEND = YES;
430 | ENABLE_TESTABILITY = YES;
431 | GCC_C_LANGUAGE_STANDARD = gnu11;
432 | GCC_DYNAMIC_NO_PIC = NO;
433 | GCC_NO_COMMON_BLOCKS = YES;
434 | GCC_OPTIMIZATION_LEVEL = 0;
435 | GCC_PREPROCESSOR_DEFINITIONS = (
436 | "DEBUG=1",
437 | "$(inherited)",
438 | );
439 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
440 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
441 | GCC_WARN_UNDECLARED_SELECTOR = YES;
442 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
443 | GCC_WARN_UNUSED_FUNCTION = YES;
444 | GCC_WARN_UNUSED_VARIABLE = YES;
445 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
446 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
447 | MTL_FAST_MATH = YES;
448 | ONLY_ACTIVE_ARCH = YES;
449 | SDKROOT = iphoneos;
450 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
451 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
452 | };
453 | name = Debug;
454 | };
455 | 3629DA9D237C635F000E46A3 /* Release */ = {
456 | isa = XCBuildConfiguration;
457 | buildSettings = {
458 | ALWAYS_SEARCH_USER_PATHS = NO;
459 | CLANG_ANALYZER_NONNULL = YES;
460 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
461 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
462 | CLANG_CXX_LIBRARY = "libc++";
463 | CLANG_ENABLE_MODULES = YES;
464 | CLANG_ENABLE_OBJC_ARC = YES;
465 | CLANG_ENABLE_OBJC_WEAK = YES;
466 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
467 | CLANG_WARN_BOOL_CONVERSION = YES;
468 | CLANG_WARN_COMMA = YES;
469 | CLANG_WARN_CONSTANT_CONVERSION = YES;
470 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
471 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
472 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
473 | CLANG_WARN_EMPTY_BODY = YES;
474 | CLANG_WARN_ENUM_CONVERSION = YES;
475 | CLANG_WARN_INFINITE_RECURSION = YES;
476 | CLANG_WARN_INT_CONVERSION = YES;
477 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
478 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
479 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
480 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
481 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
482 | CLANG_WARN_STRICT_PROTOTYPES = YES;
483 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
484 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
485 | CLANG_WARN_UNREACHABLE_CODE = YES;
486 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
487 | COPY_PHASE_STRIP = NO;
488 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
489 | ENABLE_NS_ASSERTIONS = NO;
490 | ENABLE_STRICT_OBJC_MSGSEND = YES;
491 | GCC_C_LANGUAGE_STANDARD = gnu11;
492 | GCC_NO_COMMON_BLOCKS = YES;
493 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
494 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
495 | GCC_WARN_UNDECLARED_SELECTOR = YES;
496 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
497 | GCC_WARN_UNUSED_FUNCTION = YES;
498 | GCC_WARN_UNUSED_VARIABLE = YES;
499 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
500 | MTL_ENABLE_DEBUG_INFO = NO;
501 | MTL_FAST_MATH = YES;
502 | SDKROOT = iphoneos;
503 | SWIFT_COMPILATION_MODE = wholemodule;
504 | SWIFT_OPTIMIZATION_LEVEL = "-O";
505 | VALIDATE_PRODUCT = YES;
506 | };
507 | name = Release;
508 | };
509 | 3629DA9F237C635F000E46A3 /* Debug */ = {
510 | isa = XCBuildConfiguration;
511 | buildSettings = {
512 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
513 | CODE_SIGN_STYLE = Automatic;
514 | INFOPLIST_FILE = "Find the Differences/Info.plist";
515 | LD_RUNPATH_SEARCH_PATHS = (
516 | "$(inherited)",
517 | "@executable_path/Frameworks",
518 | );
519 | PRODUCT_BUNDLE_IDENTIFIER = "WoodyApps.Find-the-Differences";
520 | PRODUCT_NAME = "$(TARGET_NAME)";
521 | SWIFT_VERSION = 5.0;
522 | TARGETED_DEVICE_FAMILY = "1,2";
523 | };
524 | name = Debug;
525 | };
526 | 3629DAA0237C635F000E46A3 /* Release */ = {
527 | isa = XCBuildConfiguration;
528 | buildSettings = {
529 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
530 | CODE_SIGN_STYLE = Automatic;
531 | INFOPLIST_FILE = "Find the Differences/Info.plist";
532 | LD_RUNPATH_SEARCH_PATHS = (
533 | "$(inherited)",
534 | "@executable_path/Frameworks",
535 | );
536 | PRODUCT_BUNDLE_IDENTIFIER = "WoodyApps.Find-the-Differences";
537 | PRODUCT_NAME = "$(TARGET_NAME)";
538 | SWIFT_VERSION = 5.0;
539 | TARGETED_DEVICE_FAMILY = "1,2";
540 | };
541 | name = Release;
542 | };
543 | 3629DAA2237C635F000E46A3 /* Debug */ = {
544 | isa = XCBuildConfiguration;
545 | buildSettings = {
546 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
547 | BUNDLE_LOADER = "$(TEST_HOST)";
548 | CODE_SIGN_STYLE = Automatic;
549 | INFOPLIST_FILE = "Find the DifferencesTests/Info.plist";
550 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
551 | LD_RUNPATH_SEARCH_PATHS = (
552 | "$(inherited)",
553 | "@executable_path/Frameworks",
554 | "@loader_path/Frameworks",
555 | );
556 | PRODUCT_BUNDLE_IDENTIFIER = "WoodyApps.Find-the-DifferencesTests";
557 | PRODUCT_NAME = "$(TARGET_NAME)";
558 | SWIFT_VERSION = 5.0;
559 | TARGETED_DEVICE_FAMILY = "1,2";
560 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Find the Differences.app/Find the Differences";
561 | };
562 | name = Debug;
563 | };
564 | 3629DAA3237C635F000E46A3 /* Release */ = {
565 | isa = XCBuildConfiguration;
566 | buildSettings = {
567 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
568 | BUNDLE_LOADER = "$(TEST_HOST)";
569 | CODE_SIGN_STYLE = Automatic;
570 | INFOPLIST_FILE = "Find the DifferencesTests/Info.plist";
571 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
572 | LD_RUNPATH_SEARCH_PATHS = (
573 | "$(inherited)",
574 | "@executable_path/Frameworks",
575 | "@loader_path/Frameworks",
576 | );
577 | PRODUCT_BUNDLE_IDENTIFIER = "WoodyApps.Find-the-DifferencesTests";
578 | PRODUCT_NAME = "$(TARGET_NAME)";
579 | SWIFT_VERSION = 5.0;
580 | TARGETED_DEVICE_FAMILY = "1,2";
581 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Find the Differences.app/Find the Differences";
582 | };
583 | name = Release;
584 | };
585 | 3629DAA5237C635F000E46A3 /* Debug */ = {
586 | isa = XCBuildConfiguration;
587 | buildSettings = {
588 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
589 | CODE_SIGN_STYLE = Automatic;
590 | INFOPLIST_FILE = "Find the DifferencesUITests/Info.plist";
591 | LD_RUNPATH_SEARCH_PATHS = (
592 | "$(inherited)",
593 | "@executable_path/Frameworks",
594 | "@loader_path/Frameworks",
595 | );
596 | PRODUCT_BUNDLE_IDENTIFIER = "WoodyApps.Find-the-DifferencesUITests";
597 | PRODUCT_NAME = "$(TARGET_NAME)";
598 | SWIFT_VERSION = 5.0;
599 | TARGETED_DEVICE_FAMILY = "1,2";
600 | TEST_TARGET_NAME = "Find the Differences";
601 | };
602 | name = Debug;
603 | };
604 | 3629DAA6237C635F000E46A3 /* Release */ = {
605 | isa = XCBuildConfiguration;
606 | buildSettings = {
607 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
608 | CODE_SIGN_STYLE = Automatic;
609 | INFOPLIST_FILE = "Find the DifferencesUITests/Info.plist";
610 | LD_RUNPATH_SEARCH_PATHS = (
611 | "$(inherited)",
612 | "@executable_path/Frameworks",
613 | "@loader_path/Frameworks",
614 | );
615 | PRODUCT_BUNDLE_IDENTIFIER = "WoodyApps.Find-the-DifferencesUITests";
616 | PRODUCT_NAME = "$(TARGET_NAME)";
617 | SWIFT_VERSION = 5.0;
618 | TARGETED_DEVICE_FAMILY = "1,2";
619 | TEST_TARGET_NAME = "Find the Differences";
620 | };
621 | name = Release;
622 | };
623 | /* End XCBuildConfiguration section */
624 |
625 | /* Begin XCConfigurationList section */
626 | 3629DA6B237C635D000E46A3 /* Build configuration list for PBXProject "Find the Differences" */ = {
627 | isa = XCConfigurationList;
628 | buildConfigurations = (
629 | 3629DA9C237C635F000E46A3 /* Debug */,
630 | 3629DA9D237C635F000E46A3 /* Release */,
631 | );
632 | defaultConfigurationIsVisible = 0;
633 | defaultConfigurationName = Release;
634 | };
635 | 3629DA9E237C635F000E46A3 /* Build configuration list for PBXNativeTarget "Find the Differences" */ = {
636 | isa = XCConfigurationList;
637 | buildConfigurations = (
638 | 3629DA9F237C635F000E46A3 /* Debug */,
639 | 3629DAA0237C635F000E46A3 /* Release */,
640 | );
641 | defaultConfigurationIsVisible = 0;
642 | defaultConfigurationName = Release;
643 | };
644 | 3629DAA1237C635F000E46A3 /* Build configuration list for PBXNativeTarget "Find the DifferencesTests" */ = {
645 | isa = XCConfigurationList;
646 | buildConfigurations = (
647 | 3629DAA2237C635F000E46A3 /* Debug */,
648 | 3629DAA3237C635F000E46A3 /* Release */,
649 | );
650 | defaultConfigurationIsVisible = 0;
651 | defaultConfigurationName = Release;
652 | };
653 | 3629DAA4237C635F000E46A3 /* Build configuration list for PBXNativeTarget "Find the DifferencesUITests" */ = {
654 | isa = XCConfigurationList;
655 | buildConfigurations = (
656 | 3629DAA5237C635F000E46A3 /* Debug */,
657 | 3629DAA6237C635F000E46A3 /* Release */,
658 | );
659 | defaultConfigurationIsVisible = 0;
660 | defaultConfigurationName = Release;
661 | };
662 | /* End XCConfigurationList section */
663 | };
664 | rootObject = 3629DA68237C635D000E46A3 /* Project object */;
665 | }
666 |
--------------------------------------------------------------------------------