├── Find the Differences.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── Araib.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── Araib.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── xcschememanagement.plist ├── Find the Differences ├── Actions.sks ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ └── found.imageset │ │ ├── Contents.json │ │ └── found.png ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── GameScene.sks ├── Info.plist ├── controller │ └── Controller.swift ├── modal │ ├── Level.swift │ └── PictureObject.swift ├── resources │ ├── level1_1.png │ ├── level1_2.png │ ├── level1_3.png │ ├── level1_4.png │ ├── level1_5.png │ └── level1_incomplete.png └── views │ ├── GameScene.swift │ └── GameViewController.swift ├── Find the DifferencesTests ├── Find_the_DifferencesTests.swift └── Info.plist ├── Find the DifferencesUITests ├── Find_the_DifferencesUITests.swift └── Info.plist └── README.md /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 | -------------------------------------------------------------------------------- /Find the Differences.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Find the Differences.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Find the Differences.xcodeproj/project.xcworkspace/xcuserdata/Araib.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/5de700ec3f9febb4d06cc9a247baa5d73389f65d/Find the Differences.xcodeproj/project.xcworkspace/xcuserdata/Araib.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Find the Differences.xcodeproj/xcuserdata/Araib.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /Find the Differences/Actions.sks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/5de700ec3f9febb4d06cc9a247baa5d73389f65d/Find the Differences/Actions.sks -------------------------------------------------------------------------------- /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/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /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/Assets.xcassets/found.imageset/found.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/5de700ec3f9febb4d06cc9a247baa5d73389f65d/Find the Differences/Assets.xcassets/found.imageset/found.png -------------------------------------------------------------------------------- /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/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/GameScene.sks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/5de700ec3f9febb4d06cc9a247baa5d73389f65d/Find the Differences/GameScene.sks -------------------------------------------------------------------------------- /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 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/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/resources/level1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/5de700ec3f9febb4d06cc9a247baa5d73389f65d/Find the Differences/resources/level1_1.png -------------------------------------------------------------------------------- /Find the Differences/resources/level1_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/5de700ec3f9febb4d06cc9a247baa5d73389f65d/Find the Differences/resources/level1_2.png -------------------------------------------------------------------------------- /Find the Differences/resources/level1_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/5de700ec3f9febb4d06cc9a247baa5d73389f65d/Find the Differences/resources/level1_3.png -------------------------------------------------------------------------------- /Find the Differences/resources/level1_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/5de700ec3f9febb4d06cc9a247baa5d73389f65d/Find the Differences/resources/level1_4.png -------------------------------------------------------------------------------- /Find the Differences/resources/level1_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/5de700ec3f9febb4d06cc9a247baa5d73389f65d/Find the Differences/resources/level1_5.png -------------------------------------------------------------------------------- /Find the Differences/resources/level1_incomplete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AraibKarim/FindallDifferenceGame-iOS/5de700ec3f9febb4d06cc9a247baa5d73389f65d/Find the Differences/resources/level1_incomplete.png -------------------------------------------------------------------------------- /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 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 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 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/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 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 | -------------------------------------------------------------------------------- /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 | ![alt text](https://i.imgur.com/gDy8LNM.png) 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 | --------------------------------------------------------------------------------