├── GradientBGEffect.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcuserdata │ └── raul.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── GradientBGEffect ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json ├── ContentView.swift ├── GradientBGEffectApp.swift └── Preview Content │ └── Preview Assets.xcassets │ └── Contents.json ├── GradientBGEffectTests └── GradientBGEffectTests.swift ├── GradientBGEffectUITests ├── GradientBGEffectUITests.swift └── GradientBGEffectUITestsLaunchTests.swift └── README.md /GradientBGEffect.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 56; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | C4B7C6CB29E6BEDB009A2E3A /* GradientBGEffectApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4B7C6CA29E6BEDB009A2E3A /* GradientBGEffectApp.swift */; }; 11 | C4B7C6CD29E6BEDB009A2E3A /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4B7C6CC29E6BEDB009A2E3A /* ContentView.swift */; }; 12 | C4B7C6CF29E6BEDC009A2E3A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C4B7C6CE29E6BEDC009A2E3A /* Assets.xcassets */; }; 13 | C4B7C6D229E6BEDC009A2E3A /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C4B7C6D129E6BEDC009A2E3A /* Preview Assets.xcassets */; }; 14 | C4B7C6DC29E6BEDC009A2E3A /* GradientBGEffectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4B7C6DB29E6BEDC009A2E3A /* GradientBGEffectTests.swift */; }; 15 | C4B7C6E629E6BEDC009A2E3A /* GradientBGEffectUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4B7C6E529E6BEDC009A2E3A /* GradientBGEffectUITests.swift */; }; 16 | C4B7C6E829E6BEDC009A2E3A /* GradientBGEffectUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4B7C6E729E6BEDC009A2E3A /* GradientBGEffectUITestsLaunchTests.swift */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXContainerItemProxy section */ 20 | C4B7C6D829E6BEDC009A2E3A /* PBXContainerItemProxy */ = { 21 | isa = PBXContainerItemProxy; 22 | containerPortal = C4B7C6BF29E6BEDB009A2E3A /* Project object */; 23 | proxyType = 1; 24 | remoteGlobalIDString = C4B7C6C629E6BEDB009A2E3A; 25 | remoteInfo = GradientBGEffect; 26 | }; 27 | C4B7C6E229E6BEDC009A2E3A /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = C4B7C6BF29E6BEDB009A2E3A /* Project object */; 30 | proxyType = 1; 31 | remoteGlobalIDString = C4B7C6C629E6BEDB009A2E3A; 32 | remoteInfo = GradientBGEffect; 33 | }; 34 | /* End PBXContainerItemProxy section */ 35 | 36 | /* Begin PBXFileReference section */ 37 | C4B7C6C729E6BEDB009A2E3A /* GradientBGEffect.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GradientBGEffect.app; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | C4B7C6CA29E6BEDB009A2E3A /* GradientBGEffectApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientBGEffectApp.swift; sourceTree = ""; }; 39 | C4B7C6CC29E6BEDB009A2E3A /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 40 | C4B7C6CE29E6BEDC009A2E3A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 41 | C4B7C6D129E6BEDC009A2E3A /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 42 | C4B7C6D729E6BEDC009A2E3A /* GradientBGEffectTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GradientBGEffectTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | C4B7C6DB29E6BEDC009A2E3A /* GradientBGEffectTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientBGEffectTests.swift; sourceTree = ""; }; 44 | C4B7C6E129E6BEDC009A2E3A /* GradientBGEffectUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GradientBGEffectUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | C4B7C6E529E6BEDC009A2E3A /* GradientBGEffectUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientBGEffectUITests.swift; sourceTree = ""; }; 46 | C4B7C6E729E6BEDC009A2E3A /* GradientBGEffectUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientBGEffectUITestsLaunchTests.swift; sourceTree = ""; }; 47 | /* End PBXFileReference section */ 48 | 49 | /* Begin PBXFrameworksBuildPhase section */ 50 | C4B7C6C429E6BEDB009A2E3A /* Frameworks */ = { 51 | isa = PBXFrameworksBuildPhase; 52 | buildActionMask = 2147483647; 53 | files = ( 54 | ); 55 | runOnlyForDeploymentPostprocessing = 0; 56 | }; 57 | C4B7C6D429E6BEDC009A2E3A /* Frameworks */ = { 58 | isa = PBXFrameworksBuildPhase; 59 | buildActionMask = 2147483647; 60 | files = ( 61 | ); 62 | runOnlyForDeploymentPostprocessing = 0; 63 | }; 64 | C4B7C6DE29E6BEDC009A2E3A /* Frameworks */ = { 65 | isa = PBXFrameworksBuildPhase; 66 | buildActionMask = 2147483647; 67 | files = ( 68 | ); 69 | runOnlyForDeploymentPostprocessing = 0; 70 | }; 71 | /* End PBXFrameworksBuildPhase section */ 72 | 73 | /* Begin PBXGroup section */ 74 | C4B7C6BE29E6BEDB009A2E3A = { 75 | isa = PBXGroup; 76 | children = ( 77 | C4B7C6C929E6BEDB009A2E3A /* GradientBGEffect */, 78 | C4B7C6DA29E6BEDC009A2E3A /* GradientBGEffectTests */, 79 | C4B7C6E429E6BEDC009A2E3A /* GradientBGEffectUITests */, 80 | C4B7C6C829E6BEDB009A2E3A /* Products */, 81 | ); 82 | sourceTree = ""; 83 | }; 84 | C4B7C6C829E6BEDB009A2E3A /* Products */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | C4B7C6C729E6BEDB009A2E3A /* GradientBGEffect.app */, 88 | C4B7C6D729E6BEDC009A2E3A /* GradientBGEffectTests.xctest */, 89 | C4B7C6E129E6BEDC009A2E3A /* GradientBGEffectUITests.xctest */, 90 | ); 91 | name = Products; 92 | sourceTree = ""; 93 | }; 94 | C4B7C6C929E6BEDB009A2E3A /* GradientBGEffect */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | C4B7C6CA29E6BEDB009A2E3A /* GradientBGEffectApp.swift */, 98 | C4B7C6CC29E6BEDB009A2E3A /* ContentView.swift */, 99 | C4B7C6CE29E6BEDC009A2E3A /* Assets.xcassets */, 100 | C4B7C6D029E6BEDC009A2E3A /* Preview Content */, 101 | ); 102 | path = GradientBGEffect; 103 | sourceTree = ""; 104 | }; 105 | C4B7C6D029E6BEDC009A2E3A /* Preview Content */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | C4B7C6D129E6BEDC009A2E3A /* Preview Assets.xcassets */, 109 | ); 110 | path = "Preview Content"; 111 | sourceTree = ""; 112 | }; 113 | C4B7C6DA29E6BEDC009A2E3A /* GradientBGEffectTests */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | C4B7C6DB29E6BEDC009A2E3A /* GradientBGEffectTests.swift */, 117 | ); 118 | path = GradientBGEffectTests; 119 | sourceTree = ""; 120 | }; 121 | C4B7C6E429E6BEDC009A2E3A /* GradientBGEffectUITests */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | C4B7C6E529E6BEDC009A2E3A /* GradientBGEffectUITests.swift */, 125 | C4B7C6E729E6BEDC009A2E3A /* GradientBGEffectUITestsLaunchTests.swift */, 126 | ); 127 | path = GradientBGEffectUITests; 128 | sourceTree = ""; 129 | }; 130 | /* End PBXGroup section */ 131 | 132 | /* Begin PBXNativeTarget section */ 133 | C4B7C6C629E6BEDB009A2E3A /* GradientBGEffect */ = { 134 | isa = PBXNativeTarget; 135 | buildConfigurationList = C4B7C6EB29E6BEDC009A2E3A /* Build configuration list for PBXNativeTarget "GradientBGEffect" */; 136 | buildPhases = ( 137 | C4B7C6C329E6BEDB009A2E3A /* Sources */, 138 | C4B7C6C429E6BEDB009A2E3A /* Frameworks */, 139 | C4B7C6C529E6BEDB009A2E3A /* Resources */, 140 | ); 141 | buildRules = ( 142 | ); 143 | dependencies = ( 144 | ); 145 | name = GradientBGEffect; 146 | productName = GradientBGEffect; 147 | productReference = C4B7C6C729E6BEDB009A2E3A /* GradientBGEffect.app */; 148 | productType = "com.apple.product-type.application"; 149 | }; 150 | C4B7C6D629E6BEDC009A2E3A /* GradientBGEffectTests */ = { 151 | isa = PBXNativeTarget; 152 | buildConfigurationList = C4B7C6EE29E6BEDC009A2E3A /* Build configuration list for PBXNativeTarget "GradientBGEffectTests" */; 153 | buildPhases = ( 154 | C4B7C6D329E6BEDC009A2E3A /* Sources */, 155 | C4B7C6D429E6BEDC009A2E3A /* Frameworks */, 156 | C4B7C6D529E6BEDC009A2E3A /* Resources */, 157 | ); 158 | buildRules = ( 159 | ); 160 | dependencies = ( 161 | C4B7C6D929E6BEDC009A2E3A /* PBXTargetDependency */, 162 | ); 163 | name = GradientBGEffectTests; 164 | productName = GradientBGEffectTests; 165 | productReference = C4B7C6D729E6BEDC009A2E3A /* GradientBGEffectTests.xctest */; 166 | productType = "com.apple.product-type.bundle.unit-test"; 167 | }; 168 | C4B7C6E029E6BEDC009A2E3A /* GradientBGEffectUITests */ = { 169 | isa = PBXNativeTarget; 170 | buildConfigurationList = C4B7C6F129E6BEDC009A2E3A /* Build configuration list for PBXNativeTarget "GradientBGEffectUITests" */; 171 | buildPhases = ( 172 | C4B7C6DD29E6BEDC009A2E3A /* Sources */, 173 | C4B7C6DE29E6BEDC009A2E3A /* Frameworks */, 174 | C4B7C6DF29E6BEDC009A2E3A /* Resources */, 175 | ); 176 | buildRules = ( 177 | ); 178 | dependencies = ( 179 | C4B7C6E329E6BEDC009A2E3A /* PBXTargetDependency */, 180 | ); 181 | name = GradientBGEffectUITests; 182 | productName = GradientBGEffectUITests; 183 | productReference = C4B7C6E129E6BEDC009A2E3A /* GradientBGEffectUITests.xctest */; 184 | productType = "com.apple.product-type.bundle.ui-testing"; 185 | }; 186 | /* End PBXNativeTarget section */ 187 | 188 | /* Begin PBXProject section */ 189 | C4B7C6BF29E6BEDB009A2E3A /* Project object */ = { 190 | isa = PBXProject; 191 | attributes = { 192 | BuildIndependentTargetsInParallel = 1; 193 | LastSwiftUpdateCheck = 1430; 194 | LastUpgradeCheck = 1430; 195 | TargetAttributes = { 196 | C4B7C6C629E6BEDB009A2E3A = { 197 | CreatedOnToolsVersion = 14.3; 198 | }; 199 | C4B7C6D629E6BEDC009A2E3A = { 200 | CreatedOnToolsVersion = 14.3; 201 | TestTargetID = C4B7C6C629E6BEDB009A2E3A; 202 | }; 203 | C4B7C6E029E6BEDC009A2E3A = { 204 | CreatedOnToolsVersion = 14.3; 205 | TestTargetID = C4B7C6C629E6BEDB009A2E3A; 206 | }; 207 | }; 208 | }; 209 | buildConfigurationList = C4B7C6C229E6BEDB009A2E3A /* Build configuration list for PBXProject "GradientBGEffect" */; 210 | compatibilityVersion = "Xcode 14.0"; 211 | developmentRegion = en; 212 | hasScannedForEncodings = 0; 213 | knownRegions = ( 214 | en, 215 | Base, 216 | ); 217 | mainGroup = C4B7C6BE29E6BEDB009A2E3A; 218 | productRefGroup = C4B7C6C829E6BEDB009A2E3A /* Products */; 219 | projectDirPath = ""; 220 | projectRoot = ""; 221 | targets = ( 222 | C4B7C6C629E6BEDB009A2E3A /* GradientBGEffect */, 223 | C4B7C6D629E6BEDC009A2E3A /* GradientBGEffectTests */, 224 | C4B7C6E029E6BEDC009A2E3A /* GradientBGEffectUITests */, 225 | ); 226 | }; 227 | /* End PBXProject section */ 228 | 229 | /* Begin PBXResourcesBuildPhase section */ 230 | C4B7C6C529E6BEDB009A2E3A /* Resources */ = { 231 | isa = PBXResourcesBuildPhase; 232 | buildActionMask = 2147483647; 233 | files = ( 234 | C4B7C6D229E6BEDC009A2E3A /* Preview Assets.xcassets in Resources */, 235 | C4B7C6CF29E6BEDC009A2E3A /* Assets.xcassets in Resources */, 236 | ); 237 | runOnlyForDeploymentPostprocessing = 0; 238 | }; 239 | C4B7C6D529E6BEDC009A2E3A /* Resources */ = { 240 | isa = PBXResourcesBuildPhase; 241 | buildActionMask = 2147483647; 242 | files = ( 243 | ); 244 | runOnlyForDeploymentPostprocessing = 0; 245 | }; 246 | C4B7C6DF29E6BEDC009A2E3A /* Resources */ = { 247 | isa = PBXResourcesBuildPhase; 248 | buildActionMask = 2147483647; 249 | files = ( 250 | ); 251 | runOnlyForDeploymentPostprocessing = 0; 252 | }; 253 | /* End PBXResourcesBuildPhase section */ 254 | 255 | /* Begin PBXSourcesBuildPhase section */ 256 | C4B7C6C329E6BEDB009A2E3A /* Sources */ = { 257 | isa = PBXSourcesBuildPhase; 258 | buildActionMask = 2147483647; 259 | files = ( 260 | C4B7C6CD29E6BEDB009A2E3A /* ContentView.swift in Sources */, 261 | C4B7C6CB29E6BEDB009A2E3A /* GradientBGEffectApp.swift in Sources */, 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | }; 265 | C4B7C6D329E6BEDC009A2E3A /* Sources */ = { 266 | isa = PBXSourcesBuildPhase; 267 | buildActionMask = 2147483647; 268 | files = ( 269 | C4B7C6DC29E6BEDC009A2E3A /* GradientBGEffectTests.swift in Sources */, 270 | ); 271 | runOnlyForDeploymentPostprocessing = 0; 272 | }; 273 | C4B7C6DD29E6BEDC009A2E3A /* Sources */ = { 274 | isa = PBXSourcesBuildPhase; 275 | buildActionMask = 2147483647; 276 | files = ( 277 | C4B7C6E829E6BEDC009A2E3A /* GradientBGEffectUITestsLaunchTests.swift in Sources */, 278 | C4B7C6E629E6BEDC009A2E3A /* GradientBGEffectUITests.swift in Sources */, 279 | ); 280 | runOnlyForDeploymentPostprocessing = 0; 281 | }; 282 | /* End PBXSourcesBuildPhase section */ 283 | 284 | /* Begin PBXTargetDependency section */ 285 | C4B7C6D929E6BEDC009A2E3A /* PBXTargetDependency */ = { 286 | isa = PBXTargetDependency; 287 | target = C4B7C6C629E6BEDB009A2E3A /* GradientBGEffect */; 288 | targetProxy = C4B7C6D829E6BEDC009A2E3A /* PBXContainerItemProxy */; 289 | }; 290 | C4B7C6E329E6BEDC009A2E3A /* PBXTargetDependency */ = { 291 | isa = PBXTargetDependency; 292 | target = C4B7C6C629E6BEDB009A2E3A /* GradientBGEffect */; 293 | targetProxy = C4B7C6E229E6BEDC009A2E3A /* PBXContainerItemProxy */; 294 | }; 295 | /* End PBXTargetDependency section */ 296 | 297 | /* Begin XCBuildConfiguration section */ 298 | C4B7C6E929E6BEDC009A2E3A /* Debug */ = { 299 | isa = XCBuildConfiguration; 300 | buildSettings = { 301 | ALWAYS_SEARCH_USER_PATHS = NO; 302 | CLANG_ANALYZER_NONNULL = YES; 303 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 304 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 305 | CLANG_ENABLE_MODULES = YES; 306 | CLANG_ENABLE_OBJC_ARC = YES; 307 | CLANG_ENABLE_OBJC_WEAK = YES; 308 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 309 | CLANG_WARN_BOOL_CONVERSION = YES; 310 | CLANG_WARN_COMMA = YES; 311 | CLANG_WARN_CONSTANT_CONVERSION = YES; 312 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 313 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 314 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 315 | CLANG_WARN_EMPTY_BODY = YES; 316 | CLANG_WARN_ENUM_CONVERSION = YES; 317 | CLANG_WARN_INFINITE_RECURSION = YES; 318 | CLANG_WARN_INT_CONVERSION = YES; 319 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 320 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 321 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 322 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 323 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 324 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 325 | CLANG_WARN_STRICT_PROTOTYPES = YES; 326 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 327 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 328 | CLANG_WARN_UNREACHABLE_CODE = YES; 329 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 330 | COPY_PHASE_STRIP = NO; 331 | DEBUG_INFORMATION_FORMAT = dwarf; 332 | ENABLE_STRICT_OBJC_MSGSEND = YES; 333 | ENABLE_TESTABILITY = YES; 334 | GCC_C_LANGUAGE_STANDARD = gnu11; 335 | GCC_DYNAMIC_NO_PIC = NO; 336 | GCC_NO_COMMON_BLOCKS = YES; 337 | GCC_OPTIMIZATION_LEVEL = 0; 338 | GCC_PREPROCESSOR_DEFINITIONS = ( 339 | "DEBUG=1", 340 | "$(inherited)", 341 | ); 342 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 343 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 344 | GCC_WARN_UNDECLARED_SELECTOR = YES; 345 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 346 | GCC_WARN_UNUSED_FUNCTION = YES; 347 | GCC_WARN_UNUSED_VARIABLE = YES; 348 | IPHONEOS_DEPLOYMENT_TARGET = 16.4; 349 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 350 | MTL_FAST_MATH = YES; 351 | ONLY_ACTIVE_ARCH = YES; 352 | SDKROOT = iphoneos; 353 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 354 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 355 | }; 356 | name = Debug; 357 | }; 358 | C4B7C6EA29E6BEDC009A2E3A /* Release */ = { 359 | isa = XCBuildConfiguration; 360 | buildSettings = { 361 | ALWAYS_SEARCH_USER_PATHS = NO; 362 | CLANG_ANALYZER_NONNULL = YES; 363 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 364 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 365 | CLANG_ENABLE_MODULES = YES; 366 | CLANG_ENABLE_OBJC_ARC = YES; 367 | CLANG_ENABLE_OBJC_WEAK = YES; 368 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 369 | CLANG_WARN_BOOL_CONVERSION = YES; 370 | CLANG_WARN_COMMA = YES; 371 | CLANG_WARN_CONSTANT_CONVERSION = YES; 372 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 373 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 374 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 375 | CLANG_WARN_EMPTY_BODY = YES; 376 | CLANG_WARN_ENUM_CONVERSION = YES; 377 | CLANG_WARN_INFINITE_RECURSION = YES; 378 | CLANG_WARN_INT_CONVERSION = YES; 379 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 380 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 381 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 382 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 383 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 384 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 385 | CLANG_WARN_STRICT_PROTOTYPES = YES; 386 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 387 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 388 | CLANG_WARN_UNREACHABLE_CODE = YES; 389 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 390 | COPY_PHASE_STRIP = NO; 391 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 392 | ENABLE_NS_ASSERTIONS = NO; 393 | ENABLE_STRICT_OBJC_MSGSEND = YES; 394 | GCC_C_LANGUAGE_STANDARD = gnu11; 395 | GCC_NO_COMMON_BLOCKS = YES; 396 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 397 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 398 | GCC_WARN_UNDECLARED_SELECTOR = YES; 399 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 400 | GCC_WARN_UNUSED_FUNCTION = YES; 401 | GCC_WARN_UNUSED_VARIABLE = YES; 402 | IPHONEOS_DEPLOYMENT_TARGET = 16.4; 403 | MTL_ENABLE_DEBUG_INFO = NO; 404 | MTL_FAST_MATH = YES; 405 | SDKROOT = iphoneos; 406 | SWIFT_COMPILATION_MODE = wholemodule; 407 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 408 | VALIDATE_PRODUCT = YES; 409 | }; 410 | name = Release; 411 | }; 412 | C4B7C6EC29E6BEDC009A2E3A /* Debug */ = { 413 | isa = XCBuildConfiguration; 414 | buildSettings = { 415 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 416 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 417 | CODE_SIGN_STYLE = Automatic; 418 | CURRENT_PROJECT_VERSION = 1; 419 | DEVELOPMENT_ASSET_PATHS = "\"GradientBGEffect/Preview Content\""; 420 | DEVELOPMENT_TEAM = 685NK64Q38; 421 | ENABLE_PREVIEWS = YES; 422 | GENERATE_INFOPLIST_FILE = YES; 423 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 424 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 425 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 426 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 427 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 428 | LD_RUNPATH_SEARCH_PATHS = ( 429 | "$(inherited)", 430 | "@executable_path/Frameworks", 431 | ); 432 | MARKETING_VERSION = 1.0; 433 | PRODUCT_BUNDLE_IDENTIFIER = raul.GradientBGEffect; 434 | PRODUCT_NAME = "$(TARGET_NAME)"; 435 | SWIFT_EMIT_LOC_STRINGS = YES; 436 | SWIFT_VERSION = 5.0; 437 | TARGETED_DEVICE_FAMILY = "1,2"; 438 | }; 439 | name = Debug; 440 | }; 441 | C4B7C6ED29E6BEDC009A2E3A /* Release */ = { 442 | isa = XCBuildConfiguration; 443 | buildSettings = { 444 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 445 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 446 | CODE_SIGN_STYLE = Automatic; 447 | CURRENT_PROJECT_VERSION = 1; 448 | DEVELOPMENT_ASSET_PATHS = "\"GradientBGEffect/Preview Content\""; 449 | DEVELOPMENT_TEAM = 685NK64Q38; 450 | ENABLE_PREVIEWS = YES; 451 | GENERATE_INFOPLIST_FILE = YES; 452 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 453 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 454 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 455 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 456 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 457 | LD_RUNPATH_SEARCH_PATHS = ( 458 | "$(inherited)", 459 | "@executable_path/Frameworks", 460 | ); 461 | MARKETING_VERSION = 1.0; 462 | PRODUCT_BUNDLE_IDENTIFIER = raul.GradientBGEffect; 463 | PRODUCT_NAME = "$(TARGET_NAME)"; 464 | SWIFT_EMIT_LOC_STRINGS = YES; 465 | SWIFT_VERSION = 5.0; 466 | TARGETED_DEVICE_FAMILY = "1,2"; 467 | }; 468 | name = Release; 469 | }; 470 | C4B7C6EF29E6BEDC009A2E3A /* Debug */ = { 471 | isa = XCBuildConfiguration; 472 | buildSettings = { 473 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 474 | BUNDLE_LOADER = "$(TEST_HOST)"; 475 | CODE_SIGN_STYLE = Automatic; 476 | CURRENT_PROJECT_VERSION = 1; 477 | DEVELOPMENT_TEAM = 685NK64Q38; 478 | GENERATE_INFOPLIST_FILE = YES; 479 | IPHONEOS_DEPLOYMENT_TARGET = 16.4; 480 | MARKETING_VERSION = 1.0; 481 | PRODUCT_BUNDLE_IDENTIFIER = raul.GradientBGEffectTests; 482 | PRODUCT_NAME = "$(TARGET_NAME)"; 483 | SWIFT_EMIT_LOC_STRINGS = NO; 484 | SWIFT_VERSION = 5.0; 485 | TARGETED_DEVICE_FAMILY = "1,2"; 486 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GradientBGEffect.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/GradientBGEffect"; 487 | }; 488 | name = Debug; 489 | }; 490 | C4B7C6F029E6BEDC009A2E3A /* Release */ = { 491 | isa = XCBuildConfiguration; 492 | buildSettings = { 493 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 494 | BUNDLE_LOADER = "$(TEST_HOST)"; 495 | CODE_SIGN_STYLE = Automatic; 496 | CURRENT_PROJECT_VERSION = 1; 497 | DEVELOPMENT_TEAM = 685NK64Q38; 498 | GENERATE_INFOPLIST_FILE = YES; 499 | IPHONEOS_DEPLOYMENT_TARGET = 16.4; 500 | MARKETING_VERSION = 1.0; 501 | PRODUCT_BUNDLE_IDENTIFIER = raul.GradientBGEffectTests; 502 | PRODUCT_NAME = "$(TARGET_NAME)"; 503 | SWIFT_EMIT_LOC_STRINGS = NO; 504 | SWIFT_VERSION = 5.0; 505 | TARGETED_DEVICE_FAMILY = "1,2"; 506 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GradientBGEffect.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/GradientBGEffect"; 507 | }; 508 | name = Release; 509 | }; 510 | C4B7C6F229E6BEDC009A2E3A /* Debug */ = { 511 | isa = XCBuildConfiguration; 512 | buildSettings = { 513 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 514 | CODE_SIGN_STYLE = Automatic; 515 | CURRENT_PROJECT_VERSION = 1; 516 | DEVELOPMENT_TEAM = 685NK64Q38; 517 | GENERATE_INFOPLIST_FILE = YES; 518 | MARKETING_VERSION = 1.0; 519 | PRODUCT_BUNDLE_IDENTIFIER = raul.GradientBGEffectUITests; 520 | PRODUCT_NAME = "$(TARGET_NAME)"; 521 | SWIFT_EMIT_LOC_STRINGS = NO; 522 | SWIFT_VERSION = 5.0; 523 | TARGETED_DEVICE_FAMILY = "1,2"; 524 | TEST_TARGET_NAME = GradientBGEffect; 525 | }; 526 | name = Debug; 527 | }; 528 | C4B7C6F329E6BEDC009A2E3A /* Release */ = { 529 | isa = XCBuildConfiguration; 530 | buildSettings = { 531 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 532 | CODE_SIGN_STYLE = Automatic; 533 | CURRENT_PROJECT_VERSION = 1; 534 | DEVELOPMENT_TEAM = 685NK64Q38; 535 | GENERATE_INFOPLIST_FILE = YES; 536 | MARKETING_VERSION = 1.0; 537 | PRODUCT_BUNDLE_IDENTIFIER = raul.GradientBGEffectUITests; 538 | PRODUCT_NAME = "$(TARGET_NAME)"; 539 | SWIFT_EMIT_LOC_STRINGS = NO; 540 | SWIFT_VERSION = 5.0; 541 | TARGETED_DEVICE_FAMILY = "1,2"; 542 | TEST_TARGET_NAME = GradientBGEffect; 543 | }; 544 | name = Release; 545 | }; 546 | /* End XCBuildConfiguration section */ 547 | 548 | /* Begin XCConfigurationList section */ 549 | C4B7C6C229E6BEDB009A2E3A /* Build configuration list for PBXProject "GradientBGEffect" */ = { 550 | isa = XCConfigurationList; 551 | buildConfigurations = ( 552 | C4B7C6E929E6BEDC009A2E3A /* Debug */, 553 | C4B7C6EA29E6BEDC009A2E3A /* Release */, 554 | ); 555 | defaultConfigurationIsVisible = 0; 556 | defaultConfigurationName = Release; 557 | }; 558 | C4B7C6EB29E6BEDC009A2E3A /* Build configuration list for PBXNativeTarget "GradientBGEffect" */ = { 559 | isa = XCConfigurationList; 560 | buildConfigurations = ( 561 | C4B7C6EC29E6BEDC009A2E3A /* Debug */, 562 | C4B7C6ED29E6BEDC009A2E3A /* Release */, 563 | ); 564 | defaultConfigurationIsVisible = 0; 565 | defaultConfigurationName = Release; 566 | }; 567 | C4B7C6EE29E6BEDC009A2E3A /* Build configuration list for PBXNativeTarget "GradientBGEffectTests" */ = { 568 | isa = XCConfigurationList; 569 | buildConfigurations = ( 570 | C4B7C6EF29E6BEDC009A2E3A /* Debug */, 571 | C4B7C6F029E6BEDC009A2E3A /* Release */, 572 | ); 573 | defaultConfigurationIsVisible = 0; 574 | defaultConfigurationName = Release; 575 | }; 576 | C4B7C6F129E6BEDC009A2E3A /* Build configuration list for PBXNativeTarget "GradientBGEffectUITests" */ = { 577 | isa = XCConfigurationList; 578 | buildConfigurations = ( 579 | C4B7C6F229E6BEDC009A2E3A /* Debug */, 580 | C4B7C6F329E6BEDC009A2E3A /* Release */, 581 | ); 582 | defaultConfigurationIsVisible = 0; 583 | defaultConfigurationName = Release; 584 | }; 585 | /* End XCConfigurationList section */ 586 | }; 587 | rootObject = C4B7C6BF29E6BEDB009A2E3A /* Project object */; 588 | } 589 | -------------------------------------------------------------------------------- /GradientBGEffect.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /GradientBGEffect.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /GradientBGEffect.xcodeproj/xcuserdata/raul.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | GradientBGEffect.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /GradientBGEffect/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /GradientBGEffect/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | } 8 | ], 9 | "info" : { 10 | "author" : "xcode", 11 | "version" : 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /GradientBGEffect/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /GradientBGEffect/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // GradientBGEffect 4 | // 5 | // Created by Raul on 12.04.2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ContentView: View { 11 | private enum AnimationProperties { 12 | static let animationSpeed: Double = 4 13 | static let timerDuration: TimeInterval = 3 14 | static let blurRadius: CGFloat = 130 15 | } 16 | 17 | @State private var timer = Timer.publish( 18 | every: AnimationProperties.timerDuration, 19 | on: .main, 20 | in: .common).autoconnect() 21 | 22 | @ObservedObject private var animator = CircleAnimator(colors: GradientColors.all) 23 | 24 | var timeText: some View { 25 | Text("11:23") 26 | .font(.system( 27 | size: 88.0, 28 | weight: .medium, 29 | design: .rounded) 30 | ) 31 | .padding(.top, 50) 32 | } 33 | 34 | var dateText: some View { 35 | Text("Wednesday, 12 April") 36 | .font(.system( 37 | size: 24.0, 38 | weight: .semibold, 39 | design: .rounded) 40 | ) 41 | } 42 | 43 | var body: some View { 44 | ZStack { 45 | ZStack { 46 | ForEach(animator.circles) { circle in 47 | MovingCircle(originOffset: circle.position) 48 | .foregroundColor(circle.color) 49 | } 50 | } 51 | .blur(radius: AnimationProperties.blurRadius) 52 | 53 | VStack { 54 | 55 | timeText 56 | .foregroundColor(.white) 57 | .blendMode(.difference) 58 | .overlay(timeText.blendMode(.hue)) 59 | .overlay(timeText.foregroundColor(.black).blendMode(.overlay)) 60 | 61 | dateText 62 | .foregroundColor(.white) 63 | .blendMode(.difference) 64 | .overlay(dateText.blendMode(.hue)) 65 | .overlay(dateText.foregroundColor(.black).blendMode(.overlay)) 66 | 67 | Spacer() 68 | 69 | HStack { 70 | ZStack{ 71 | Image(systemName: "flashlight.off.fill").font(.title2).foregroundColor(.white) 72 | .padding(18) 73 | } 74 | .background(.ultraThinMaterial) 75 | .clipShape(Circle()) 76 | .blendMode(.difference) 77 | 78 | Spacer() 79 | 80 | ZStack{ 81 | Image(systemName: "camera.fill").font(.title3).foregroundColor(.white) 82 | .padding(16) 83 | } 84 | .background(.ultraThinMaterial) 85 | .clipShape(Circle()) 86 | .blendMode(.difference) 87 | } 88 | .frame(width: 320) 89 | } 90 | } 91 | .background(GradientColors.backgroundColor) 92 | .onDisappear { 93 | timer.upstream.connect().cancel() 94 | } 95 | .onAppear { 96 | animateCircles() 97 | timer = Timer.publish(every: AnimationProperties.timerDuration, on: .main, in: .common).autoconnect() 98 | } 99 | .onReceive(timer) { _ in 100 | animateCircles() 101 | } 102 | } 103 | 104 | private func animateCircles() { 105 | withAnimation(.easeInOut(duration: AnimationProperties.animationSpeed)) { 106 | animator.animate() 107 | } 108 | } 109 | } 110 | 111 | private enum GradientColors { 112 | static var all: [Color] { 113 | [ 114 | Color(#colorLiteral(red: 0.003799867816, green: 0.01174801588, blue: 0.07808648795, alpha: 1)), 115 | Color(#colorLiteral(red: 0.147772789, green: 0.08009552211, blue: 0.3809506595, alpha: 1)), 116 | Color(#colorLiteral(red: 0.5622407794, green: 0.4161503613, blue: 0.9545945525, alpha: 1)), 117 | Color(#colorLiteral(red: 0.7909697294, green: 0.7202591896, blue: 0.9798423648, alpha: 1)), 118 | Color(#colorLiteral(red: 0.7909697294, green: 0.7202591896, blue: 0.9798423648, alpha: 1)), 119 | ] 120 | } 121 | 122 | static var backgroundColor: Color { 123 | Color(#colorLiteral( 124 | red: 0.003799867816, 125 | green: 0.01174801588, 126 | blue: 0.07808648795, 127 | alpha: 1) 128 | ) 129 | } 130 | } 131 | 132 | private struct MovingCircle: Shape { 133 | 134 | var originOffset: CGPoint 135 | 136 | var animatableData: CGPoint.AnimatableData { 137 | get { 138 | originOffset.animatableData 139 | } 140 | set { 141 | originOffset.animatableData = newValue 142 | } 143 | } 144 | 145 | func path(in rect: CGRect) -> Path { 146 | var path = Path() 147 | 148 | let adjustedX = rect.width * originOffset.x 149 | let adjustedY = rect.height * originOffset.y 150 | let smallestDimension = min(rect.width, rect.height) 151 | path.addArc(center: CGPoint(x: adjustedX, y: adjustedY), radius: smallestDimension/2, startAngle: .zero, endAngle: .degrees(360), clockwise: true) 152 | return path 153 | } 154 | } 155 | 156 | private class CircleAnimator: ObservableObject { 157 | class Circle: Identifiable { 158 | internal init(position: CGPoint, color: Color) { 159 | self.position = position 160 | self.color = color 161 | } 162 | var position: CGPoint 163 | let id = UUID().uuidString 164 | let color: Color 165 | } 166 | 167 | @Published private(set) var circles: [Circle] = [] 168 | 169 | 170 | init(colors: [Color]) { 171 | circles = colors.map({ color in 172 | Circle(position: CircleAnimator.generateRandomPosition(), color: color) 173 | }) 174 | } 175 | 176 | func animate() { 177 | objectWillChange.send() 178 | for circle in circles { 179 | circle.position = CircleAnimator.generateRandomPosition() 180 | } 181 | } 182 | 183 | static func generateRandomPosition() -> CGPoint { 184 | CGPoint(x: CGFloat.random(in: 0 ... 1), y: CGFloat.random(in: 0 ... 1)) 185 | } 186 | } 187 | 188 | struct ContentView_Previews: PreviewProvider { 189 | static var previews: some View { 190 | ContentView() 191 | } 192 | } 193 | -------------------------------------------------------------------------------- /GradientBGEffect/GradientBGEffectApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GradientBGEffectApp.swift 3 | // GradientBGEffect 4 | // 5 | // Created by Raul on 12.04.2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct GradientBGEffectApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | ContentView() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /GradientBGEffect/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /GradientBGEffectTests/GradientBGEffectTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GradientBGEffectTests.swift 3 | // GradientBGEffectTests 4 | // 5 | // Created by Raul on 12.04.2023. 6 | // 7 | 8 | import XCTest 9 | @testable import GradientBGEffect 10 | 11 | final class GradientBGEffectTests: XCTestCase { 12 | 13 | override func setUpWithError() throws { 14 | // Put setup code here. This method is called before the invocation of each test method in the class. 15 | } 16 | 17 | override func tearDownWithError() throws { 18 | // Put teardown code here. This method is called after the invocation of each test method in the class. 19 | } 20 | 21 | func testExample() throws { 22 | // This is an example of a functional test case. 23 | // Use XCTAssert and related functions to verify your tests produce the correct results. 24 | // Any test you write for XCTest can be annotated as throws and async. 25 | // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. 26 | // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. 27 | } 28 | 29 | func testPerformanceExample() throws { 30 | // This is an example of a performance test case. 31 | self.measure { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /GradientBGEffectUITests/GradientBGEffectUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GradientBGEffectUITests.swift 3 | // GradientBGEffectUITests 4 | // 5 | // Created by Raul on 12.04.2023. 6 | // 7 | 8 | import XCTest 9 | 10 | final class GradientBGEffectUITests: XCTestCase { 11 | 12 | override func setUpWithError() throws { 13 | // Put setup code here. This method is called before the invocation of each test method in the class. 14 | 15 | // In UI tests it is usually best to stop immediately when a failure occurs. 16 | continueAfterFailure = false 17 | 18 | // 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. 19 | } 20 | 21 | override func tearDownWithError() throws { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | } 24 | 25 | func testExample() throws { 26 | // UI tests must launch the application that they test. 27 | let app = XCUIApplication() 28 | app.launch() 29 | 30 | // Use XCTAssert and related functions to verify your tests produce the correct results. 31 | } 32 | 33 | func testLaunchPerformance() throws { 34 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { 35 | // This measures how long it takes to launch your application. 36 | measure(metrics: [XCTApplicationLaunchMetric()]) { 37 | XCUIApplication().launch() 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /GradientBGEffectUITests/GradientBGEffectUITestsLaunchTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GradientBGEffectUITestsLaunchTests.swift 3 | // GradientBGEffectUITests 4 | // 5 | // Created by Raul on 12.04.2023. 6 | // 7 | 8 | import XCTest 9 | 10 | final class GradientBGEffectUITestsLaunchTests: XCTestCase { 11 | 12 | override class var runsForEachTargetApplicationUIConfiguration: Bool { 13 | true 14 | } 15 | 16 | override func setUpWithError() throws { 17 | continueAfterFailure = false 18 | } 19 | 20 | func testLaunch() throws { 21 | let app = XCUIApplication() 22 | app.launch() 23 | 24 | // Insert steps here to perform after app launch but before taking a screenshot, 25 | // such as logging into a test account or navigating somewhere in the app 26 | 27 | let attachment = XCTAttachment(screenshot: app.screenshot()) 28 | attachment.name = "Launch Screen" 29 | attachment.lifetime = .keepAlways 30 | add(attachment) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Gradient Background Effect 2 | 3 | 4 | https://user-images.githubusercontent.com/6464945/231974318-0c395f28-37f8-486d-b9c7-69dc5df25366.mp4 5 | 6 | --------------------------------------------------------------------------------