From 3003da862769c50320cb460cba77879d5c09af3d Mon Sep 17 00:00:00 2001 From: Onur Ersel Date: Fri, 24 Feb 2017 10:36:12 +0100 Subject: [PATCH] Added bonfire example. --- .codebeatignore | 1 + README.md | 1 + anim.xcodeproj/project.pbxproj | 154 ++++-------------- .../AppIcon.appiconset/Contents.json | 51 ++++-- .../AppIcon.appiconset/icon20.png | Bin 0 -> 499 bytes .../AppIcon.appiconset/icon20@2x-1.png | Bin 0 -> 877 bytes .../AppIcon.appiconset/icon20@2x.png | Bin 0 -> 877 bytes .../AppIcon.appiconset/icon20@3x.png | Bin 0 -> 1134 bytes .../AppIcon.appiconset/icon29.png | Bin 0 -> 666 bytes .../AppIcon.appiconset/icon29@2x-1.png | Bin 0 -> 1051 bytes .../AppIcon.appiconset/icon29@2x.png | Bin 0 -> 1051 bytes .../AppIcon.appiconset/icon29@3x.png | Bin 0 -> 1491 bytes .../AppIcon.appiconset/icon40.png | Bin 0 -> 815 bytes .../AppIcon.appiconset/icon40@2x-1.png | Bin 0 -> 1276 bytes .../AppIcon.appiconset/icon40@2x.png | Bin 0 -> 1276 bytes .../AppIcon.appiconset/icon40@3x.png | Bin 0 -> 1793 bytes .../AppIcon.appiconset/icon76.png | Bin 0 -> 1112 bytes .../AppIcon.appiconset/icon76@2x.png | Bin 0 -> 2239 bytes .../AppIcon.appiconset/icon83-5@2x.png | Bin 0 -> 2114 bytes .../AppIcon.appiconset/icon@2x.png | Bin 0 -> 1549 bytes .../AppIcon.appiconset/icon@3x.png | Bin 0 -> 2022 bytes .../bonfire/Assets.xcassets/Contents.json | 6 + .../anim.imageset/Contents.json | 23 +++ .../Assets.xcassets/anim.imageset/anim.png | Bin 0 -> 546 bytes .../Assets.xcassets/anim.imageset/anim@2x.png | Bin 0 -> 791 bytes .../Assets.xcassets/anim.imageset/anim@3x.png | Bin 0 -> 1099 bytes .../circle_red.imageset/Contents.json | 23 +++ .../circle_red.imageset/circle_red.png | Bin 0 -> 1309 bytes .../circle_red.imageset/circle_red@2x.png | Bin 0 -> 2511 bytes .../circle_red.imageset/circle_red@3x.png | Bin 0 -> 3775 bytes .../particle_red.imageset/Contents.json | 23 +++ .../particle_red.imageset/particle_red.png | Bin 0 -> 405 bytes .../particle_red.imageset/particle_red@2x.png | Bin 0 -> 545 bytes .../particle_red.imageset/particle_red@3x.png | Bin 0 -> 705 bytes .../particle_yellow.imageset/Contents.json | 23 +++ .../particle_yellow.png | Bin 0 -> 502 bytes .../particle_yellow@2x.png | Bin 0 -> 670 bytes .../particle_yellow@3x.png | Bin 0 -> 896 bytes .../rect_orange.imageset/Contents.json | 23 +++ .../rect_orange.imageset/rect_orange.png | Bin 0 -> 1482 bytes .../rect_orange.imageset/rect_orange@2x.png | Bin 0 -> 2323 bytes .../rect_orange.imageset/rect_orange@3x.png | Bin 0 -> 3694 bytes .../rect_red.imageset/Contents.json | 23 +++ .../rect_red.imageset/rect_red.png | Bin 0 -> 1482 bytes .../rect_red.imageset/rect_red@2x.png | Bin 0 -> 2323 bytes .../rect_red.imageset/rect_red@3x.png | Bin 0 -> 3694 bytes .../rect_yellow.imageset/Contents.json | 23 +++ .../rect_yellow.imageset/rect_yellow.png | Bin 0 -> 1482 bytes .../rect_yellow.imageset/rect_yellow@2x.png | Bin 0 -> 2323 bytes .../rect_yellow.imageset/rect_yellow@3x.png | Bin 0 -> 3694 bytes .../wood.imageset/Contents.json | 23 +++ .../Assets.xcassets/wood.imageset/wood.png | Bin 0 -> 1915 bytes .../Assets.xcassets/wood.imageset/wood@2x.png | Bin 0 -> 2791 bytes .../Assets.xcassets/wood.imageset/wood@3x.png | Bin 0 -> 6576 bytes examples/bonfire/Emitter.swift | 54 ++++-- examples/bonfire/Particle.swift | 153 +++++++++-------- examples/bonfire/ViewController.swift | 88 +++++++++- examples/circle-menu/ViewController.swift | 23 --- .../background.imageset/background.png | Bin 2022 -> 0 bytes .../background.imageset/background@2x.png | Bin 4480 -> 0 bytes .../background.imageset/background@3x.png | Bin 7641 -> 0 bytes .../background_pattern.imageset/Contents.json | 23 +++ .../background_pattern.png | Bin 0 -> 685 bytes .../background_pattern@2x.png | Bin 0 -> 602 bytes .../background_pattern@3x.png | Bin 0 -> 1418 bytes .../Contents.json | 30 ++-- .../splash_background.png | Bin 0 -> 642 bytes .../splash_background@2x.png | Bin 0 -> 963 bytes .../splash_background@3x.png | Bin 0 -> 1407 bytes examples/shared/Info.plist | 4 + examples/shared/LaunchScreen.storyboard | 14 +- examples/shared/Layout.swift | 11 +- examples/shared/Math.swift | 36 ++-- 73 files changed, 547 insertions(+), 286 deletions(-) rename examples/{shared => bonfire}/Assets.xcassets/AppIcon.appiconset/Contents.json (71%) create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon20.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon20@2x-1.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon20@2x.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon20@3x.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon29.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon29@2x-1.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon29@2x.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon29@3x.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon40.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon40@2x-1.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon40@2x.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon40@3x.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon76.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon76@2x.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon83-5@2x.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon@2x.png create mode 100644 examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon@3x.png create mode 100644 examples/bonfire/Assets.xcassets/Contents.json create mode 100644 examples/bonfire/Assets.xcassets/anim.imageset/Contents.json create mode 100644 examples/bonfire/Assets.xcassets/anim.imageset/anim.png create mode 100644 examples/bonfire/Assets.xcassets/anim.imageset/anim@2x.png create mode 100644 examples/bonfire/Assets.xcassets/anim.imageset/anim@3x.png create mode 100644 examples/bonfire/Assets.xcassets/circle_red.imageset/Contents.json create mode 100644 examples/bonfire/Assets.xcassets/circle_red.imageset/circle_red.png create mode 100644 examples/bonfire/Assets.xcassets/circle_red.imageset/circle_red@2x.png create mode 100644 examples/bonfire/Assets.xcassets/circle_red.imageset/circle_red@3x.png create mode 100644 examples/bonfire/Assets.xcassets/particle_red.imageset/Contents.json create mode 100644 examples/bonfire/Assets.xcassets/particle_red.imageset/particle_red.png create mode 100644 examples/bonfire/Assets.xcassets/particle_red.imageset/particle_red@2x.png create mode 100644 examples/bonfire/Assets.xcassets/particle_red.imageset/particle_red@3x.png create mode 100644 examples/bonfire/Assets.xcassets/particle_yellow.imageset/Contents.json create mode 100644 examples/bonfire/Assets.xcassets/particle_yellow.imageset/particle_yellow.png create mode 100644 examples/bonfire/Assets.xcassets/particle_yellow.imageset/particle_yellow@2x.png create mode 100644 examples/bonfire/Assets.xcassets/particle_yellow.imageset/particle_yellow@3x.png create mode 100644 examples/bonfire/Assets.xcassets/rect_orange.imageset/Contents.json create mode 100644 examples/bonfire/Assets.xcassets/rect_orange.imageset/rect_orange.png create mode 100644 examples/bonfire/Assets.xcassets/rect_orange.imageset/rect_orange@2x.png create mode 100644 examples/bonfire/Assets.xcassets/rect_orange.imageset/rect_orange@3x.png create mode 100644 examples/bonfire/Assets.xcassets/rect_red.imageset/Contents.json create mode 100644 examples/bonfire/Assets.xcassets/rect_red.imageset/rect_red.png create mode 100644 examples/bonfire/Assets.xcassets/rect_red.imageset/rect_red@2x.png create mode 100644 examples/bonfire/Assets.xcassets/rect_red.imageset/rect_red@3x.png create mode 100644 examples/bonfire/Assets.xcassets/rect_yellow.imageset/Contents.json create mode 100644 examples/bonfire/Assets.xcassets/rect_yellow.imageset/rect_yellow.png create mode 100644 examples/bonfire/Assets.xcassets/rect_yellow.imageset/rect_yellow@2x.png create mode 100644 examples/bonfire/Assets.xcassets/rect_yellow.imageset/rect_yellow@3x.png create mode 100644 examples/bonfire/Assets.xcassets/wood.imageset/Contents.json create mode 100644 examples/bonfire/Assets.xcassets/wood.imageset/wood.png create mode 100644 examples/bonfire/Assets.xcassets/wood.imageset/wood@2x.png create mode 100644 examples/bonfire/Assets.xcassets/wood.imageset/wood@3x.png delete mode 100644 examples/circle-menu/ViewController.swift delete mode 100644 examples/shared/Assets.xcassets/background.imageset/background.png delete mode 100644 examples/shared/Assets.xcassets/background.imageset/background@2x.png delete mode 100644 examples/shared/Assets.xcassets/background.imageset/background@3x.png create mode 100644 examples/shared/Assets.xcassets/background_pattern.imageset/Contents.json create mode 100644 examples/shared/Assets.xcassets/background_pattern.imageset/background_pattern.png create mode 100644 examples/shared/Assets.xcassets/background_pattern.imageset/background_pattern@2x.png create mode 100644 examples/shared/Assets.xcassets/background_pattern.imageset/background_pattern@3x.png rename examples/shared/Assets.xcassets/{background.imageset => splash_background.imageset}/Contents.json (67%) create mode 100644 examples/shared/Assets.xcassets/splash_background.imageset/splash_background.png create mode 100644 examples/shared/Assets.xcassets/splash_background.imageset/splash_background@2x.png create mode 100644 examples/shared/Assets.xcassets/splash_background.imageset/splash_background@3x.png diff --git a/.codebeatignore b/.codebeatignore index a5a5f8f..478c2c1 100644 --- a/.codebeatignore +++ b/.codebeatignore @@ -1,2 +1,3 @@ docs/** test/** +examples/** diff --git a/README.md b/README.md index 8f971a4..3e38d66 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Build Status](https://travis-ci.org/onurersel/anim.svg?branch=master)](https://travis-ci.org/onurersel/anim) [![codecov.io](https://codecov.io/github/onurersel/anim/coverage.svg?branch=master)](https://codecov.io/github/onurersel/anim?branch=master) +[![codebeat badge](https://codebeat.co/badges/67e95eda-c701-43d0-921c-541a427750bd)](https://codebeat.co/projects/github-com-onurersel-anim) `anim` is an animation library written in Swift with a simple, declarative API in mind. diff --git a/anim.xcodeproj/project.pbxproj b/anim.xcodeproj/project.pbxproj index 49b5a6e..ccc47fa 100644 --- a/anim.xcodeproj/project.pbxproj +++ b/anim.xcodeproj/project.pbxproj @@ -9,23 +9,15 @@ /* Begin PBXBuildFile section */ BA150FA91E53B870009A14E3 /* animTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA150F961E53B838009A14E3 /* animTests.swift */; }; BA150FAA1E53D2EB009A14E3 /* anim.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BA3FCA091E4B262F0095BE41 /* anim.framework */; }; - BA20430F1E5C571100E8FDCA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BA20430A1E5C571100E8FDCA /* Assets.xcassets */; }; - BA2043101E5C571100E8FDCA /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = BA20430B1E5C571100E8FDCA /* Info.plist */; }; - BA2043111E5C571100E8FDCA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BA20430C1E5C571100E8FDCA /* LaunchScreen.storyboard */; }; - BA2043121E5C571100E8FDCA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA20430D1E5C571100E8FDCA /* ViewController.swift */; }; - BA2043151E5C7BDC00E8FDCA /* Layout.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA2043141E5C7BDC00E8FDCA /* Layout.swift */; }; BA20432F1E5C81AD00E8FDCA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA20432D1E5C81AD00E8FDCA /* AppDelegate.swift */; }; BA2043301E5C81AD00E8FDCA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA20432E1E5C81AD00E8FDCA /* ViewController.swift */; }; BA2043311E5C81C000E8FDCA /* Layout.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA2043141E5C7BDC00E8FDCA /* Layout.swift */; }; - BA2043331E5C829600E8FDCA /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = BA20430B1E5C571100E8FDCA /* Info.plist */; }; BA2043341E5C829700E8FDCA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BA20430C1E5C571100E8FDCA /* LaunchScreen.storyboard */; }; - BA2043351E5C829900E8FDCA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BA20430A1E5C571100E8FDCA /* Assets.xcassets */; }; - BA2043361E5C831300E8FDCA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA20432D1E5C81AD00E8FDCA /* AppDelegate.swift */; }; BA2043381E5C840600E8FDCA /* Particle.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA2043371E5C840600E8FDCA /* Particle.swift */; }; BA20433C1E5C86CF00E8FDCA /* Emitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA20433B1E5C86CF00E8FDCA /* Emitter.swift */; }; BA20433E1E5C8A7000E8FDCA /* Math.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA20433D1E5C8A7000E8FDCA /* Math.swift */; }; - BA20433F1E5C8A7000E8FDCA /* Math.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA20433D1E5C8A7000E8FDCA /* Math.swift */; }; BA3FCA251E4B26430095BE41 /* anim.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3FCA241E4B26430095BE41 /* anim.swift */; }; + BA5A67F31E602AF400CD560F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BA5A67F21E602AF400CD560F /* Assets.xcassets */; }; BA656D931E574E35006A8221 /* anim.h in Headers */ = {isa = PBXBuildFile; fileRef = BA656D921E574E35006A8221 /* anim.h */; settings = {ATTRIBUTES = (Public, ); }; }; BA656D951E574E35006A8221 /* anim.h in Headers */ = {isa = PBXBuildFile; fileRef = BA656D921E574E35006A8221 /* anim.h */; settings = {ATTRIBUTES = (Public, ); }; }; BA656D971E575728006A8221 /* animosx.h in Headers */ = {isa = PBXBuildFile; fileRef = BA656D961E575728006A8221 /* animosx.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -53,6 +45,9 @@ BA75D68B1E5B40E500755E5D /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA75D68A1E5B40E500755E5D /* Promise.swift */; }; BA75D68C1E5B40E500755E5D /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA75D68A1E5B40E500755E5D /* Promise.swift */; }; BA75D68D1E5B40E500755E5D /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA75D68A1E5B40E500755E5D /* Promise.swift */; }; + BA82DC041E5F0DDA00FCEE49 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BA82DC031E5F0DDA00FCEE49 /* Assets.xcassets */; }; + BAB0E5251E5F434600E11EA8 /* anim.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BA3FCA091E4B262F0095BE41 /* anim.framework */; }; + BAB0E5261E5F434600E11EA8 /* anim.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BA3FCA091E4B262F0095BE41 /* anim.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; BAE19D591E53313F000A41AB /* Animator-ios.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAE19D581E53313F000A41AB /* Animator-ios.swift */; }; BAE19D5B1E5331A0000A41AB /* Ease.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAE19D5A1E5331A0000A41AB /* Ease.swift */; }; BAE19D5D1E53329B000A41AB /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAE19D5C1E53329B000A41AB /* Settings.swift */; }; @@ -68,15 +63,26 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + BAB0E5271E5F434600E11EA8 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + BAB0E5261E5F434600E11EA8 /* anim.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ BA150F961E53B838009A14E3 /* animTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = animTests.swift; sourceTree = ""; }; BA150F971E53B838009A14E3 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; BA150F9E1E53B85C009A14E3 /* animTests-ios.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "animTests-ios.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - BA2042F31E5C404700E8FDCA /* example-circle-menu.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example-circle-menu.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - BA20430A1E5C571100E8FDCA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; BA20430B1E5C571100E8FDCA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; BA20430C1E5C571100E8FDCA /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; - BA20430D1E5C571100E8FDCA /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; BA2043141E5C7BDC00E8FDCA /* Layout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Layout.swift; sourceTree = ""; }; BA20431A1E5C80EB00E8FDCA /* example-bonfire.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example-bonfire.app"; sourceTree = BUILT_PRODUCTS_DIR; }; BA20432D1E5C81AD00E8FDCA /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -87,6 +93,7 @@ BA3FCA091E4B262F0095BE41 /* anim.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = anim.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BA3FCA0D1E4B262F0095BE41 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; BA3FCA241E4B26430095BE41 /* anim.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = anim.swift; sourceTree = ""; }; + BA5A67F21E602AF400CD560F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; BA656D701E5726EF006A8221 /* anim.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = anim.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BA656D921E574E35006A8221 /* anim.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = anim.h; sourceTree = ""; }; BA656D961E575728006A8221 /* animosx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = animosx.h; sourceTree = ""; }; @@ -98,6 +105,7 @@ BA70576D1E54D76E00565309 /* Constraint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constraint.swift; sourceTree = ""; }; BA70579E1E54EC7600565309 /* animTests-macos.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "animTests-macos.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; BA75D68A1E5B40E500755E5D /* Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Promise.swift; sourceTree = ""; }; + BA82DC031E5F0DDA00FCEE49 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; BAE19D581E53313F000A41AB /* Animator-ios.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Animator-ios.swift"; sourceTree = ""; }; BAE19D5A1E5331A0000A41AB /* Ease.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Ease.swift; sourceTree = ""; }; BAE19D5C1E53329B000A41AB /* Settings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = ""; }; @@ -112,17 +120,11 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - BA2042F01E5C404700E8FDCA /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; BA2043171E5C80EB00E8FDCA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BAB0E5251E5F434600E11EA8 /* anim.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -171,25 +173,16 @@ children = ( BA2043131E5C7BAD00E8FDCA /* shared */, BA20432C1E5C81AD00E8FDCA /* bonfire */, - BA2043081E5C56FD00E8FDCA /* circle-menu */, ); path = examples; sourceTree = ""; }; - BA2043081E5C56FD00E8FDCA /* circle-menu */ = { - isa = PBXGroup; - children = ( - BA20430D1E5C571100E8FDCA /* ViewController.swift */, - ); - path = "circle-menu"; - sourceTree = ""; - }; BA2043131E5C7BAD00E8FDCA /* shared */ = { isa = PBXGroup; children = ( BA20430B1E5C571100E8FDCA /* Info.plist */, + BA82DC031E5F0DDA00FCEE49 /* Assets.xcassets */, BA20430C1E5C571100E8FDCA /* LaunchScreen.storyboard */, - BA20430A1E5C571100E8FDCA /* Assets.xcassets */, BA20432D1E5C81AD00E8FDCA /* AppDelegate.swift */, BA2043141E5C7BDC00E8FDCA /* Layout.swift */, BA20433D1E5C8A7000E8FDCA /* Math.swift */, @@ -200,6 +193,7 @@ BA20432C1E5C81AD00E8FDCA /* bonfire */ = { isa = PBXGroup; children = ( + BA5A67F21E602AF400CD560F /* Assets.xcassets */, BA20432E1E5C81AD00E8FDCA /* ViewController.swift */, BA2043371E5C840600E8FDCA /* Particle.swift */, BA20433B1E5C86CF00E8FDCA /* Emitter.swift */, @@ -236,7 +230,6 @@ BA70579E1E54EC7600565309 /* animTests-macos.xctest */, BA656D701E5726EF006A8221 /* anim.framework */, BA656D9C1E57576F006A8221 /* animTests-tvos.xctest */, - BA2042F31E5C404700E8FDCA /* example-circle-menu.app */, BA20431A1E5C80EB00E8FDCA /* example-bonfire.app */, ); name = Products; @@ -315,23 +308,6 @@ productReference = BA150F9E1E53B85C009A14E3 /* animTests-ios.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - BA2042F21E5C404700E8FDCA /* example-circle-menu */ = { - isa = PBXNativeTarget; - buildConfigurationList = BA2043041E5C404700E8FDCA /* Build configuration list for PBXNativeTarget "example-circle-menu" */; - buildPhases = ( - BA2042EF1E5C404700E8FDCA /* Sources */, - BA2042F01E5C404700E8FDCA /* Frameworks */, - BA2042F11E5C404700E8FDCA /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "example-circle-menu"; - productName = "example-circle-menu"; - productReference = BA2042F31E5C404700E8FDCA /* example-circle-menu.app */; - productType = "com.apple.product-type.application"; - }; BA2043191E5C80EB00E8FDCA /* example-bonfire */ = { isa = PBXNativeTarget; buildConfigurationList = BA2043291E5C80EB00E8FDCA /* Build configuration list for PBXNativeTarget "example-bonfire" */; @@ -339,6 +315,7 @@ BA2043161E5C80EB00E8FDCA /* Sources */, BA2043171E5C80EB00E8FDCA /* Frameworks */, BA2043181E5C80EB00E8FDCA /* Resources */, + BAB0E5271E5F434600E11EA8 /* Embed Frameworks */, ); buildRules = ( ); @@ -453,12 +430,6 @@ DevelopmentTeam = SC8T7A8Q3S; ProvisioningStyle = Automatic; }; - BA2042F21E5C404700E8FDCA = { - CreatedOnToolsVersion = 8.2.1; - DevelopmentTeam = SC8T7A8Q3S; - LastSwiftMigration = 0820; - ProvisioningStyle = Automatic; - }; BA2043191E5C80EB00E8FDCA = { CreatedOnToolsVersion = 8.2.1; DevelopmentTeam = SC8T7A8Q3S; @@ -511,7 +482,6 @@ BA70579D1E54EC7600565309 /* animTests-macos */, BA656D9B1E57576F006A8221 /* animTests-tvos */, BA2043191E5C80EB00E8FDCA /* example-bonfire */, - BA2042F21E5C404700E8FDCA /* example-circle-menu */, ); }; /* End PBXProject section */ @@ -524,23 +494,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - BA2042F11E5C404700E8FDCA /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BA2043111E5C571100E8FDCA /* LaunchScreen.storyboard in Resources */, - BA2043101E5C571100E8FDCA /* Info.plist in Resources */, - BA20430F1E5C571100E8FDCA /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; BA2043181E5C80EB00E8FDCA /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BA2043331E5C829600E8FDCA /* Info.plist in Resources */, + BA82DC041E5F0DDA00FCEE49 /* Assets.xcassets in Resources */, + BA5A67F31E602AF400CD560F /* Assets.xcassets in Resources */, BA2043341E5C829700E8FDCA /* LaunchScreen.storyboard in Resources */, - BA2043351E5C829900E8FDCA /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -590,17 +550,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - BA2042EF1E5C404700E8FDCA /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BA2043361E5C831300E8FDCA /* AppDelegate.swift in Sources */, - BA2043121E5C571100E8FDCA /* ViewController.swift in Sources */, - BA2043151E5C7BDC00E8FDCA /* Layout.swift in Sources */, - BA20433F1E5C8A7000E8FDCA /* Math.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; BA2043161E5C80EB00E8FDCA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -714,44 +663,14 @@ }; name = Release; }; - BA2043021E5C404700E8FDCA /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - DEVELOPMENT_TEAM = SC8T7A8Q3S; - INFOPLIST_FILE = examples/shared/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.onurersel.example-circle-menu"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - BA2043031E5C404700E8FDCA /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - DEVELOPMENT_TEAM = SC8T7A8Q3S; - INFOPLIST_FILE = examples/shared/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.onurersel.example-circle-menu"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; BA20432A1E5C80EB00E8FDCA /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = SC8T7A8Q3S; - INFOPLIST_FILE = "$(SRCROOT)/examples/shared/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.2; + INFOPLIST_FILE = examples/shared/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.onurersel.example-bonfire"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -762,10 +681,11 @@ BA20432B1E5C80EB00E8FDCA /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = SC8T7A8Q3S; - INFOPLIST_FILE = "$(SRCROOT)/examples/shared/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.2; + INFOPLIST_FILE = examples/shared/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.onurersel.example-bonfire"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1072,15 +992,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - BA2043041E5C404700E8FDCA /* Build configuration list for PBXNativeTarget "example-circle-menu" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BA2043021E5C404700E8FDCA /* Debug */, - BA2043031E5C404700E8FDCA /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; BA2043291E5C80EB00E8FDCA /* Build configuration list for PBXNativeTarget "example-bonfire" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1088,6 +999,7 @@ BA20432B1E5C80EB00E8FDCA /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; BA3FCA031E4B262F0095BE41 /* Build configuration list for PBXProject "anim" */ = { isa = XCConfigurationList; diff --git a/examples/shared/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 71% rename from examples/shared/Assets.xcassets/AppIcon.appiconset/Contents.json rename to examples/bonfire/Assets.xcassets/AppIcon.appiconset/Contents.json index 1d060ed..bebfb2b 100644 --- a/examples/shared/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,88 +1,105 @@ { "images" : [ { - "idiom" : "iphone", "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon20@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon20@3x.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon29@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon29@3x.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon40@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon40@3x.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon@3x.png", "scale" : "3x" }, { - "idiom" : "ipad", "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon20.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon20@2x-1.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon29.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon29@2x-1.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon40.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon40@2x-1.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon76.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon76@2x.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "icon83-5@2x.png", "scale" : "2x" } ], diff --git a/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon20.png b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon20.png new file mode 100644 index 0000000000000000000000000000000000000000..24009637ffa4d7b1bd1e8121c21d6c62da45e9a5 GIT binary patch literal 499 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQaEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBC^0|4C&X1nQ@h{P;j3ft zWHX0}rVjs|Lf<(AWf@xjaSF{dw47k-kZEY4s;Rxe-1&)p!1uYjAKr3(pQHEDA?U+r zjvur1KRE`yaR~hQis$1C-q#L+Ehe@5)u{@muNGvd~P4`%s!w+-%>_iQC2}oR7_l1T~kCxd@&A8wZ?6YJkDEW26c-skw)ns7aoPSg z><8ZR-+Hm=Ou>~yhHLyfeAC4Ymm42QdMOzr_~!8E+Irp`j=YV=JJ|VH`Z;*!H5kY4 zSJ-i{VT0f?SCMJAzk3vfCF(5okvo6g+R!~_;iFA_;iZnNbYE^!TRPi+ZN~CbMy}S8 idR*0_O6lkNYZ$6H1l@zbA6*G_DTAl0pUXO@geCyHL#|K& literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon20@2x-1.png b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon20@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..20e7565a4481aa057d34454f3356b3bbcf64c7d0 GIT binary patch literal 877 zcmV-z1CsoSP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0003> zP)t-sBq=K;DJzLJKJP$Mh%`Q+H$(qIRh~COpEpB}H9y`yPjfOl>OfJ9H9vndJcKko z{z6r9GCG?#Li|EiXE8YUK~zmHGhi?`{z6p0J4yCIQ}sbp^FdQxFE;-}Rrr-L@#GHi z=?(aiGtE3pK`b%yK~wgqDe&_M_oOQDKvOy_FReL6qBleBKvMXcFZh@+|vU z9U>kgBrX^mo-R7%Jx%&SRN_2Mn=Uyj7aAfaC>tIi6&4sA9v~MO8WR%~7Z@2IBP1Up zBoh-A8XO)VBqkOY866-Y85rHAmiFIW z2LP^QCotjzUEM#y9$-nYTL}8tu%CbfgKRlO$l(#U(m%?CW8;LJV7f`dfhm^`1n4g4 z*N4+Hv!Sp7=csOe0lLMAmL&w2S7>n6bWOQNgHe659x)PwaD(E!aI%Tv7HX1tV+g}- z2zO|3SD(Z%472~tJ^1Q<ArjctOMx?=RsI z1)fV1FePc>)0vH z6@PMh+jG>ng5*e{sM6XI-%D0i`uLA0#?k4T&>lrviV)1_NaA^ z4l<~1Enftz!^ZS2THYqWcI&oXD-A*!wxQT|{fGGm!vSgsinfQY00000NkvXXu0mjf Dx_3`U literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon20@2x.png b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..20e7565a4481aa057d34454f3356b3bbcf64c7d0 GIT binary patch literal 877 zcmV-z1CsoSP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0003> zP)t-sBq=K;DJzLJKJP$Mh%`Q+H$(qIRh~COpEpB}H9y`yPjfOl>OfJ9H9vndJcKko z{z6r9GCG?#Li|EiXE8YUK~zmHGhi?`{z6p0J4yCIQ}sbp^FdQxFE;-}Rrr-L@#GHi z=?(aiGtE3pK`b%yK~wgqDe&_M_oOQDKvOy_FReL6qBleBKvMXcFZh@+|vU z9U>kgBrX^mo-R7%Jx%&SRN_2Mn=Uyj7aAfaC>tIi6&4sA9v~MO8WR%~7Z@2IBP1Up zBoh-A8XO)VBqkOY866-Y85rHAmiFIW z2LP^QCotjzUEM#y9$-nYTL}8tu%CbfgKRlO$l(#U(m%?CW8;LJV7f`dfhm^`1n4g4 z*N4+Hv!Sp7=csOe0lLMAmL&w2S7>n6bWOQNgHe659x)PwaD(E!aI%Tv7HX1tV+g}- z2zO|3SD(Z%472~tJ^1Q<ArjctOMx?=RsI z1)fV1FePc>)0vH z6@PMh+jG>ng5*e{sM6XI-%D0i`uLA0#?k4T&>lrviV)1_NaA^ z4l<~1Enftz!^ZS2THYqWcI&oXD-A*!wxQT|{fGGm!vSgsinfQY00000NkvXXu0mjf Dx_3`U literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon20@3x.png b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ccfecda11fc96a76e403f1e16ac903966e6ecd74 GIT binary patch literal 1134 zcmV-!1d;oRP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0004! zP)t-sBq=L;GdtiuPya$y-ab!rGCGwuL5?*)hcrHcG(CGWJpMvebuv0|GCBN0RsBL$ z$UIBvKT-TbRI4~eMJ+K^FEsi=RQN$uaxyx`JW6>pJNZFW!#hb(E;DE`I7BTmqc=mR zI7DJFH{?H1V=y=NK~wx-NcFxS@#_om>kRd~ApKlQ`)xw-^9b?i4g6?CWidD@DlFkY zPx0vuCn+raX+(B1JI6dqzdK3uK~wHPQuMwb^|&JKKvMDT3-RX-d^0@tw<0SlEaE>; z@#zfxTT0wMPE9T|`)ot}XGQfvQ%fx}VK6uMK~!BYHefI}AR{Fd6&4c|6&V{GA0s9G zUr6=6Ao1!96&4o~5)%{@6&f5KAtfeUFE$_~CL10gA|@zWEi)P%9TpcE9UviJE;Ugi zC=wGCS0pO)KvGQ}Boh-9LmVO7J4@F(N;?`J93LPS6BKDAE4MR2={-;VLR7mnLT4i@ z8y+7aB_|pk9vmJZ93LSW8XO-ZBo`SP9w8$mC@K~g7$YYs6%`f$008!!XQu!F00Cl4 zM?{4c*J|eg000SaNLh0L01FZT01FZU(%pXi00007bV*G`2jK!33KALbsS{EF00JgS zL_t(Y$L-YlTM|JS2k^1cEGUl-$_O)U3o5#(tkg8Ew6bD>atCN7y0o>@vOK^O|L|ZB zcXoMqW&nF0f9U(;%zU2NdFP!)=zsPkO$TsuOP%&0uB5dtdk7mjT!;1fP3%8Xvpw2| zt+aP^9_u`QLfoDVU{_9^7RFt;D*iK~IDi|_LEL~oi$UEaghPQwbaxx9#cJN-2X*kA zknRC7J}+W>gD~zBuopZmmKv}EJKOf+rEui(m0HdmlB}gyBhhlMUAOTKj=gzn*M_5d zVzzF+&Bi{rE$chG`Ys#yS6N!$W8?c~ts+q>F{^41*w|b(5OrkG+M11rj71Nfcvx)b zekSIec?A6IM<(X{iATqbf<1N=?1^EYa_$+88yz-5l{@y#u+Lv0UM63A|X<)kxNTT}m#cPN`lR~9IsRf!p8I_K8X z`)S3RRw0}xc0PRkB+>RWHJ695Oz3=>vGwd%dPat@Mx2@ZX4>yR9OD{<=UtdA{QR}} zd-2cGf^&EttXOVYA-pKdInS$BjqC78I-??XQb`Szn%O}A2(PTljL()=S3G5|AW*OZ zT(BZn8Yzl23DMTp(fV5TFuy&?#^#njytTREIyr>thp}BOQ8T6DHZ=!64Esp}T|{*s z+$cMG7v;UWNX_frx8ub%707*qoM6N<$f}lLb A_W%F@ literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon29.png b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon29.png new file mode 100644 index 0000000000000000000000000000000000000000..0bec65fd547fd9b7eb42dd8bbcbd4cf0b890be62 GIT binary patch literal 666 zcmeAS@N?(olHy`uVBq!ia0vp^vLMXC3?vhMr`rN4mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lz0{36XL3(shw_U@ya3a zrF~$&k!7Bt-JDfEPm z*F1BlDr4(kb=Dsr@qc_I@TX?X#ipeS{iHeCUsHjQF z$cl)FO3TVCsc8rciz=w70=;{7N#$}N#hB#n?&8~!p^ysXa29w(7Bet#3xP1>rMq>1 zfP(BLp1!W^51Aym1TFu+N{9ps{ql5i4AD5h_rlGvLk0qD51I~~c-54%HK;swd8VjR z&^NIO-|OYnG@r8w>6HI5_x&{2Gi_Doa}Sj&!QbMKIU7!=Xw9{3i*%WH=c?ddHjc!F z6LtrFG1LFycaiChX#2vT=qJmU7P+S1ulD3E`w?Jz_LZ_8kLUadRi#hH2fCMdUJ0N4 z+;?rQ`(KVP!V5IM$1tz>JX_i~L-X-AYlhe-ZR-}e<~-+){J(C)sd>r5-Wl_Qyz1C$ zo*jBW;lVcjD@$z_e>^hdT+>$Vl6?z;#6JI>ZabetXCg3B_4rNyJc|wAe6?zC x(C#GRzr5xL)0F*Fc5b^Y9Q{Xn-O{;d#EP~W{@hgazX%u#44$rjF6*2UngFyM`dk12 literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon29@2x-1.png b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd1b91ac59a9995ac5627315354021869ea9e52 GIT binary patch literal 1051 zcmV+$1mydPP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0004i zP)t-sBq=L>Gd$itPyIqw-9AoxGdv|JE2B6=|3X!sH$tB`L&G~t(LGG~K~(oaRM0(4 zb}~DFGd;IDM=2^S-#$;cI!7ldEBr!KuQ^8CK2E4OM0_(ml{P_zG(Mj&RQiHB zJ1j5vrYiTKEQB;YsW?UUrzxU0L#8-HA0i|a6&4f}6&V{HA0s9Ch&S@r6!Gi}^VAjk zgE=50B@`4E5)u;{93CJfCZ#w;6%`g69UmekCm9+X78Vz#G(e&=KNA!c6A}}kFFTwr zIujEWekd{dK~wlaQ+X#a78e;Y7#xl(HPJap>^@M>I7p2vH5L~bA|@ys9v~GK7a=7l z9UvkW78n;885|!W93UYgCn+BzBme*aXcUk}00001VoOIve@MS^6Qzr zJ({xDk{~hL*RM$jR1&j;n$#5EHe|D@?64*sk#>#R@QjJYaVlyh=mZU&l;{*er)gd| z3w-JfO`B%tq-h}Ne5{tcKsOS0OfHJ0C2h&D%hJ8BB+6ArFDfg^HH!b5Z0+>Y!L4ub zm_?gg+dI3M+}l{^93XWH-*N7{6f5U|WnBBQbqz=1^(!%hR>SVVK}!?ht>Ug4}ZL?-&=2*zArEw ziB=r*Z%Q literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon29@2x.png b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9faf82fb6a8a0385f29493fc1e27fa5c0e285b00 GIT binary patch literal 1051 zcmV+$1mydPP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0004i zP)t-sBq=L>Gd$itPyIqw-9AoxGdv|JE2B6=|3X!sH$tB`L&G~t(LGG~K~(oaRM0(4 zb}~DFGd;IDM=2^S-#$;cI!7ldEBr!KuQ^8CK2E4OM0_(ml{P_zG(Mj&RQiHB zJ1j5vrYiTKEQB;YsW?UUrzxU0L#8-HA0i|a6&4f}6&V{HA0s9Ch&S@r6!Gi}^VAjk zgE=50B@`4E5)u;{93CJfCZ#w;6%`g69UmekCm9+X78Vz#G(e&=KNA!c6A}}kFFTwr zIujEWekd{dK~wlaQ+X#a78e;Y7#xl(HPJap>^@M>I7p2vH5L~bA|@ys9v~GK7a=7l z9UvkW78n;885|!W93UYgCn+BzBme*aXcUk}00001VoOIve@MS^6Qzr zJ({xDk{~hL*RM$jR1&j;n$#5EHe|D@?64*sk#>#R@QjJYaVlyh=mZU&l;{*er)gd| z3w-JfO`B%tq-h}Ne5{tcKsOS0OfHJ0C2h&D%hJ8BB+6ArFDfg^HH!b5Z0+>Y!L4ub zm_?gg+dI3M+}l{^93XWH-*N7{6f5U|WnBBQbqz=1^(!%hR>SVVK}!?ht>Ug4}ZL?-&=2*zArEw ziB=004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0006R zP)t-sBq=LQE;Ft`K2GgGQr109z&lC&Vn_A1Bk|)8@bd`q;t=(+ zB>i4Vqc}tPi8k=?3GnU;`hhx4E;Fe(Mfi|2@bU=xhc~l1Mr1HICMhe|Jx$9zOII&7 zpEpC@K2G_IHO@Rt`$AOk@Cxwl3jJD2^|K`QtS9q9Q}N;t^4b&bKvLd5Px0vu&^=7@ z*cA4%B=)B%{a;A%?+Wqk3;kG3(LGH0ggEf=3Hp3IST8l9H$(Y~Hu{1&l{P^qDJ!`; zNF^yNx;jX(IY#+~IQo4%uQ^5`B_nmDE6)<^4${g>kRVS6ZWbo z{aQ;SC@K^b6&xQSBPS^n6cr;VDIFjo7a1BJAtDwR850u}7#bTNA|x3c9UvqnBP1pq z9v~DI79buUxH(3wH9;2^7Z?*2wKPGgFg+C$6q+qL{X$fYD>V}m6BZa5Qy(SNIZ4hq zM@t?93B)D79S%e85M6#`F&*%UE010qNS#tmY3labT z3lag+-G2N4000McNliru;Q|;64-4ab4h8@K0|ZG#K~z}7?bqj9(@+!#;8;{HT0vA4 z1jUWpC@P95xcA-*C%7PiISV62>Mt#>JZ*pNK+9nh;-hq7y~poFs)EhLfeR@q|t6Fr4C;oSHgi>a_T> zIBC;kVP~*dgwiwYvojMBJDK+3EQF-MvydD(3CV$HBRO!k$VGE(!5N|(VHck36vOlE z!1Kj$<^oCZLR-%+S?HogHrSjrvAb9filoA#BlB7E8d}?6+%T33xle&El|D zcn84UX;`;QB~oCViroNrk6~{2lCHXMKQ2fIJT^l+2UJ=P;(|l=`aMi_kKlr%0QVSP zMrGCGxZni9%@_515*MTZT*LgHqPnN;&2JGNv@>TZ?78#N>lXm5so{$S1Y3M5dewOu zx5LALTR(kn z|MKK-9Q3-9|LGU|%SaeF+NQ_o9?{c8wJ6>J+^i%<1mw6{Ed9-5@la zzJ5W|UHyGZojniVkl^>3Jx`sb=>oUa=y_En_%Y~c^v8 tVMhABqXd0`_jEX+eeVlGR*WY0`~hSEvnp*S!=L~F002ovPDHLkV1nwFan1k$ literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon40.png b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon40.png new file mode 100644 index 0000000000000000000000000000000000000000..57442a4006bba27bdb834b9662af16939246b75b GIT binary patch literal 815 zcmV+~1JL}5P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0003v zP)t-sBq=LIEiubHOZh=mLoG2>E;Q~yQvX6#>_AacE;M8?H}^qQ{z6sWK2LEnI_N)9 zku^Z(KTx7KLnSFITrW2DK~u6hMkgsNQ7$z0K~tGFLGnOS@IX>7DlPj$R4FPf$~;T` zTuSrG8u0K6^v4_hSxdn?NtHH1{Afh+J0mA zL)t!0^4<~h*c9_YQ}Wyr^41lTHbDDtLGkMh@#zfwYD0%KKE^ys{AWe+;}7!S5d30C zy*fxODlPq5O7y}V@#hWnz90QpOu#!yDk?0=JWI$tO20cvzB@=LDJ+dOKixh~Cn+o- zBqkIT6&4s79UvhiC@K>a6&V{H5)u;=6BHO48y_Mh8XO)WB_|pk9uyT893CJQ6&4vA z8~^|SEC!z800001VoOIvXIs;{F{$G0A`#U#HLdZW(i`J^ODY*6yN@-_TQ`a4!JUukni^D$Zr5}X@4M+z= z2pk&r$&pb+j*a`|1h)934^AO2Jgo-98dX|4GQ<0`bMp&}yjYU%W|_BFR&`xpTj%A5 z3~oYmYg^~p*@b#f;zE4NzFy4%)Q8x_qZ&L$CXy3qo}Rhx`~vEzbk{NH#xKELT|;#v zze9tc&+Xm)!y`NsPsq&}&)#t-A_R-^Qgg4k0~vGOTQf(<`$sVF8U2z2(@Lh&{txL? z(l!M!!x+mtx%z9)$-;+>0NTurm4_*2-m1RY0_d=MEXyk$(N7kNCH5<&VnMc{a;3p4 tWtmc)sQi!0yB40~x9DbU#hdx7`~YqMT_2T`)%ySd002ovPDHLkV1ja#MQ#89 literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon40@2x-1.png b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon40@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3e1c926444491f85d323d79f75ba43385437ae78 GIT binary patch literal 1276 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0005A 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 literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon76.png b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon76.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac69f64eaa62896ded023e9136cded78fb4021f GIT binary patch literal 1112 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 literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon@2x.png b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..946628401e5adb7e2c5549787cbbd25ff5c6db90 GIT binary patch literal 1549 zcmV+o2J-odP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00063 zP)t-sBq=K=DJyz2JJ3B$_d!(7JWO{pJ1;6N!#hd;LRG&zNi8ZZ%sflTJW9ztOU67( zzB@=JDJy<6JoQ0S??6(5G(9XTEa^W{WH2}QK~()hRfIG>hcrIVJxq2oJHovKvFO&ErB#W^4Jvc^9b_S6w*CRO)fL^#2xEE zQSLxe@$3un=?wfrRP@6g{!>lz))oFyPX1C(@a+mQDlKaRQ~E(v^u-+Xz90WXRPsSn=08yRi#7U#Io>``^vD~wI!AyrJ@M%cc{4ll=MC{d zQkFJB^UN9a#vG3|K-xY|`hYssJxwYqEcLt~|3g*hKTtd@Fi0&j=s!_KEiv`GAo+ti z@#qcufja6yQ9&#***;D`EHEo7ER;4tb22)#IY;b3QMWorAS5Oh7Z?*16&Dy89Uvhi zCn+E#B_by&6B85?5)&608Xh4dBPc2x9v>JQ93LVi6&4p7933GgCKMGG8yy}YB_|sl z9~vAU93CJdCMXpZ78V#85)%{{85$WI92puM7#bTQCny{rAQcuE6ciO7BP0L-08x*r zxBvhE0b)x>M5?|9SH1uM010qNS#tmY3labT3lag+-G2N4000McNliru;Q|*CIv*2< zL<#@^16D~yK~!ko?b!EQ(?A#p@KkUF1W^PA&3=!P8P;nv(?t#05 zkwAem$|$?Qe<`$0bGckXA$OM_%=gE8-{(G0``l_7#*7&=X3Utu7t5Nc=;*cUEVSMA z8`wZ%Vkx^D*-+xB%96{n@f2myr76o@dNSk8GJ3NoUE+oeja*wA2NER1N1~8UQ$jt%2))OH(7Z^K9!DVf< zJ~8C7r!oU>-f3Vgje;AJ^Ue@n)k=3!w&mMouJtSxS9x-sGsY!wOB7fmaSID@yRqjX zqUb_#Ny)|1B51e__Y?aP1e8|_FZWL!OMZvGc zYSU}XFjJ5%Zl^4z`=&WmY;Mb*L|wb{ao{4D_mO65fBkOE`P2Hhf!N<#X3UU_-Qje#wMX9H-sW;TI`q4pys(t6Zg(Wz?(VKY zJKw1r?h!)ad;6B_?d#>m?jGH+N08#|x2reW`<+0mN3S~|$TK+PMYVZ{2cgCRo$!dD zh-Y+6-ZM7pQFe{!gna@khwESx}6+;{nxQ!2Z&)urs^fpMfj31>{>MJArR@) zX9)Mx$FRqqanD=B9`sCyK|f*4m@#9<%>SEzG5ar4&lR;D00000NkvXXu0mjfF*}%- literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon@3x.png b/examples/bonfire/Assets.xcassets/AppIcon.appiconset/icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f81f5e1a94ebf81724f0b6a3161020968ab595af GIT binary patch literal 2022 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0006F zP)t-sBq=K@DlB?4JHIp)TbLR7&!NqjRrEGjHtFgE2sQ2#6gQQ7$yKI!7}rE_5R9qOBPb~n6BHO38y+Gf8XO)L7#SQMAR8SXAS5Ld6crvJA{iVV zA0s3g8XN!s09t@ErT_o{0b)x>M6S7OlcxXx010qNS#tmY3labT3lag+-G2N4000Mc zNliru;Q|*CIv}OtX*U1>1tUpBK~#9!?b-WV6jd0&@dXzVM+4WWc2i0!Dz#e8Tr@Mu zYb0c5nxLT4O)I;3O>x9s0l6-_va6^d<^{F>$5vK$cg~#K%rd;^JkR_6(Q(F)`^=m< z=Zw#XVHk#C7=~dOhN)gj={$d#e}4G_Xo!O<78=u1mov@ks$b-ojX*Utk6Ot>gV#$hLj!4*8vI@f zhJvpyt1f|dTAF7_6 z%N?MVQ7?E?M|E|;iTW)?)JvV9QH^R;qq;b?BJ&Vu>bkd~z1gZNov3RRnP0y{!@aw5 z)vDF+Q4Ul=bEhi_QfTjg5YDt_t^G*wLul}`)-la=wGs>UkJx6adOb8aQ^anr&zUpo zdh+N7XmQ3&nW3%>7qpQ)`Y|+_YBn|%qCc@6R?;j$L;uorv-S2^t=K)yFdOx2^5)I9 z2N8Dkh%i@)Yjf(&pV|(Bj?)p&%63LgF@wGlBiz+^R!uR3&OIW69fbNV4WDhl4y${CxE#rnh*ityyyqT`91wh-M!zQMgst&1uKFTqNTaGD#CU1|O zd&9gszEk1$ARokCVSct71mZy?hrI6v=pR%V^2nD#o@h`(5$ zLa>D`xrNZmLH}yKp|``CeZEpj^+~I_6w)lKR?94>R?RGc`fRiN%hg+pPT>qQ(-fyZa(-|V@t>J)>BHGNi{9?%wn~QW|3M=GheN$nWt9Q z%vP&x_W4ei(adFMpk4ebD4*&4fNLwc&YmM~k-)jL&?bovoiAALhRy@+Z#b^4{qGBP z7cbUbSk?}*_l02?hG|#lCG&FEm07sZm9ER?rOr7qN6qPCSG$Y4O!w7T_CnD)F!z|b zdaw1lyhz`*-uz{Hyhrz&g$)c2IljWs;DF^C{hphL<0jEaV%W*~i4pPwaVO`yDrwq_ zUmuk`d-Qsoa(>clbjqZbzHw7{>dhNz`pGGe&0{9B*e%|0(tRt&K6T7n^lg*Zoz8LU zS>v5|xaZyW7Cm7KN+s_Sr`%1ZL?;b+i;j!_ebb!0_fLK}7*5=q6rU3J79A4{o*|;y z7e-H1;y;-w<}ErZg~*h?pS+)z{mUM|$;ae=YG=hf9zA^HQHguhQIpZ};#s1G1|Q5K z`GJeci@W+B_7>00)cerwG|^q%kBYs!V~>iPkh^QD>#=L`6Eyh3$ms-%lmU(O^itg)reQTC`b1A9wp;H*2)q7SnPAQqQekEjQJ*{CwfThoXPI zN6-2vx&P+CJpJ)AJxd=y({uIl6T>hJ!!QiPFbtFEe|kn){6dD`L;wH)07*qoM6N<$ Eg68g(o&W#< literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/Contents.json b/examples/bonfire/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/examples/bonfire/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/bonfire/Assets.xcassets/anim.imageset/Contents.json b/examples/bonfire/Assets.xcassets/anim.imageset/Contents.json new file mode 100644 index 0000000..0f886aa --- /dev/null +++ b/examples/bonfire/Assets.xcassets/anim.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "anim.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "anim@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "anim@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/bonfire/Assets.xcassets/anim.imageset/anim.png b/examples/bonfire/Assets.xcassets/anim.imageset/anim.png new file mode 100644 index 0000000000000000000000000000000000000000..f398940cf2d501ed4ccdf0fa7e63d05908ec9fa8 GIT binary patch literal 546 zcmeAS@N?(olHy`uVBq!ia0vp^WE7;`?aTfin%>OVZs|oPB-d!re=cTsK=J zOcq-6a%um4d#QViKCzWK&2x?_D(Op_w#YPQ_Kl>i+ZL$#>1aJ`I>oZ=lh)a(vtQ`# z;nR_Ls<2sV+t={xR?k#~cb}aMMb27?Zr+T^Kr8 zWj%l#&H|6fVg?3oArNM~bhqvgP>{XE)7O>#A(ObErCF6k|5Biy_nt0}As)xKPJda{ zqQKK2$Rcu4?%RXE^S8|4XgN@}?6T_qI}^^b?+j4f&OEE!mS3= zj}-;)ZqdooT{p%1)={BpU0r9FsEadh-v8FDba%}6FV_zXO#8TSQppZ+_pROM)~H4w zoE&p9tU3PSlwN0>kOxH#$FFaXdVP(3%}vuX_tzWxz0|AIZ%M4t>+Tk>KA!0El2^Iq z<#zRTj_2&`_U|)%TR!1?yN*w=m-U=e@sjg`l&)*Chds60tkSi#Lgc1X`_s}~_TRg* zU+$1S7C&#%k=Urj$ELl0-|S9jrimYltYUH68mo5wvJ!`P^V)}hADR%Hg|1DPa?A*g?SIz{!HtbPN`FgGD zRi=XWxg$Q-saemS*>bt_ta_c_el}!{Hfvmf*p;%I0yP&-e4G8e^Aq!;jisNKM>zn~ P5(9&$tDnm{r-UW|TdH7V literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/anim.imageset/anim@3x.png b/examples/bonfire/Assets.xcassets/anim.imageset/anim@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..24ad7cdd67608d4cfb760d1b89576aa191160739 GIT binary patch literal 1099 zcmeAS@N?(olHy`uVBq!ia0vp^3xU{xgBeKrZGDvlq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4NxL5z$e5Nq@bbU!)Fev zAfRcQkEYxKQj#S>e!&b3<*Ni;I^Nyg9XeC#OqwxsxF6>|&FicN21_@t11e%n@^*J& z=wOxg0CG4BJR*x37`TN%nDNrxx<5cc_7YEDSN4ZY;)0guyz={v85o%5JzX3_A`YLO z`FhhF1)c`O1s#j#eVY?k^I!b!Iw=K#12g@!e{Rio`XtF=-m1W)@I6?iq00WHlAtZm z@>V;YU0od(2P#a=3^*sg__A>J!C&o14yKf8DXXwJ=$@IPu=42zhQHMxZp<`kGpNva zzG`IH@^_Ollgh7IQZsZv^L71+y=U2V`;}a?_RJq!4Il3LoHV8TZ(>BZM(>LgllCv( z5W}|4<^C>H(2K7zZck_s&mb{r7Y#PT!;4i?fe|v4f-xUe{ItZuX2{^9r`Bq zzdEkHB}L>+18e*H%A^1OSpA=U!{N5p!pVXSHdUqj`AV2CYO2IEf3wibHCQM3;P`oQ zy>l$J0w?aM$Xq{N$-v|-BK2p1%!CW7Em!uhUoW}%|1ViT|Jm<%z7%`-;I>++F?(OF zbhXf~!VBD5=Pq40p4-SPrBlukzAtx{w7vd8&kjxh^h%$1vlK=2glp#txGd8>tEbuX zQN<*4p8i2bt>Ttztt*83Hh#XxoF)2Fr0?ij?xL(Trgb!T@lD^ByaoaOsypvayf>V$a^$oF--Y*==d0|=N)(xMLX5+=@xolwXoZyO z%Dkox8@&1R&dyUg60f%LW{Gsmzc^(h#ou$?uZuK`OgeM3RE%BQ-Lx&s3;(SIwwTpZUBQ7t#^6@6uc0Mid8xK2Nng6Yp ztahHVJ6s?!CEr)_Y~}66XKvn&o%f++>0Ms+|4%3GzE^b5a_)f>2N(0&AC=&^RpNhI ZzH_05va^LgKQQ+&c)I$ztaD0e0swhi;>7>} literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/circle_red.imageset/Contents.json b/examples/bonfire/Assets.xcassets/circle_red.imageset/Contents.json new file mode 100644 index 0000000..032287b --- /dev/null +++ b/examples/bonfire/Assets.xcassets/circle_red.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "circle_red.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "circle_red@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "circle_red@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/bonfire/Assets.xcassets/circle_red.imageset/circle_red.png b/examples/bonfire/Assets.xcassets/circle_red.imageset/circle_red.png new file mode 100644 index 0000000000000000000000000000000000000000..c227ed754cba3a5543aa05eb37a06f029bf624f0 GIT binary patch literal 1309 zcmeAS@N?(olHy`uVBq!ia0vp^i6G3u3?x6^u%8H|SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#N0|TRGfKQ0)f2YtZ8u-9;#t4zbIrWH*RDSQ@XKm}*M=Qw(`Ou4 zjL(-@Cfm8NA#~s6V?N9!K+71Dyxm=rw0Ft^qlPqM5p4#p=Xq z(>&Z}O`ZPpU;HB5Nyk!e+NPhMS$psEpPTpRoSrk2@xdf94!;()<%cF}xG6tedGdmb z!Ge!}ryP&%KPqgo%Ee}x_5zjVy&`?#r)Kzh{XDO_t$${Ub+a}y=yU!y)-7!RlX^(_z%9koG5?ls za<5-j)Tw+#TZrL^==Fy1u%!$g*`nzOszQYtB4W##_N?+`7Kq-M-Zhf7dECY+dwf8_UdEgEgDp`h{^gY`J+?biI4)ULoa+b=#MUH0&^~xwJ2w z$3cgWN$U0~&fC3=hnk8Q9{JfPZ1;4?c=t`vMX$E*?O*mclNkiQ&*x-!X=zq((44m8 zgLd{mI#g|aOB9*N(8~1U!ve^a1H`zG$ z=B((75Apk97UHQh;kwqrkeGbaM3>WEoZDmY^DB!3sg4i>skI&;0dv#?ATBqMPmgryPhqv!i~6+pHTsA@c8fZ^*v?b18o6$Ge}( TuY`00(>sHwtDnm{r-UW|9yV49 literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/circle_red.imageset/circle_red@2x.png b/examples/bonfire/Assets.xcassets/circle_red.imageset/circle_red@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fa27697fbdcee5c8d7906619ba18e5fb91268723 GIT binary patch literal 2511 zcmeHI`8U*y8~zx=jO}JO)KG&#h$2fvc9LmAgqU!LQB9Vp5XMrNYmKBkm@$(*BTV5c zLnBK>))C24wk#q0`ki~u_pkV#?>X=DJn#Gb^q%*;=RApMl$8(!3IPB>$i~{-o}*3w zf}fkiCOL3AM|gZq>`VZlGF4#D^9W~__qMjT1As6k03gHxzz)YE%mP5jX#n_n0{{%N z0YEAs=btO*0f1{7eaX?{(Dds6>wo(KoFAx2Vm5Px5^Rrh0JxxrZsF-KYCewsSlWFE zyY!%_Z*wd3h~8cL4E*-%^>ZmB+JB87?bW4ifKcx*dkP znq8Oq^FGO2EClXlr9!GiK8W`Z3`?|BTF!$zue+~GQ_ea$`%?etIYS)#dh!mQ!5cJp z+_pHQtf6amqN6VDysVvP`$54?mA2nxtEYnk70u?gD^-=)d6V9gW=Mn0&!Db{2dSAgQDJ26ySK6ae6jw=p+yd@#J2 z3&x09NyjUL6%wM+>VKR-1YNW*K?|GE3D;dA5+>-92aG{ik+($1k@FW{e;6Dbq&aQU zbY&CZ3iZ!(pN}4*A|o0I-I%KC*0;YK;`m!9g0XegNd1wZn(%j_7xUQl$op<7%7(@r zQ^5&`GtHA~Te#M)R0%xf{t`lUIbX-YVL=nTU_Uz~fmo5EJrYwq` z3dv1{s|gOb77w|lFi)$NmCCHMOX#KMKiQcBL30%jZcf~*W6o0I;}xPWM||H!&Svb# ztg*jfU{(Fhtv+tk{i~|bmu@#?jXNZkDti0B;u4uOi@n3Bq(MmmCw45paJ!80l(aAw zSb9du$*r=rVA3RPNu7bX@I&G2F-cgX?*QyZuF-_% z(fD0;AqrwY{?U$zpzA_~wx0a5)L9;W3c`#<12CyiG+eKt_UM}kr!)*$o^uB;D zEt->}Zg>$D8?_9tb89`8)|jabWQ2hFye+xoE>m+e^!(Nab&0y)Oy5)jxwtX$U??~M zvU$4bQ=7^T(9nk)$;>H?#AI(n7E7Bx3t~adYKq5VgSomW$dK#;Fgi@KyoBXK9A&+# z!`ut?vyJkew=gWsKj%)kGjF6`btQY6R7&H+XJ;MXw-YrqvV+rhg9E#W`&=IXbj`u_ zQs2-f-`*n#`1orj=6{cw#@?=AYvWs9YfM-4`1C)_Fu3rYiy^I3UQ*LV>ha*kp(H4^ z;BqXX&{0QP2&ZOt{VPI|8_#_J6B!UBLKoa(A4%Py#L_2AUwb`lg zS60ZAYGUa%vi1JVpANI~CCJ<6)3gd1JeKkO+s7K`;(S zR1uuU|BP;9#6Bk~RV8rx^lK5WSI+L6rvypjSNVqtq(iaB_KX9A*>1vX>y6!})aD#s zrNJKatj~~~Q|VX+NV%gq)@i)i%!y;X{IfBlHbu~>dPO+71HPs7cS|-(IE`y2W6Jm>N`qP;m_C^k$-8zjtrYX&yCavix7zSu z(BwRY7e~}BlP$+2C%3?O%XWs($y03A;bh{~PX`updr4U|)1r9sP=pz*qWYgtH0*4_ zhPft?P9eKv{)ph@Z zx&zwYMS1Hh=uKB8R`H6~j-1YESZf}#mE6PkYNqc|e#5Wk$F2R5XC&phr(tQ8evG@I z7GLzxZQ(Xh-!-zzuH$&+C$Dxws9qf7GIf-;*QI6Ruv3Rl?~oab4BZpG44CH8W@!5> zIhq%K3~nf&Z6qf2klXa5*+;gl9`KR|aI=1nsh*ur81lD0loYsc5rA7D-z-bL+v`#T z^i%l{`Dh#?G1JRHPJMdOu;yTKTPLatJm z7?!WnW+hh;_L`07Yh&v2qRQw_X8Wncs|-&Wt7d(q;IK5Ja!EP>Y3$2g9g-6~}L yHxO*=e!cr9T)>)-AlGMpZ|~|3(zo0Ca>%!;igb}_8kymw6kub4GN+r~i1`n$640~& literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/circle_red.imageset/circle_red@3x.png b/examples/bonfire/Assets.xcassets/circle_red.imageset/circle_red@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f2fd3f73ed183015e57e14acbcefda73e5e3a7cf GIT binary patch literal 3775 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 literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/particle_red.imageset/particle_red@2x.png b/examples/bonfire/Assets.xcassets/particle_red.imageset/particle_red@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d8f10d0643b1d44e470809354daa3f753d15fbd3 GIT binary patch literal 545 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eP!3-p~sQ3m0DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C*E<;1lBd-zjtuBB1NM zShwc`DZ`Q=zhDLyx8fpK*2t;|=DK4)zUkNBx~c0Pvt!HqFNbQ%Z`4+P{CcFMFh46J zIWas`PbVzbW$9hTTA*geByV>YBZo^qCx9Hz0*}aI1_o{+5N5n|x9$&6kiEpy*OmPt zlenOzIj{VFW1!GfPZ!4!iOaqhjx#km@VH(yf8deE7Pv9_U=y$Q|Nq5pQuklY^A%%c zc>2?JZNOT2f%73jq1QJt?ko^!?dv%@!R>LAxb>`rsB+ET$jfUOJ}G%?|4zo?L7 zQ|TSq8x1jw-}X85?%>qaz9ZjvNBzf@v+imZkCk>jQrn>{Zu5ZCWL}f_noR5Me*~28 kzRG=lT=VbAeX0K$N&_V=!q#Np13Hkw)78&qol`;+0F#*7i~s-t literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/particle_red.imageset/particle_red@3x.png b/examples/bonfire/Assets.xcassets/particle_red.imageset/particle_red@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3457860ba7f7bd73f631e31fc028836982c347c0 GIT binary patch literal 705 zcmeAS@N?(olHy`uVBq!ia0vp^LO`s}!3-o#m%pe6QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIqv(eg-X`1T>2kq7-N#RyNi>+b=xmM4rhT!WHAE+ zH!u#kg%~g0t@{HMWH0gbb!C6ZBra%a&MUv)7%24B)5S4F<9zO==-@*J0&Nf1hn#hC zWohyf6$sf7cHlFo>#zU+r_3%fxGj5ccHaDMANAM+;#VJ4v_0ozC&x(aXC)@yKn4!|Mdnm1Ax# zx-`Q;GbDV+wUW)<%Vw#~c=Dvo9Ef*ziBCY z^3Uvf_tTroBJjg))C{U#0rvipavbp{@VTgp`lg z?6jSj7WUMP^|sdr1&77&%1c$hfB&7n_ut(qpXK*@xLlKO)sh7U0E4HipUXO@geCwR C&ol4< literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/particle_yellow.imageset/Contents.json b/examples/bonfire/Assets.xcassets/particle_yellow.imageset/Contents.json new file mode 100644 index 0000000..396edf9 --- /dev/null +++ b/examples/bonfire/Assets.xcassets/particle_yellow.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "particle_yellow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "particle_yellow@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "particle_yellow@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/bonfire/Assets.xcassets/particle_yellow.imageset/particle_yellow.png b/examples/bonfire/Assets.xcassets/particle_yellow.imageset/particle_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..2b8fbea4148566c583d40e546ef66763ade645cf GIT binary patch literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol@!3-o-C#^RDQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIdZ`2{m@s;Y2kXsauPJ-#0#7x?L&_rqJaLqERv)r@)&qi=3yWML?8sbeN# zEGZ}?z|Z$&kyI5>D`S$kyNkiPJGxJR9L@rd$YKTtZXpn6ymYtj4^WW3#M9T6{UMXM zprz%j<&!``S>);B7{YNq^_-_zlY;=u#f+SQ!g=YZ1vf~q{C)r2ra+ z_TIea?aPwSarFlZmRQX*2+jVMcrIz>uBgp7pY8tJ_(elWebVN_hgHV!emE`BSh!}D ydxJo-$)nxz`)=EtUO6T#wU{yghI3589tM-M0$ca&x)}Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4NzixfKQ0)htC{C4guYs zH96W6NLiNz`2{mDN@{9IFv)8hE&2RW(D>+K0afMM(>}d;zfk{>-a&(7S|$#wUVm6& zZ)l}%YNli^rz}Y=zl5%yF=_MO zlK~Um7UblMDwW>NX!-otU$5Y0VQb@Y(_?bUDbDZAg(np4nk&?CW$xYzua@dl@@f74 z=k+bWDm-7WSIjxnV3PR~R%L&~s&o6QEo h^Yppbc7OZB_B$is!lXA(z5spA;OXk;vd$@?2>^1EB`p8| literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/particle_yellow.imageset/particle_yellow@3x.png b/examples/bonfire/Assets.xcassets/particle_yellow.imageset/particle_yellow@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..bd08cd7ee2e17416d5bd342f9e7b79cb802be7d8 GIT binary patch literal 896 zcmeAS@N?(olHy`uVBq!ia0vp^LO|@r!3-oD&wlw2q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N&4+fKQ0)htC`%4FSDw znc#E;NClJx`2{m@D{3hSX$$HkpZ43&)JjpfV)%o#2DE% z#wL%IC05Ff0#22eih?4Zh<55s(LIE@y>oW5$yeuh-9+n?fl*@P); zcG4}`7XjQ8zjDRia=!Aq$@h21FU^X@%s%e}7V5e*YrWpvctT@yB)=f9tl4pXAFJ7B zYLA5vIGU{bP&`Rc^=VO2j-!Xik-k=ogN({Yz@UVVy7Nni7ve#f826ZV&O z$^QT2EPawwdT-+$(&h>#V@prf#l@=RDm_o}0LTIeOChNnw;iR6&q{ w=7c*%m9AdeLbEG+y*{S9eT=#J_0T72{kWF!!-WC$z-VFcboFyt=akR{08>1c*Z=?k literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/rect_orange.imageset/Contents.json b/examples/bonfire/Assets.xcassets/rect_orange.imageset/Contents.json new file mode 100644 index 0000000..242b927 --- /dev/null +++ b/examples/bonfire/Assets.xcassets/rect_orange.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "rect_orange.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "rect_orange@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "rect_orange@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/bonfire/Assets.xcassets/rect_orange.imageset/rect_orange.png b/examples/bonfire/Assets.xcassets/rect_orange.imageset/rect_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..e58c3c82add034ff4786e2e5aaefe3f8dc3f617c GIT binary patch literal 1482 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 literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/rect_orange.imageset/rect_orange@3x.png b/examples/bonfire/Assets.xcassets/rect_orange.imageset/rect_orange@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6c54079038ce3daf148b812e4328ec636a9440c4 GIT binary patch literal 3694 zcmeH}{X5h9AIF#b;%G}>?v1~`1 z6K6VdQ_31OGgCU94$T-x4K>Dh=b!lgbgt|DdOWZ9^Lbsb>w3Sg_Ybc^e_wZ1<$cN^ z5J=V2!!-~D+L8EgDalHm0}sQzq#_sR?BfgqQSrMrqvij#ksg6QAQ09R1j^0>fy7cP zn-2n^e*%F7Q6P}RLl8*!=jxt-(;$#ciobU-jNkIpf9Jmm{NE-Z{g9XWG6Pa!r3U&2 zf%cpTPrcLJJu)p^T3O`1q^E>}cb-Zj3_VOZsibx8-spxnP*c|V=4;7j9z+pdwJ=}l zsqoM8-t0p0x+pRzaNJ_7Nz$)&GqS4!;dxWwbS?K9I^&Od<*+mOa2bR z-};B!+r|pP=ySt95aah&T%g&!Y!c#z?U7G*aj<+8&H>IXxs;3W3@so_M#wkZR z(zm@JkTT%u>KuHXC;YH8D|o_icty)~v)W5Ph*74W9sT1WD<%-V!ks(*VRjcc=#4p{G&7posHaX=?NccIOOP!6t z%%=PVzw+;h?<;<6wnFry_R7@}82{-dxMg3`$Xow6lkIg9lAqaF*Zc%!ac%Z)b!T_X z>?1eP^+4u@sr$MjkM__vu>ILym>Y9%Wa`~}QkV#ljS_ov3M~(Bi@;1`MFE?~o;DoT z;on7sHn2V?kMy1xK2me#-JFToKa+krarEsxK(EKoMo-ft?)ZlODvLYL>S?m#wO1Um zN_v-gZ-s|>OgF80ocdskXOy&V)c$rpaJ^oA9%fkA-sKBPeadJx#QERI5N`Y9x8gC4 z_@XNp9~cV`9QlZMvV4+JT;ti++o_L>I0_~z?IXokhCzzX;p*bChkgFb z)ecI4dLv%-$O{Lq&WaHa!jK`# zEowQ0{CJr-wt6lp_fL(3TqA#Y|5^@0fo{guq%a!h@InoH462iuj?8dl>PB z7iJzo2CNTkQ}qHiN|{BxWK=BM3E9=OrdxH8*2%RbNd{xRgvQ_qV4I>Bv~iP3;8~;Q z*iO-1ZEK1VAeuGz5K;1n4pb;h-wT|k9{`Tij{uhRp8ym3Nx*=97T81g095GyfE+yx zSm)-DE+C6r(~7OCd57uO0Swp6@VDn7f=}n8ELP*!sO4D8X|5OKV6PPBRZ<+zkisg0 z>s52mQ3@M4B`U^U{8e*D2)=!B?X!&@Yu= zgb2p8i^yz^qbd<3<8w;%KzGY5R7>gkKJLX30e`jt_jjh~%Dp5(i7yVNhP59@^fU!x zlHHR{r*lijiCP8Y#XB*lHAcj8SnGMC5-4OpqvE>RKv42ycl_ZgR|byO-+mh3zFdD@3`lB zjf+>!MYcC_5WCe_(Xk3hS)l_dd3h>6&2*u6y!|2l@Bn_*g&*KOZTA5yi`ANL-9BTP zUpq+eOPJ*FVK*EhtNS+e`LNqnUzaIubujgq_mv~dMK`n<1?V`l3;%q$T|3azq(!cC z>5Pv2Cbuv>j(oVjc@mvF6CB%JRBE$unQyhIpVi%|3dzSIF_$pG^=*{p{Dt*dOE+tc zvEn99cSC^^Kca~PA9Ilt2{i=y;^mZ$iP9T`B1gXAA#4H{tAo9HtIrVy(TBLWTDOtf zSILRGIBSWm1SV2G*z$4V9gE+SFnMRSiLU|0UVho54S{;hN9a~Gxhu_|Ll%wc52lVD zZ!)`;(EY;+oAa=uvWven#vvgyyY@iqq_>UK;*BmyE$jda>bE=S)%!eYkP<5|4Q7sG zGb-C(jYddgz?Lt6&7qUC6qp!?o?lLkv!6%b>Ut#-^TLw_3vO{W?|N&iCjhT8twGVv zzARw}Sn}+4mzW8X_L-~N-)MGgeh1^sV7TrmR3v9};rN^;Huug9c$n|Pc^_}xr6@f$k#q3*q2FcatauRSucD^tFiz3^uzw9xLff9l+{C$ zTKSEM3kE*|cQMXQWLhqgDSv`eS!sRlezXZ~nS+v2l{J^uGCv_NFqV04-bA zQ7n2rx;TM$t+W38$ei_H{EO*SA}^&(#F0;AIF%#n!lTIj2^_H%w*sj2CF7@Q>{%7g z$Uf20igT6T^SwB*810t$u3%<}GEhlkE@4HsX%mJoW61cZVur;Ok%^GhIsZ-$yFbCJ zcEuw(pQlJZ(B-DvUG1i!%YuydmDM-MQ)K2o(OI_|rcaWlxd;kw(XOFbrbn2Bz34=PI7>c!$&alg+H^0&vQ;RC@)O)Q`qA0 z8R)cLE$?Bb2=R8+y#YKjz-Q!H_`3ZHE(skk9$AY-9tV&;5o1+_YgJ1`_OM8xYWyQr z*gZ}vF~`a=s-oc7Zw(=frxDjo&HzKD=eO8JhEym~+c7Xdz#=VAxg}(AOxu^tJy@KJ zpt@+Q(_#va90P`Gso#m(88`oG4q2=of|I$YimDLQE}b*9n79!IDMr<#c&S5+@q29~ z#fYgCuZ~Ia5=@K1U#>$?-BX;&+<~VJA*cd&k?;=UG#w6n;$9)akiD%sw}rI`OK=Y2 z2>2$#1YCqT04_xsfbSvpf-4Yvzy!o@a4kZGuFi&1B=tJK2zSvys4U_Xa>JErFl`NR zxP1Y3!)thg6&=s^rb?P)3xyW;E~qThRP=^7Q)N0C2;uex**#yYBdDgS?f^`=$BE%l zK@G9lJ_T5%3=0HY#r`S^!EUCK00E?0yl#$P@;Tfa0*fUY^`Zc)-1)455kXS%DkwfY%Yyh`*%X={-k;k)N z_jJmTKK5$kZgksks<}xv+(e%)OlB&%N(xNG{A@LjO!I8-ITEIMoXWdw+4rQ<(L-GIgqMtN_-HDK!=ZWx4IwzW9QGR%>Rdc>K<;nz@LO zt_|DTIFE~7Tg;`2k44X#{P;mIvqc7l1feS7PP2FcF@-&s6vgpIYj_`>=5>`u{A@z| z;~~or*Yt2E_=Qtw2QdE~u6X>#%I~|%<6`bQZEr#NO}mNlf5!K}bywUfbW$iMbndy< z&)D>`6N8!s*XJZzv+|PVSG8)Q>sT5~;&<*z=t&yMO!rAsTp4-2#f9|k)0WPatfX9G zghmIOn)ESiBa+#_nf7rzjXZhLUtkqC&i??XTy%{9 literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/rect_red.imageset/Contents.json b/examples/bonfire/Assets.xcassets/rect_red.imageset/Contents.json new file mode 100644 index 0000000..1c49982 --- /dev/null +++ b/examples/bonfire/Assets.xcassets/rect_red.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "rect_red.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "rect_red@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "rect_red@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/bonfire/Assets.xcassets/rect_red.imageset/rect_red.png b/examples/bonfire/Assets.xcassets/rect_red.imageset/rect_red.png new file mode 100644 index 0000000000000000000000000000000000000000..ddad683ceeca0c593f585c693df0abb9a39c4ce7 GIT binary patch literal 1482 zcmeAS@N?(olHy`uVBq!ia0vp^l_1Q)3?#Kw>Z*YhOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>zV;k$D*{c_{M{0jmzH*wS_PyxTZ{m|$UWGi(Pn_AcZ{wwhKki-JyKZ`C zyuQ+-d0sD?=S#m4&OCc4`k#Nr+zB0Z1rdi|i+%sn`tn)5`*Ww1?N`@pa-Td=2XqT# zlDE4{qtLE(|9~9M0*}aI1_o{+5N5n|x9$&6kiEpy*OmPtlenOzRq?vReGClDOr9=| zAsP3M-tLSS3KU@f(4ICUdyyxooS`)1A+by8l~b}ZNT_TjS|lNKK8hJ?XJ!g^NQ5_|Kzgso;c|Lc$yHuU$!Daps7eBm09i;Zwuq4_KSCYVh-s( z^I#K~JLh$XL0K{6#|jf3gDwy4gEO`$^|V_Ex(u;d5cNMJ-RV9!@IyB zmzQsm?xBBMLT~iH+s<8m`C6j>EQWRdlMj4-5uncbMr`NSuUnm2n0rDGJEs^N*y#0R zhYvrC_G97M1y5KMc?@R$)}OD^$|z<2faPhN_+lb1>P-(;A11d3BC0sKJ$t8 zqE^p+T8o}_XFQ#ikv3^@6KC7&oa=Ma|IE!dIB9-VSMBGv9fwu!i>~$gWLr4jbDn5! zqS%kdYPE%0N~=F#n3}BfX>roYa~tm#Tdw>3?eQhg`e_S~z4#e^&qi_j?o*<7FPj+J z?B5W0?3>`}?%A=&)0ces+{L+E04q_szTb&$;`5zkI66@Qv_*EQKc;t`Iv!ZCdB9|1E6gQu&X%Q~loCICh& By>S2l literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/rect_red.imageset/rect_red@2x.png b/examples/bonfire/Assets.xcassets/rect_red.imageset/rect_red@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..deed235bcf3f5e8c192ccd83ac202aefbf9b3844 GIT binary patch literal 2323 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 literal 0 HcmV?d00001 diff --git a/examples/bonfire/Assets.xcassets/rect_yellow.imageset/Contents.json b/examples/bonfire/Assets.xcassets/rect_yellow.imageset/Contents.json new file mode 100644 index 0000000..f9788bf --- /dev/null +++ b/examples/bonfire/Assets.xcassets/rect_yellow.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "rect_yellow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "rect_yellow@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "rect_yellow@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/bonfire/Assets.xcassets/rect_yellow.imageset/rect_yellow.png b/examples/bonfire/Assets.xcassets/rect_yellow.imageset/rect_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..1c4f86183ffb60c6485ad1e5b2c544335ca3a770 GIT binary patch literal 1482 zcmeAS@N?(olHy`uVBq!ia0vp^l_1Q)3?#Kw>Z*YhOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>U4CM>l-$DKKW9l+fBjs{ zrgQm>YU-yb#x~YPvsW)@kJSFCeC0Gt?R(Lw-^3@iyb5`mpE$E?-^NQ1f84vccir^P zczvZu^SoX(&zF89oO$+8^gsWKxf43-3L*}_7W@9C_2sjA_vcP2+pn(IZH7|?O3kw?Zam`DBrpCWXrpp%aJa&6Jy^7uJChD&)HsD z?jNojee7}d+FhL~<`t>;|H)T&1au6-zC3tNwK_Cbj)YB_${hnH<(%yE-G zsJ2CMjlcBaT_#Lx+!r6PG7(zixA@>H6Qwn7iw`k)W=cs;TYfPy@)nbhdvs%JhIfHM zE-&9A-9!Jjgx=_Xx1GEC^0h?$Sq$s^Cm;CwB0!z5P5a9CJ#^6oQl&1YX`PO@?3 zW1ge?cjIx%CohxozsWH32o$HzQg_YW^lq`zd8PT{iyB$kJUY33KK1N4p%O1NedZJG zMXjFuv=%+<&UiX2BW=>+CeF6kIoIc;|CyU_aMJv!uG-ISI}WSd7hUV~$+mF5=RDEe zM6n-@)oKg1lvaPfFg01{)8eF)=QiFgwp{o5+v7`~_0tv}d+{^;o{i%4-KRwFUN$kb z*}oz1*f+t`-Lqqlr!V>Nxr=kT$kV!V6|HC!{TC0GK7FMXRTU44L624VCw6+TKCy20cBA|g&!?YV zxOV0Yo|gNnXJ%HNT>ESP>bm_I@0)k=pL6&Be)&|B<%9J4e?iy({yMuZ+ULdZ7bU#A z%|0=Iy{z^=g{{u-?=RcwZC`FZnE&IKAfWC$NY>9Eertw zF!n#{6ROpzf1t0cWiM_bRV%9#yo0>~fPK?wF=man-WGc_G#CKLHUMztIsnXTtt%=3 z$k+z}qh|rYl?DJ1Vg>JnI{>Vr9S=hJPX5&YfBdg)Kzp@PGfB2q^3y|)g#qSX3Hfzx z-9zKkzu|OXX%AGX`?j6qOb{(Dh=ZOi8W29=jY#LQO62=4kBwE!mBAzH%ISu?q&8tw z>d;FWy3Dl?o1SuCJa6GYqh_H_Ov);b4V!t!%R>U$|CyWJ5Zk)6N&lCgH~A4Lv4B}@kV8R`qpoNF%RF^p$=^Jx`OgL9?>3p z!T9k8wwE`m@t)%ouTm~rRg=Cd0D|{zimd1&=$zgbN2lj>Wp`CBtmw414POm1!#xaO zqrqJfoSrfA6hRuBU zxFSXCzAyMoeDreGjLG#i37ahsO_=n}8SUP}9%kh`<`nFodT5n35zYfW(0`XxJO2eA zoAg+a26=M1*u>?s0YTlnU|ug^x*&f0Fgv0v>3vYks_$mrlALii=yZ0y<_t=krX;b4 zBP)HID5b5qsPEaNywB+k$hr+ViVQZy-j00+UU{mK9_kJ)_@=Fl#-r=C@Uha`*G$I$H^yMxBYUWYm=U512x zI0I}HXC15|fx=Ki-~8*&M;kVj6Nxp)$p!Pc1pyDYSxCmY30-j*;eceC z(q2vg7r^C?>tnf*mVNlPgZB^~Hx(j6N&dk?gdKK8sVZD5uiZJFz~mQ2C2_g8x`dtY zYh235lkX2#rBy@9C(!5A1dS&p6=I$nr?FhMo8`I3q4i)77=aeD@t| zbUhgw89OJes>w8^zRgj*%ht7pz9F33Z8E1r1`#q#ierCo@!WFfwCD5@k|n>0N9l86 zR#ii~dl@AEC?AuWKPFVdYzuxtZAbfH`n{j~2`TDHb-)&tlY7RNLi5b-*eqTS@$QI+ z2K*4cY@1ucd?kaV2?C>Q8i*MyO}$?&G-j<*kmB($C$_Y9b~

TkaaSRMm@D`Zpgoa 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 literal 0 HcmV?d00001 diff --git a/examples/bonfire/Emitter.swift b/examples/bonfire/Emitter.swift index 8415dc2..09a12b7 100644 --- a/examples/bonfire/Emitter.swift +++ b/examples/bonfire/Emitter.swift @@ -9,24 +9,52 @@ import UIKit class Emitter: UIView { - let emitterSize = CGSize(width: 120, height: 20) + struct Settings { + var image: UIImage + var emitSize: CGSize + var pullToCenter: Bool + var frequency: DoubleRange + var ascend: DoubleRange + var wobble: DoubleRange + var rotate: Bool + var scale: CGFloat + var duration: TimeInterval + var initialAlpha: CGFloat + } + + var settings: Settings! + private var availableParticles = [Particle]() + - func start() { + func start(_ settings: Settings) { + self.settings = settings self.clipsToBounds = false - self.backgroundColor = UIColor.red - Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in - let particle = Particle.create() - self.addSubview(particle) - self.position(particle: particle) - particle.move() - } + fire() + } + + func fire() { + addParticle() + + let delay = Int(settings.frequency.random * 1000) + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .milliseconds(delay), execute: fire) } - private func position(particle: Particle) { - let x = -emitterSize.width/2.0 + emitterSize.width*CGFloat.random - let y = -emitterSize.height/2.0 + emitterSize.height*CGFloat.random - particle.frame.origin = CGPoint(x: x, y: y) + func addParticle() { + let particle = self.dequeueParticle() + addSubview(particle) + particle.move() } + func dequeueParticle() -> Particle { + let particle: Particle = (availableParticles.popLast() ?? Particle.new(withEmitter:self)) + particle.reset() + + return particle + } + + func recycle(particle: Particle) { + particle.removeFromSuperview() + availableParticles.append(particle) + } } diff --git a/examples/bonfire/Particle.swift b/examples/bonfire/Particle.swift index 9e2226e..012173a 100644 --- a/examples/bonfire/Particle.swift +++ b/examples/bonfire/Particle.swift @@ -10,125 +10,134 @@ import anim class Particle: UIView { - static var allParticles = [Particle]() - static var availableparticles = [Particle]() - + var scaleContainer: UIView! var rotationContainer: UIView! + var emitter: Emitter! - class func create() -> Particle { - - let particle: Particle = (availableparticles.popLast() ?? newParticle()) - particle.reset() - - return particle - } - - private class func newParticle() -> Particle { + class func new(withEmitter emitter: Emitter) -> Particle { let particle = Particle() + particle.emitter = emitter - particle.rotationContainer = UIView() - particle.rotationContainer.backgroundColor = UIColor.white - particle.addSubview(particle.rotationContainer) + particle.scaleContainer = UIView() + particle.addSubview(particle.scaleContainer) + + particle.rotationContainer = UIImageView(image:emitter.settings.image) + particle.rotationContainer.contentMode = .center + particle.scaleContainer.addSubview(particle.rotationContainer) - allParticles.append(particle) return particle } - private func reset() { + func reset() { + // reset transform and alpha + let randomizedInitialScale = emitter.settings.scale.randomize(range: 0.13) + scaleContainer.transform = CGAffineTransform.identity.scaledBy(x: randomizedInitialScale, y: randomizedInitialScale) rotationContainer.transform = CGAffineTransform.identity - self.frame = CGRect(x: 0, y: 0, width: 2, height: 5) - self.alpha = 0.1 - rotationContainer.frame = CGRect(x: 0, - y: 0, - width: self.frame.size.width, - height: self.frame.size.height) + self.frame = CGRect(x: 0, y: 0, width: 2, height: 2) + self.alpha = emitter.settings.initialAlpha + rotationContainer.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height) + scaleContainer.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height) + + // position + let size = emitter.settings.emitSize + let x = -size.width / 2.0 + size.width * DoubleRange.random01.cgFloat + let y = -size.height / 2.0 + size.height * DoubleRange.random01.cgFloat + self.frame.origin = CGPoint(x: x, y: y) } func move() { let startX = self.frame.origin.x let startY = self.frame.origin.y - let randomMultiplier: CGFloat = (CGFloat.random < 0.5) ? -1 : 1 - let steps: [CGFloat] = [ CGFloat.random(offset: 5 * randomMultiplier, range: 40), - CGFloat.random(offset: 5 * -randomMultiplier, range: 40), - CGFloat.random(offset: 5 * randomMultiplier, range: 40)] - - anim.defaultSettings.delay = 0 - anim.defaultSettings.duration = 2 + let randomMultiplier: CGFloat = (DoubleRange.random01 < 0.5) ? -1 : 1 + let steps: [CGFloat] = [ emitter.settings.wobble.random.cgFloat * randomMultiplier, + emitter.settings.wobble.random.cgFloat * -randomMultiplier, + emitter.settings.wobble.random.cgFloat * randomMultiplier] // move up anim { (settings) -> (animClosure) in settings.ease = .easeOutQuad + settings.duration = self.emitter.settings.duration return { - self.frame.origin.y = startY - CGFloat.random(from: 80, to: 160) + self.frame.origin.y = startY - self.emitter.settings.ascend.random.cgFloat } } + .callback { + self.emitter.recycle(particle: self) + } // fade anim { (settings) -> (animClosure) in - settings.ease = .easeInSine - settings.duration = anim.defaultSettings.duration * 0.1 + settings.ease = .easeOutQuint + settings.duration = self.emitter.settings.duration * 0.2 return { self.alpha = 1 } - } - .then { (settings) -> animClosure in - settings.ease = .easeOutQuint - settings.duration = anim.defaultSettings.duration * 0.9 - return { - self.alpha = 0 } + .then { (settings) -> animClosure in + settings.ease = .easeOutQuint + settings.duration = self.emitter.settings.duration * 0.8 + return { + self.alpha = 0 + } } // move sideways anim { (settings) -> (animClosure) in settings.ease = .easeInOutQuad - settings.duration = anim.defaultSettings.duration * 0.2 + settings.duration = self.emitter.settings.duration * 0.2 return { self.frame.origin.x = startX + steps[0] } - } - .then { (settings) -> animClosure in - settings.ease = .easeInOutQuad - settings.duration = anim.defaultSettings.duration * 0.4 - return { - self.frame.origin.x = startX + steps[1] } - } - .then { (settings) -> animClosure in - settings.ease = .easeInOutQuad - settings.duration = anim.defaultSettings.duration * 0.4 - return { - self.frame.origin.x = startX + steps[2] + .then { (settings) -> animClosure in + settings.ease = .easeInOutQuad + settings.duration = self.emitter.settings.duration * 0.4 + return { + self.frame.origin.x = startX * 0.5 + steps[1] * (self.emitter.settings.pullToCenter ? 0.5 : 1) + } } + .then { (settings) -> animClosure in + settings.ease = .easeInOutQuad + settings.duration = self.emitter.settings.duration * 0.4 + return { + self.frame.origin.x = steps[2] * (self.emitter.settings.pullToCenter ? 0 : 1) + } } - - + // scale anim { (settings) -> (animClosure) in - settings.ease = .easeOutExpo - settings.duration = anim.defaultSettings.duration * 0.2 + settings.ease = .easeInOutSine + settings.duration = self.emitter.settings.duration return { - self.rotationContainer.transform = CGAffineTransform.identity.rotated(by: steps[0].radian) + self.scaleContainer.transform = CGAffineTransform.identity.scaledBy(x: self.emitter.settings.scale * 0.3, y: self.emitter.settings.scale * 0.3) } } - .then { (settings) -> animClosure in - settings.ease = .easeOutExpo - settings.duration = anim.defaultSettings.duration * 0.4 - return { - self.rotationContainer.transform = CGAffineTransform.identity.rotated(by: steps[1].radian) + + // rotate + if emitter.settings.rotate { + anim { (settings) -> (animClosure) in + settings.ease = .easeOutExpo + settings.duration = self.emitter.settings.duration * 0.2 + return { + self.rotationContainer.transform = CGAffineTransform.identity.rotated(by: steps[0].radian) + } } - } - .then { (settings) -> animClosure in - settings.ease = .easeOutExpo - settings.duration = anim.defaultSettings.duration * 0.4 - return { - self.rotationContainer.transform = CGAffineTransform.identity.rotated(by: steps[2].radian) + .then { (settings) -> animClosure in + settings.ease = .easeOutExpo + settings.duration = self.emitter.settings.duration * 0.4 + return { + self.rotationContainer.transform = CGAffineTransform.identity.rotated(by: steps[1].radian) + } + } + .then { (settings) -> animClosure in + settings.ease = .easeOutExpo + settings.duration = self.emitter.settings.duration * 0.4 + return { + self.rotationContainer.transform = CGAffineTransform.identity.rotated(by: steps[2].radian) + } } } - .callback { - self.removeFromSuperview() - Particle.availableparticles.append(self) - } + } } diff --git a/examples/bonfire/ViewController.swift b/examples/bonfire/ViewController.swift index 874e51a..5874afa 100644 --- a/examples/bonfire/ViewController.swift +++ b/examples/bonfire/ViewController.swift @@ -11,18 +11,98 @@ import anim class ViewController: UIViewController { + var mainContainer: UIView! + override func viewDidLoad() { super.viewDidLoad() - let backgroundView = UIImageView(image: #imageLiteral(resourceName: "background")) + anim.defaultSettings.delay = 0 + + // background + let backgroundView = UIView() + backgroundView.backgroundColor = UIColor.black self.view.addSubview(backgroundView) backgroundView.snapEdges(to: self.view) + let backgroundPatternView = UIView() + backgroundPatternView.backgroundColor = UIColor(patternImage: #imageLiteral(resourceName: "background_pattern")) + backgroundPatternView.layer.cornerRadius = 23 + backgroundView.addSubview(backgroundPatternView) + backgroundPatternView.snapEdges(to: backgroundView) + + // container + mainContainer = UIView() + self.view.addSubview(mainContainer) + mainContainer.center(to: self.view, verticalAdjustment: 20) + + // wood + let woodView = UIImageView(image: #imageLiteral(resourceName: "wood")) + mainContainer.addSubview(woodView) + woodView.center(to: mainContainer, verticalAdjustment: -100) + + // emitters + createEdgeFireEmitters(x: -16) + createEdgeFireEmitters(x: 16) + createParticleEmitter(image: #imageLiteral(resourceName: "particle_red"), ascend: 80, frequency: DoubleRange(min: 0.1, max:0.2), y: 40) + createBaseFireEmitter(image: #imageLiteral(resourceName: "rect_red"), scale: 0.9, ascent: 60, frequency: 0.9, duration: 4, wobble: 5, emitSize: 20) + createBaseFireEmitter(image: #imageLiteral(resourceName: "rect_red"), scale: 0.7, ascent: 140, frequency: 1.7, duration: 8, wobble: 10, emitSize: 38) + createBaseFireEmitter(image: #imageLiteral(resourceName: "rect_orange"), scale: 0.6, ascent: 50, frequency: 0.1, duration: 2.6, wobble: 13, emitSize: 20, y: -18) + createBaseFireEmitter(image: #imageLiteral(resourceName: "rect_yellow"), scale: 0.2, ascent: 20, frequency: 0.3, duration: 1.3, wobble: 10, emitSize: 10, y: -12) + createParticleEmitter(image: #imageLiteral(resourceName: "particle_yellow"), ascend: 120, frequency: DoubleRange(min: 0.2, max:0.4), y: 20) + // logo + let logoView = UIImageView(image: #imageLiteral(resourceName: "anim")) + self.view.addSubview(logoView) + logoView.bottom(to: self.view, verticalAdjustment: 34) + } + + // MARK: - Create emitter helpers + + private func createEdgeFireEmitters(x: CGFloat) { + createEmitter(x: x, y:-15, withSettings: Emitter.Settings(image: #imageLiteral(resourceName: "circle_red"), + emitSize: CGSize(width:10, height:5), + pullToCenter: true, + frequency: DoubleRange(min: 0.3, max:0.4), + ascend: DoubleRange(min:20, max:38), + wobble: DoubleRange(min:0, max:5), + rotate: false, + scale: 1, + duration: 3, + initialAlpha: 0.1)) + } + + private func createBaseFireEmitter(image: UIImage, scale: CGFloat, ascent: Double, frequency: Double, duration: TimeInterval, wobble: Double, emitSize: CGFloat, y: CGFloat = 0) { + createEmitter(y: y, withSettings: Emitter.Settings(image: image, + emitSize: CGSize(width:emitSize, height:10), + pullToCenter: true, + frequency: DoubleRange(min: frequency, max:frequency+0.8), + ascend: DoubleRange(min:ascent, max:ascent+50), + wobble: DoubleRange(min:0, max:wobble), + rotate: false, + scale: scale, + duration: duration, + initialAlpha: 0.2)) + } + + private func createParticleEmitter(image: UIImage, ascend: Double, frequency: DoubleRange, y: CGFloat) { + createEmitter(y: y, withSettings: Emitter.Settings(image: image, + emitSize: CGSize(width:120, height:20), + pullToCenter: false, + frequency: frequency, + ascend: DoubleRange(min:ascend, max:ascend+80), + wobble: DoubleRange(min:5, max:40), + rotate:true, + scale: 1, + duration:2, + initialAlpha: 0.1)) + } + + private func createEmitter(x: CGFloat = 0, y: CGFloat = 0, withSettings settings: Emitter.Settings) { let emitter = Emitter() - self.view.addSubview(emitter) - emitter.center(to: self.view) - emitter.start() + mainContainer.addSubview(emitter) + emitter.center(to: mainContainer, horizontalAdjustment: x, verticalAdjustment: y) + let settings = settings + emitter.start(settings) } } diff --git a/examples/circle-menu/ViewController.swift b/examples/circle-menu/ViewController.swift deleted file mode 100644 index af137c3..0000000 --- a/examples/circle-menu/ViewController.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// ViewController.swift -// example-circle-menu -// -// Created by Onur Ersel on 2017-02-21. -// Copyright © 2017 Onur Ersel. All rights reserved. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - let backgroundView = UIImageView(image: #imageLiteral(resourceName: "background")) - self.view.addSubview(backgroundView) - - backgroundView.snapEdges(to: self.view) - } - -} - diff --git a/examples/shared/Assets.xcassets/background.imageset/background.png b/examples/shared/Assets.xcassets/background.imageset/background.png deleted file mode 100644 index 36d7624d6ed5af3a180012d74251051f31245a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2022 zcmeAS@N?(olHy`uVBq!ia0y~yU@T`~V4BUr3>2{}uv!76SkfJR9T^xl_H+M9WCijS zl0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP$ECTC&U#PyJTGBYy^iHItwsxdJ!iHb|AY3uOv^D{CsO3KJeNXy76 zsW3CMD5|Q-E2}aBRWLEDXlko!Y6}Pn$t$a3ox^=sAy`< zYtwQATFIE??e4vL>4nJa0`Jj<^hl`P9_J+xE_6 zU|>7w>EaktaqI2Pw|>&@3~d(+vx0My512@Bsr>bL_g~68po?kg.}&n&|~ytGt2(JyyQPJlgit*;{$n{s;d}DPMJbZ|3sdlc#T*zxK-p z^Ze3p^Itu$w$0)ae}3NY+x;(#Jay*J`SiYe{=R9azu%WJV&9vl)V})oJMpU1A>aDV zCHJNn#pjz|-~U>1^3I)gFZNxwUbeYEg_Nx4XQwzV^1ESk>Vv zVvoc8XIy$~aZPwxiOsaCLsQ_~g z>SV~b|7r5!?0ZweMg8N;OXG}tPy0WXe!cXbap%)2o5Fq9yO$Ld+Rd~6y~cfS<^1!< zxc$ohR{xsmSFZjz^|kN&>+_!$ZI-*gafj``=&yJFdn{kQ`|sOFk> diff --git a/examples/shared/Assets.xcassets/background.imageset/background@2x.png b/examples/shared/Assets.xcassets/background.imageset/background@2x.png deleted file mode 100644 index dbdd9ad54eb34c7be6315a65a868c3cd0b86026e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4480 zcmeI0|5MU;9LL`xUj_tzkNg7o1&~D1t(M`(WOW)iE6Y{OWesaZ%f8#hF~zn#&3Vq- zTA2~L9e29*#b$~t3$dC~!}LDU)k0&MiZ%jL5nG7t!|wJ!><4~$-}7G2*DvpT-~0V~ z-s4@haf5(F2qORhNSVU)8~{*O05B`w@)(E2SobE& zoto<*fyupW{_l2*i8nzo{w&>p(Rs<*(8RfN<#5T2#k9)|z20v4=zz@mpjWNBw7u(& z%c6J&^RX>riP*VN_v^y&h;fn*lH2B9-KO+(X_iTOB~=PnxK=h?tAGk@!)sgl(o|_u zNsZQhz3647K&id+Bqin6PK&u3&KfZ%Sa-xYVzUJU<%3i9`&(3Wez-c|kgjc1S5RhM zQxS5lSe9#vOJD^b?!bnv@+ntQbW!uC2kqE%I)i<55}#Bz z`=S{R5^=-zmpmfS4|?Qq^8=5_PfM=d-?pyndqMBx5!e-bC=Gp*Ib^Y3NNuZyNsZ({SB(C8ayBqp8QkK|Sp} zDXMQzp%g-7++yEvN1xNdcD<)p^Fr&vp}8iNM+)@qkkq$tx8!`2!oyaO?bx5RRVY)d zi#z933c6E`J36!VqcBHA{$fIv{U4Xfic_SxzTw*$*8aWh*As_T*-m9;_q4^`;A~Hp z;^PO6PDAra_yf^X@vRM&Q*qK)P_$y|+TydOFruKC{nrefIBOSMR4K1(6UQE^;ff~|o zTy)HYKW;>@`0Ct@=4yZws%)qo>xVqxY`f*?!buFH?mWm*h%W}%^ feWS*AbKLX_*;>~0=OzX6p8zs5Hl(+#5q_ diff --git a/examples/shared/Assets.xcassets/background.imageset/background@3x.png b/examples/shared/Assets.xcassets/background.imageset/background@3x.png deleted file mode 100644 index c8d44a743d58db717bd50916facd2fe5337e1561..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7641 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 literal 0 HcmV?d00001 diff --git a/examples/shared/Assets.xcassets/background_pattern.imageset/background_pattern@2x.png b/examples/shared/Assets.xcassets/background_pattern.imageset/background_pattern@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d98b539b570953d468803cbb824b2651e3eb2e57 GIT binary patch literal 602 zcmV-g0;T?B00004XF*Lt006O% z3;baP0000WV@Og>004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0000U zP)t-sB`Pc@EG{T5FDEN4B`GT;DJv!`EhZ`~C@d}j000l}W@`Wd00Cl4M??wn*`@3N z000SaNLh0L01FZT01FZU(%pXi00007bV*G`2jK!24HPRZ2;+wU00D+cL_t(o!|m5g zYQr!Tg<*LI!7E4{=sGfy#u`Lq8j2UtNx{qSm0x=Jo--(vxF(u@#5DN)q%ut>=W2s? zya^4&sG&hPYCt$?cSCy1g1MG0PShM>iD$9e9h z?lPwBlN(s~#Gvl^q_?um)%|0&Ob1j;)S*MQhz{fGfez$Ga5Dtm*$|9{VvLGWl%OcV z?#b%zJ*m4VzukhW`gTVBvyXN{@b({VAFzgdU>e@~Yqd=CJJUvsJ5#OWRFn=!b*QDN z5TjxgB`C`9MEdnD=~qUN`;A4we(#^8-zk?TeuI(=d%ySB@9LmxnQn5a{^zf_zR{Qb o+8aHLwWc4|rzpGEf25ssI2007*qoM6N<$f*Ef4_5c6? literal 0 HcmV?d00001 diff --git a/examples/shared/Assets.xcassets/background_pattern.imageset/background_pattern@3x.png b/examples/shared/Assets.xcassets/background_pattern.imageset/background_pattern@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..81955bd0d6094dc9fd04435efbd8f86287010cf4 GIT binary patch literal 1418 zcmZ8h2~d+)5dOJ}BqH~1#a2j!ghPZuFeoTNQ%=c2D5we1G8_eJIgDb6faNk!pg}|o zS|AWeAmI>2KoSlSuNt`(kP?t9NJFs_BlO2*Sq`+`O_+{4!c00enZ1z8RBcT|<0Js(dfKgm&>j@M{Py&2#XiIA(9BI4P#%?dt7LKs7v_e??D zN-50ynCI@sC^tIjXv7^4{t*D6x?5XGJWf-9pn5#U7p*>}Y^14=KyI7P04FD4JUwvd z$E2n61vl)q)3cJ=uNBhIr2oz+Y}*X++Lop>S5hA7%z1G-=o0#|s3azDz)^aw>jDb3 zt1NT+-o=Ph_}b@>=NKkjY4tRRy5Qz8r?%M1Q~B$=55l821$#!DvNKFb2Y<3+ zkXcsN;zlwi6(P)5AL&FVWOH`R{)0}ci!+nZTdS6C z2EYiA$2+AOaKW}mw1i$hmL^d=XQql>VjZ{cHm8DI$S$C- z$%YdKBdu3PGC7WCmL>?L!))CvjDf+o{00$;!WO4{8|CuO;oYNy4}B5xm3gjOaerhq zFWK18*lK_*WVI^i>|^#6i$r=%Q|=M!g05kNbq=wV!^IS7vl|@L(@OdmhK0tN9BvBL zgDukw`mdi{wv6NA@V@=-zU%!hv-tw=a9iXW$K}9*mnyF+`6x&AATB@No#$KmkY&Or zljjAzU;XOG2L>}{D>##*&#-wTK?{Yw8(eBd#||BTsl*%uUfd&m{;7#3jsjQj zG4!$24UrA>!5B@+$UFVmqZCMpkriE#z%m{CD5!*m8t9vq^jB1QS$I3Kb+4r{upY7E z%zVve%pO-H52NCuy7k}$zB%0{spe~bmtEJTqHd{gSCjYZ&QHYL>f#LoHneU#TTHpB zpq;F}tougw{rN(z=Yx$S^}<5Ao_leu%#DgB>YKeAjJ0 z;ahAsj6s8^$ghekUi3;{3S41j*;1O8*W%4&hs4tH!-ohbABT6!&6QiCIpg~Iw{g+s z8yQjdTZ5z;MC*DdSY|a^z*3fUt|V9nOpWZ>d0)Z%&B&jw%oncPF<9B!2e%8As#((? z^2Txa_Nn6Zr++w?RF(+L)^SIr0-g2l>agyH{xU&qo9t6S{Zp&tz+5x*FRN!?Q&Y=j zZ#BmMTwa~k$oVw&M6WG*8FhP66a(3{PB=Nbn*MAPe_xKC>C>B?dV+h-gsXPd+vcLk z&IW0xv5JJ$P4v25jp;vq(&(ENT(=DsN9@_9*A);4Y>$c)b9mmJ|H`Xb&gmn!IA=@h zUUGVuWA&Aa`*AGywi6aixOS{QMxs#x#kYpC+#Q&sD5ZBb4OC^XjU7>g8%UcWEPPe9 zr1l$$2G0M>r+RbwqLH#r>y%y^c2etxN4x*py^HHm-8DZbQ`?*aemVdK?dMr{gp~R> D?oo&v literal 0 HcmV?d00001 diff --git a/examples/shared/Assets.xcassets/background.imageset/Contents.json b/examples/shared/Assets.xcassets/splash_background.imageset/Contents.json similarity index 67% rename from examples/shared/Assets.xcassets/background.imageset/Contents.json rename to examples/shared/Assets.xcassets/splash_background.imageset/Contents.json index b2a8fbf..e65f934 100644 --- a/examples/shared/Assets.xcassets/background.imageset/Contents.json +++ b/examples/shared/Assets.xcassets/splash_background.imageset/Contents.json @@ -9,14 +9,14 @@ "height" : 1 }, "cap-insets" : { - "bottom" : 19, - "top" : 19, - "right" : 19, - "left" : 19 + "bottom" : 23, + "top" : 23, + "right" : 23, + "left" : 23 } }, "idiom" : "universal", - "filename" : "background.png", + "filename" : "splash_background.png", "scale" : "1x" }, { @@ -28,14 +28,14 @@ "height" : 1 }, "cap-insets" : { - "bottom" : 40, - "top" : 40, - "right" : 40, - "left" : 40 + "bottom" : 46, + "top" : 46, + "right" : 46, + "left" : 46 } }, "idiom" : "universal", - "filename" : "background@2x.png", + "filename" : "splash_background@2x.png", "scale" : "2x" }, { @@ -47,14 +47,14 @@ "height" : 1 }, "cap-insets" : { - "bottom" : 60, - "top" : 60, - "right" : 63, - "left" : 63 + "bottom" : 70, + "top" : 69, + "right" : 70, + "left" : 69 } }, "idiom" : "universal", - "filename" : "background@3x.png", + "filename" : "splash_background@3x.png", "scale" : "3x" } ], diff --git a/examples/shared/Assets.xcassets/splash_background.imageset/splash_background.png b/examples/shared/Assets.xcassets/splash_background.imageset/splash_background.png new file mode 100644 index 0000000000000000000000000000000000000000..545364770bd76fbb1d4cc331fd7abe3dc6014cae GIT binary patch literal 642 zcmeAS@N?(olHy`uVBq!ia0vp^`XJ1~3?yBCCeH&>Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBDA60>6XFV_A%KyIiJOO4 zR9sRfLf`p$l>kH!rW0 ztQ=4=pMW4xBTx;$fFK7ar@XSNu&5YNCC~(*nas@0^2#b49Gp_J@-p&@3M#5hKp|!p zps@e{-~&)jhankZ5d*uYoP&3(b^YM=RR+0Rkv*rj-^h;3f*|qmy zLdU}e_g}j$w7nrHx%TXl*(_<3d~uJ3x$TZ^_lTpd<7^U`{K8;gKHKb~JYJ^km^?f(CEwdBvQDpL6SY3BCx zcC~NLHvV|@z2!c;ksrtWo>ZrT1f}3p{;6(1XP(itpU(PJ+^O)veOv4Lvici;)BoqY z{Pb{oRnzw6=koXB)%7ob9k@2X)bE=4wz^+epNnt)Cm;3m;ng?#$G4fTe(d|-%JkFZ zf64VZulDDk`&Yev|NiK|f4}`L*!E%Px4MFT{?oMAOygho{Um#^_i|0S+xjgTe~DWM4fE^_V{ literal 0 HcmV?d00001 diff --git a/examples/shared/Assets.xcassets/splash_background.imageset/splash_background@2x.png b/examples/shared/Assets.xcassets/splash_background.imageset/splash_background@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..74729878acefda8b76f515db33fc8d830cd6219e GIT binary patch literal 963 zcmV;!13dhRP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0002A zP)t-s00000000330tpHV5E2s>85$cNARr?pBPS^(Dl8@|EdT%j0s;aE3JMSs5*r^N zCo3%=Bqb;EH`g~~)z)Y7txW##w(UU9KZ zMK)lsJ-z?)lSjrj&KYARamp2~TGI`)PDFLn&}&t#QkJ-mu@fsj_T|;JL;G>AuP$xD zwI{5UO1Ih_I-E|smHGpvG~MN05~a)CT)Nlm3+*ud-c4qGFqER>^ah!9pF0`w;1P3Q zULTD!*bN!{j|?J(Sy(cMWdoM_^T_1n9gIMLm$NT13L!{qd*>H4gI9cGrM=X;*N z!w>64?|k>}xAc1jIMIEw{!rwBZqk29(&vv#aH7ZgzV1IM!ik>!J^e))PV};?j}+oW zqix+^DAgDKmj0>~|9+{~`aIiWA&xWurS}x$!D6`4Z#Ik zy6OQFhsU}t-f`tg*N*fS1Se`mdK;v-L*4EahZ57V1N{wz6TJmGX2gVf4fG{UUzS)I z@hZh}PT3g@Cpu&2KwV>1pk8GSpx$6QP}i9O)D30=b(7VBdYu7rqJOPp|99+|!H#$A zyNaD>uydpa)HU$hgk4v$djjx&2D=x-?jx~#VDSDO`|Y8iUX>Jnly5%l_p0Rqbni%Y z0&tB3Tb}{fmaug(%X(LczaP0CiLIrA>%ia|wwn6;#~<|$z?V64pk1YrOG002ovPDHLkV1f->doTb1 literal 0 HcmV?d00001 diff --git a/examples/shared/Assets.xcassets/splash_background.imageset/splash_background@3x.png b/examples/shared/Assets.xcassets/splash_background.imageset/splash_background@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2bef5cfee09670e6bf1a2fe6aa803d808677acfd GIT binary patch literal 1407 zcmYk5c~FyQ5XQe;7%7FyVL`lLs1#6!cv38seop`CJG1Z3KF{vX@1H#$p$x%e>@WZT z;APUFC@@!i2owzb^$tcHnBb`aiU0sGp2V&tBEXuNER9kCfQ}0QMWq1n9+Zma0YK{t z0E-C#AU*>ClmkuIBPF1*6cH8^4Ceno2n2#eq3~ALM6&HBdm4?wVmLanxz0|T`COjh zzfL3yy~&RD!DW7MxqKm;>*6BZ0=nQVfk>j#=u9WBvp|Hfu&}lv(ilu|)&hwn*-}^> zXBZ5|;&4%Dv>n~SnJ>iQEgjg7SUjHT#6e>);6gY8VMk|xYY8M0!;xb{BE#WuI+IOj zvC$Z;lM4@kKqz+hP$(1xfWhHR4i_YZ!eAgR2!^w?WO1Dl2n%Z>kxFyGTUx>42&N+k z#LjOhYXK=YngmGaP-?!DgU1wa{&9p#dKTx~R`m7iJJm)*W&2OakHzW;a5p4Ja z(P3z<;iH@98j?dRG%nD#slrdo5%a4B3Ua!(MDu<jF0QQLQTy?2*5k7D!|kqbN>lCzfmyi8pOYu!{s<|l=ZZu}~HHr|2x)0EBL+p6Ox zxzByi+cCEm7=JV;OQdLxwQ9ZHK5^l$hp6Q80g?SJm5J{o0(MS7RO77zvN9Ua9vdyO z4?Evos+!uGy~Dd(RaWGN{`Y z?LQ73GmFN4D}N4kozJgd@GDz_nkQGdug6wM^3txE;8sfZm&UYrk5t#gM|uE>cCYH} z`E1CcyxNhL9LT*Um6%ltc|GE*bYF_-@9%r`BRwUvMeCMI`bu@>d>$lCSQF{E&MsJt9$QzO-b}+CeP!3SL||9c-|tQez)GP0qd{XzWuf?uI~L#eGZ7Y zZ(mB_xioS0h9J5x*O*z!AtvmTTf9xz6XQ=0U_Gk?{_fuuqo!_4V?=W=^_SyD+dL}Y zv4{hK1Ntsb^c}AmlCwKUO;Dz@XJ^%HN#RLV*`z~qnWLVfu5{btsK0AFF)XP}ku+Tn zzC}14X%q@#qRXVG-Fz!Izdj*MH17We*U1rBWHtEj8XFD?@1$KVQB-k^WOa?;s3D;? z$*+^FzB=i3wRp(u;jP%t2Z`xwM5D)G0)H}PQUt0ZAyr+H{?FiHD{2(|OdYQMq(l2m z(YU`X17kd4NcbW6^C?+IpfaO9FoO`1@kMCr%!XVOS~~t2pQK!EI@BA z>Ee*o3sr}t^uiIbt&=uEzUZR=o#oqZhQ%GB_OSRRTV8(D);(v{?0SiN5$GJQz_s7= zjteM}V?+9@@;UZtavq%WEI^1;#@0P-+nZV6=U$C8ZD>!i$cy28baAW>Ww=9)+8jI= zcO;^VZ1C_Hd88&& CFBundleDevelopmentRegion en + CFBundleDisplayName + animBonfire CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -31,6 +33,8 @@ UISupportedInterfaceOrientations UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad diff --git a/examples/shared/LaunchScreen.storyboard b/examples/shared/LaunchScreen.storyboard index 7fed226..d6563a4 100644 --- a/examples/shared/LaunchScreen.storyboard +++ b/examples/shared/LaunchScreen.storyboard @@ -21,16 +21,16 @@ - + - + - - - - + + + + @@ -40,6 +40,6 @@ - + diff --git a/examples/shared/Layout.swift b/examples/shared/Layout.swift index 6308782..f314e9d 100644 --- a/examples/shared/Layout.swift +++ b/examples/shared/Layout.swift @@ -13,9 +13,16 @@ extension UIView { UIView.alignMultiple(parent: to, child: self, attributes: [.left, .right, .top, .bottom]) } - func center(to: UIView) { + func center(to: UIView, horizontalAdjustment: CGFloat = 0, verticalAdjustment: CGFloat = 0) { disableTranslation() - UIView.alignMultiple(parent: to, child: self, attributes: [.centerX, .centerY]) + UIView.align(parent: to, child: self, attribute: .centerX, constant: horizontalAdjustment) + UIView.align(parent: to, child: self, attribute: .centerY, constant: verticalAdjustment) + } + + func bottom(to: UIView, verticalAdjustment: CGFloat = 0) { + disableTranslation() + UIView.align(parent: to, child: self, attribute: .centerX, constant: 0) + UIView.align(parent: to, child: self, attribute: .bottom, constant: verticalAdjustment) } func sizeWithoutDisablingTranslation(width: CGFloat, height: CGFloat) { diff --git a/examples/shared/Math.swift b/examples/shared/Math.swift index 7c0a6bb..2b08d82 100644 --- a/examples/shared/Math.swift +++ b/examples/shared/Math.swift @@ -7,25 +7,37 @@ import UIKit - -extension CGFloat { +struct DoubleRange { + var min: Double + var max: Double - static var random: CGFloat { + static var random01: Double { let max: UInt32 = 10000 - return CGFloat(arc4random_uniform(max)) / CGFloat(max) + return Double(arc4random_uniform(max)) / Double(max) } - var radian: CGFloat { - return CGFloat.pi * self / 180.0 + var random: Double { + let diff = max - min + return min + diff * DoubleRange.random01 } - static func random(from: CGFloat, to: CGFloat) -> CGFloat { - let diff = to-from - return from + diff*random +} + +extension Double { + var cgFloat: CGFloat { + return CGFloat(self) } - - static func random(offset: CGFloat, range: CGFloat) -> CGFloat { - return random(from: offset-range/2.0, to: offset+range/2.0) +} + +extension CGFloat { + var radian: CGFloat { + return CGFloat.pi * self / 180.0 } + func randomize(range: CGFloat) -> CGFloat { + return self - range * 0.5 + range * DoubleRange.random01.cgFloat + } } + + +