├── DynamicMenu.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── marcyvernon.xcuserdatad │ │ └── IDEFindNavigatorScopes.plist └── xcuserdata │ └── marcyvernon.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── DynamicMenu ├── Assets │ ├── Assets.xcassets │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── ipad_20x20.png │ │ │ ├── ipad_20x20@2x.png │ │ │ ├── ipad_29x29.png │ │ │ ├── ipad_29x29@2x.png │ │ │ ├── ipad_40x40.png │ │ │ ├── ipad_40x40@2x.png │ │ │ ├── ipad_76x76.png │ │ │ ├── ipad_76x76@2x.png │ │ │ ├── ipad_83x83@2x.png │ │ │ ├── iphone_1024x1024.png │ │ │ ├── iphone_20x20@2x.png │ │ │ ├── iphone_20x20@3x.png │ │ │ ├── iphone_29x29@2x.png │ │ │ ├── iphone_29x29@3x.png │ │ │ ├── iphone_40x40@2x.png │ │ │ ├── iphone_40x40@3x.png │ │ │ ├── iphone_60x60@2x.png │ │ │ └── iphone_60x60@3x.png │ │ └── Contents.json │ ├── Balls.xcassets │ │ ├── Ball1.imageset │ │ │ ├── Ball1.png │ │ │ └── Contents.json │ │ ├── Ball10.imageset │ │ │ ├── Ball10.png │ │ │ └── Contents.json │ │ ├── Ball2.imageset │ │ │ ├── Ball2.png │ │ │ └── Contents.json │ │ ├── Ball3.imageset │ │ │ ├── Ball3.png │ │ │ └── Contents.json │ │ ├── Ball4.imageset │ │ │ ├── Ball4.png │ │ │ └── Contents.json │ │ ├── Ball5.imageset │ │ │ ├── Ball5.png │ │ │ └── Contents.json │ │ ├── Ball6.imageset │ │ │ ├── Ball6.png │ │ │ └── Contents.json │ │ ├── Ball7.imageset │ │ │ ├── Ball7.png │ │ │ └── Contents.json │ │ ├── Ball8.imageset │ │ │ ├── Ball8.png │ │ │ └── Contents.json │ │ ├── Ball9.imageset │ │ │ ├── Ball9.png │ │ │ └── Contents.json │ │ └── Contents.json │ └── Cats.xcassets │ │ ├── Cat1.imageset │ │ ├── Cat1.png │ │ └── Contents.json │ │ ├── Cat2.imageset │ │ ├── Cat2.png │ │ └── Contents.json │ │ ├── Cat3.imageset │ │ ├── Cat3.png │ │ └── Contents.json │ │ ├── Cat4.imageset │ │ ├── Cat4.png │ │ └── Contents.json │ │ ├── Cat5.imageset │ │ ├── Cat5.png │ │ └── Contents.json │ │ ├── Cat6.imageset │ │ ├── Cat6.png │ │ └── Contents.json │ │ ├── Contents.json │ │ └── blank.imageset │ │ ├── Contents.json │ │ └── blank.png ├── Constants │ └── Constants.swift ├── Controllers │ ├── Animator.swift │ ├── DynamicMenu.swift │ └── Shape.swift ├── Root │ ├── AppDelegate.swift │ ├── Info.plist │ └── SceneDelegate.swift ├── Storyboards │ └── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard └── ViewControllers │ ├── Enums.swift │ ├── FiveViewController.swift │ ├── FourViewController.swift │ ├── OneViewController.swift │ ├── ThreeViewController.swift │ ├── TwoViewController.swift │ └── ViewController.swift ├── GitHub-Images ├── DynamicMenu.gif ├── DynamicMenu.png ├── DynamicMenu2.gif ├── DynamicMenu3.gif ├── DynamicMenu4.gif └── Menus.png ├── LICENSE └── README.md /DynamicMenu.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 931399612557C3E50090061A /* Menus.png in Resources */ = {isa = PBXBuildFile; fileRef = 931399602557C3E50090061A /* Menus.png */; }; 11 | 931399642557CBB60090061A /* DynamicMenu3.gif in Resources */ = {isa = PBXBuildFile; fileRef = 931399632557CBB60090061A /* DynamicMenu3.gif */; }; 12 | 933EF27925460FE600D1D09B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 933EF27825460FE600D1D09B /* AppDelegate.swift */; }; 13 | 933EF27B25460FE600D1D09B /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 933EF27A25460FE600D1D09B /* SceneDelegate.swift */; }; 14 | 933EF27D25460FE600D1D09B /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 933EF27C25460FE600D1D09B /* ViewController.swift */; }; 15 | 933EF28025460FE600D1D09B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 933EF27E25460FE600D1D09B /* Main.storyboard */; }; 16 | 933EF28225460FE800D1D09B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 933EF28125460FE800D1D09B /* Assets.xcassets */; }; 17 | 933EF28525460FE800D1D09B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 933EF28325460FE800D1D09B /* LaunchScreen.storyboard */; }; 18 | 933EF2922546739000D1D09B /* Shape.swift in Sources */ = {isa = PBXBuildFile; fileRef = 933EF2912546739000D1D09B /* Shape.swift */; }; 19 | 933EF2BD2547B6D700D1D09B /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 933EF2BC2547B6D700D1D09B /* Constants.swift */; }; 20 | 933EF2CB2548F89C00D1D09B /* Animator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 933EF2CA2548F89C00D1D09B /* Animator.swift */; }; 21 | 933EF2CE254912C900D1D09B /* DynamicMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 933EF2CD254912C900D1D09B /* DynamicMenu.swift */; }; 22 | 933EF2D22549256700D1D09B /* Enums.swift in Sources */ = {isa = PBXBuildFile; fileRef = 933EF2D12549256700D1D09B /* Enums.swift */; }; 23 | 933EF2DA2549479500D1D09B /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 933EF2D72549479500D1D09B /* LICENSE */; }; 24 | 933EF2E2254951CE00D1D09B /* DynamicMenu.png in Resources */ = {isa = PBXBuildFile; fileRef = 933EF2E1254951CE00D1D09B /* DynamicMenu.png */; }; 25 | 935D2EFA254A157600E2DA5A /* DynamicMenu.gif in Resources */ = {isa = PBXBuildFile; fileRef = 935D2EF9254A157600E2DA5A /* DynamicMenu.gif */; }; 26 | 935D2EFD254A537500E2DA5A /* OneViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 935D2EFC254A537500E2DA5A /* OneViewController.swift */; }; 27 | 935D2F00254A539800E2DA5A /* TwoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 935D2EFF254A539800E2DA5A /* TwoViewController.swift */; }; 28 | 935D2F07254A53E300E2DA5A /* ThreeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 935D2F06254A53E300E2DA5A /* ThreeViewController.swift */; }; 29 | 935D2F0A254A541B00E2DA5A /* FourViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 935D2F09254A541B00E2DA5A /* FourViewController.swift */; }; 30 | 935D2F0D254A545300E2DA5A /* FiveViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 935D2F0C254A545300E2DA5A /* FiveViewController.swift */; }; 31 | 93643B3B2569EC7B00027DE6 /* DynamicMenu4.gif in Resources */ = {isa = PBXBuildFile; fileRef = 93643B3A2569EC7B00027DE6 /* DynamicMenu4.gif */; }; 32 | 93CD6FA2255649CD004B2442 /* DynamicMenu2.gif in Resources */ = {isa = PBXBuildFile; fileRef = 93CD6FA1255649CD004B2442 /* DynamicMenu2.gif */; }; 33 | 93CD6FC2255765B0004B2442 /* Cats.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93CD6FC1255765B0004B2442 /* Cats.xcassets */; }; 34 | 93CD6FC625578DDF004B2442 /* Balls.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93CD6FC525578DDF004B2442 /* Balls.xcassets */; }; 35 | /* End PBXBuildFile section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | 931399602557C3E50090061A /* Menus.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Menus.png; sourceTree = ""; }; 39 | 931399632557CBB60090061A /* DynamicMenu3.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = DynamicMenu3.gif; sourceTree = ""; }; 40 | 933EF27525460FE600D1D09B /* DynamicMenu.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicMenu.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 933EF27825460FE600D1D09B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 42 | 933EF27A25460FE600D1D09B /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 43 | 933EF27C25460FE600D1D09B /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 44 | 933EF27F25460FE600D1D09B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 45 | 933EF28125460FE800D1D09B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 46 | 933EF28425460FE800D1D09B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 47 | 933EF28625460FE800D1D09B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 48 | 933EF2912546739000D1D09B /* Shape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shape.swift; sourceTree = ""; }; 49 | 933EF2BC2547B6D700D1D09B /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; 50 | 933EF2CA2548F89C00D1D09B /* Animator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Animator.swift; sourceTree = ""; }; 51 | 933EF2CD254912C900D1D09B /* DynamicMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicMenu.swift; sourceTree = ""; }; 52 | 933EF2D12549256700D1D09B /* Enums.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Enums.swift; sourceTree = ""; }; 53 | 933EF2D72549479500D1D09B /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 54 | 933EF2E1254951CE00D1D09B /* DynamicMenu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = DynamicMenu.png; sourceTree = ""; }; 55 | 935D2EF9254A157600E2DA5A /* DynamicMenu.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = DynamicMenu.gif; sourceTree = ""; }; 56 | 935D2EFC254A537500E2DA5A /* OneViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OneViewController.swift; sourceTree = ""; }; 57 | 935D2EFF254A539800E2DA5A /* TwoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoViewController.swift; sourceTree = ""; }; 58 | 935D2F06254A53E300E2DA5A /* ThreeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeViewController.swift; sourceTree = ""; }; 59 | 935D2F09254A541B00E2DA5A /* FourViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FourViewController.swift; sourceTree = ""; }; 60 | 935D2F0C254A545300E2DA5A /* FiveViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FiveViewController.swift; sourceTree = ""; }; 61 | 93643B3A2569EC7B00027DE6 /* DynamicMenu4.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = DynamicMenu4.gif; sourceTree = ""; }; 62 | 93CD6FA1255649CD004B2442 /* DynamicMenu2.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = DynamicMenu2.gif; sourceTree = ""; }; 63 | 93CD6FC1255765B0004B2442 /* Cats.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Cats.xcassets; sourceTree = ""; }; 64 | 93CD6FC525578DDF004B2442 /* Balls.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Balls.xcassets; sourceTree = ""; }; 65 | /* End PBXFileReference section */ 66 | 67 | /* Begin PBXFrameworksBuildPhase section */ 68 | 933EF27225460FE600D1D09B /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | /* End PBXFrameworksBuildPhase section */ 76 | 77 | /* Begin PBXGroup section */ 78 | 933EF26C25460FE600D1D09B = { 79 | isa = PBXGroup; 80 | children = ( 81 | 933EF2DF2549513B00D1D09B /* GitHub-Images */, 82 | 933EF2D72549479500D1D09B /* LICENSE */, 83 | 933EF27725460FE600D1D09B /* DynamicMenu */, 84 | 933EF27625460FE600D1D09B /* Products */, 85 | ); 86 | sourceTree = ""; 87 | }; 88 | 933EF27625460FE600D1D09B /* Products */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | 933EF27525460FE600D1D09B /* DynamicMenu.app */, 92 | ); 93 | name = Products; 94 | sourceTree = ""; 95 | }; 96 | 933EF27725460FE600D1D09B /* DynamicMenu */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 933EF2B92547B6A400D1D09B /* Constants */, 100 | 933EF2B32547A4D200D1D09B /* Root */, 101 | 933EF2B72547A5CA00D1D09B /* ViewControllers */, 102 | 933EF2B22547A4C600D1D09B /* Controllers */, 103 | 933EF2B52547A55900D1D09B /* Assets */, 104 | 933EF2B42547A4DE00D1D09B /* Storyboards */, 105 | ); 106 | path = DynamicMenu; 107 | sourceTree = ""; 108 | }; 109 | 933EF2B22547A4C600D1D09B /* Controllers */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | 933EF2912546739000D1D09B /* Shape.swift */, 113 | 933EF2CA2548F89C00D1D09B /* Animator.swift */, 114 | 933EF2CD254912C900D1D09B /* DynamicMenu.swift */, 115 | ); 116 | path = Controllers; 117 | sourceTree = ""; 118 | }; 119 | 933EF2B32547A4D200D1D09B /* Root */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | 933EF28625460FE800D1D09B /* Info.plist */, 123 | 933EF27825460FE600D1D09B /* AppDelegate.swift */, 124 | 933EF27A25460FE600D1D09B /* SceneDelegate.swift */, 125 | ); 126 | path = Root; 127 | sourceTree = ""; 128 | }; 129 | 933EF2B42547A4DE00D1D09B /* Storyboards */ = { 130 | isa = PBXGroup; 131 | children = ( 132 | 933EF28325460FE800D1D09B /* LaunchScreen.storyboard */, 133 | 933EF27E25460FE600D1D09B /* Main.storyboard */, 134 | ); 135 | path = Storyboards; 136 | sourceTree = ""; 137 | }; 138 | 933EF2B52547A55900D1D09B /* Assets */ = { 139 | isa = PBXGroup; 140 | children = ( 141 | 933EF28125460FE800D1D09B /* Assets.xcassets */, 142 | 93CD6FC1255765B0004B2442 /* Cats.xcassets */, 143 | 93CD6FC525578DDF004B2442 /* Balls.xcassets */, 144 | ); 145 | path = Assets; 146 | sourceTree = ""; 147 | }; 148 | 933EF2B72547A5CA00D1D09B /* ViewControllers */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 933EF2D12549256700D1D09B /* Enums.swift */, 152 | 933EF27C25460FE600D1D09B /* ViewController.swift */, 153 | 935D2EFC254A537500E2DA5A /* OneViewController.swift */, 154 | 935D2EFF254A539800E2DA5A /* TwoViewController.swift */, 155 | 935D2F06254A53E300E2DA5A /* ThreeViewController.swift */, 156 | 935D2F09254A541B00E2DA5A /* FourViewController.swift */, 157 | 935D2F0C254A545300E2DA5A /* FiveViewController.swift */, 158 | ); 159 | path = ViewControllers; 160 | sourceTree = ""; 161 | }; 162 | 933EF2B92547B6A400D1D09B /* Constants */ = { 163 | isa = PBXGroup; 164 | children = ( 165 | 933EF2BC2547B6D700D1D09B /* Constants.swift */, 166 | ); 167 | path = Constants; 168 | sourceTree = ""; 169 | }; 170 | 933EF2DF2549513B00D1D09B /* GitHub-Images */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | 935D2EF9254A157600E2DA5A /* DynamicMenu.gif */, 174 | 93CD6FA1255649CD004B2442 /* DynamicMenu2.gif */, 175 | 931399632557CBB60090061A /* DynamicMenu3.gif */, 176 | 93643B3A2569EC7B00027DE6 /* DynamicMenu4.gif */, 177 | 933EF2E1254951CE00D1D09B /* DynamicMenu.png */, 178 | 931399602557C3E50090061A /* Menus.png */, 179 | ); 180 | path = "GitHub-Images"; 181 | sourceTree = ""; 182 | }; 183 | /* End PBXGroup section */ 184 | 185 | /* Begin PBXNativeTarget section */ 186 | 933EF27425460FE600D1D09B /* DynamicMenu */ = { 187 | isa = PBXNativeTarget; 188 | buildConfigurationList = 933EF28925460FE800D1D09B /* Build configuration list for PBXNativeTarget "DynamicMenu" */; 189 | buildPhases = ( 190 | 933EF27125460FE600D1D09B /* Sources */, 191 | 933EF27225460FE600D1D09B /* Frameworks */, 192 | 933EF27325460FE600D1D09B /* Resources */, 193 | ); 194 | buildRules = ( 195 | ); 196 | dependencies = ( 197 | ); 198 | name = DynamicMenu; 199 | productName = DynamicMenu; 200 | productReference = 933EF27525460FE600D1D09B /* DynamicMenu.app */; 201 | productType = "com.apple.product-type.application"; 202 | }; 203 | /* End PBXNativeTarget section */ 204 | 205 | /* Begin PBXProject section */ 206 | 933EF26D25460FE600D1D09B /* Project object */ = { 207 | isa = PBXProject; 208 | attributes = { 209 | LastSwiftUpdateCheck = 1210; 210 | LastUpgradeCheck = 1210; 211 | TargetAttributes = { 212 | 933EF27425460FE600D1D09B = { 213 | CreatedOnToolsVersion = 12.1; 214 | }; 215 | }; 216 | }; 217 | buildConfigurationList = 933EF27025460FE600D1D09B /* Build configuration list for PBXProject "DynamicMenu" */; 218 | compatibilityVersion = "Xcode 9.3"; 219 | developmentRegion = en; 220 | hasScannedForEncodings = 0; 221 | knownRegions = ( 222 | en, 223 | Base, 224 | ); 225 | mainGroup = 933EF26C25460FE600D1D09B; 226 | productRefGroup = 933EF27625460FE600D1D09B /* Products */; 227 | projectDirPath = ""; 228 | projectRoot = ""; 229 | targets = ( 230 | 933EF27425460FE600D1D09B /* DynamicMenu */, 231 | ); 232 | }; 233 | /* End PBXProject section */ 234 | 235 | /* Begin PBXResourcesBuildPhase section */ 236 | 933EF27325460FE600D1D09B /* Resources */ = { 237 | isa = PBXResourcesBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | 93CD6FA2255649CD004B2442 /* DynamicMenu2.gif in Resources */, 241 | 933EF28525460FE800D1D09B /* LaunchScreen.storyboard in Resources */, 242 | 935D2EFA254A157600E2DA5A /* DynamicMenu.gif in Resources */, 243 | 933EF28225460FE800D1D09B /* Assets.xcassets in Resources */, 244 | 93CD6FC2255765B0004B2442 /* Cats.xcassets in Resources */, 245 | 933EF2E2254951CE00D1D09B /* DynamicMenu.png in Resources */, 246 | 931399612557C3E50090061A /* Menus.png in Resources */, 247 | 933EF28025460FE600D1D09B /* Main.storyboard in Resources */, 248 | 931399642557CBB60090061A /* DynamicMenu3.gif in Resources */, 249 | 93CD6FC625578DDF004B2442 /* Balls.xcassets in Resources */, 250 | 93643B3B2569EC7B00027DE6 /* DynamicMenu4.gif in Resources */, 251 | 933EF2DA2549479500D1D09B /* LICENSE in Resources */, 252 | ); 253 | runOnlyForDeploymentPostprocessing = 0; 254 | }; 255 | /* End PBXResourcesBuildPhase section */ 256 | 257 | /* Begin PBXSourcesBuildPhase section */ 258 | 933EF27125460FE600D1D09B /* Sources */ = { 259 | isa = PBXSourcesBuildPhase; 260 | buildActionMask = 2147483647; 261 | files = ( 262 | 933EF27D25460FE600D1D09B /* ViewController.swift in Sources */, 263 | 935D2F0D254A545300E2DA5A /* FiveViewController.swift in Sources */, 264 | 933EF27925460FE600D1D09B /* AppDelegate.swift in Sources */, 265 | 933EF27B25460FE600D1D09B /* SceneDelegate.swift in Sources */, 266 | 933EF2BD2547B6D700D1D09B /* Constants.swift in Sources */, 267 | 933EF2922546739000D1D09B /* Shape.swift in Sources */, 268 | 933EF2CB2548F89C00D1D09B /* Animator.swift in Sources */, 269 | 935D2F07254A53E300E2DA5A /* ThreeViewController.swift in Sources */, 270 | 933EF2CE254912C900D1D09B /* DynamicMenu.swift in Sources */, 271 | 935D2EFD254A537500E2DA5A /* OneViewController.swift in Sources */, 272 | 935D2F00254A539800E2DA5A /* TwoViewController.swift in Sources */, 273 | 933EF2D22549256700D1D09B /* Enums.swift in Sources */, 274 | 935D2F0A254A541B00E2DA5A /* FourViewController.swift in Sources */, 275 | ); 276 | runOnlyForDeploymentPostprocessing = 0; 277 | }; 278 | /* End PBXSourcesBuildPhase section */ 279 | 280 | /* Begin PBXVariantGroup section */ 281 | 933EF27E25460FE600D1D09B /* Main.storyboard */ = { 282 | isa = PBXVariantGroup; 283 | children = ( 284 | 933EF27F25460FE600D1D09B /* Base */, 285 | ); 286 | name = Main.storyboard; 287 | sourceTree = ""; 288 | }; 289 | 933EF28325460FE800D1D09B /* LaunchScreen.storyboard */ = { 290 | isa = PBXVariantGroup; 291 | children = ( 292 | 933EF28425460FE800D1D09B /* Base */, 293 | ); 294 | name = LaunchScreen.storyboard; 295 | sourceTree = ""; 296 | }; 297 | /* End PBXVariantGroup section */ 298 | 299 | /* Begin XCBuildConfiguration section */ 300 | 933EF28725460FE800D1D09B /* Debug */ = { 301 | isa = XCBuildConfiguration; 302 | buildSettings = { 303 | ALWAYS_SEARCH_USER_PATHS = NO; 304 | CLANG_ANALYZER_NONNULL = YES; 305 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 306 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 307 | CLANG_CXX_LIBRARY = "libc++"; 308 | CLANG_ENABLE_MODULES = YES; 309 | CLANG_ENABLE_OBJC_ARC = YES; 310 | CLANG_ENABLE_OBJC_WEAK = YES; 311 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 312 | CLANG_WARN_BOOL_CONVERSION = YES; 313 | CLANG_WARN_COMMA = YES; 314 | CLANG_WARN_CONSTANT_CONVERSION = YES; 315 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 317 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 318 | CLANG_WARN_EMPTY_BODY = YES; 319 | CLANG_WARN_ENUM_CONVERSION = YES; 320 | CLANG_WARN_INFINITE_RECURSION = YES; 321 | CLANG_WARN_INT_CONVERSION = YES; 322 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 323 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 324 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 325 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 326 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 327 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 328 | CLANG_WARN_STRICT_PROTOTYPES = YES; 329 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 330 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 331 | CLANG_WARN_UNREACHABLE_CODE = YES; 332 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 333 | COPY_PHASE_STRIP = NO; 334 | DEBUG_INFORMATION_FORMAT = dwarf; 335 | ENABLE_STRICT_OBJC_MSGSEND = YES; 336 | ENABLE_TESTABILITY = YES; 337 | GCC_C_LANGUAGE_STANDARD = gnu11; 338 | GCC_DYNAMIC_NO_PIC = NO; 339 | GCC_NO_COMMON_BLOCKS = YES; 340 | GCC_OPTIMIZATION_LEVEL = 0; 341 | GCC_PREPROCESSOR_DEFINITIONS = ( 342 | "DEBUG=1", 343 | "$(inherited)", 344 | ); 345 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 346 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 347 | GCC_WARN_UNDECLARED_SELECTOR = YES; 348 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 349 | GCC_WARN_UNUSED_FUNCTION = YES; 350 | GCC_WARN_UNUSED_VARIABLE = YES; 351 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 352 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 353 | MTL_FAST_MATH = YES; 354 | ONLY_ACTIVE_ARCH = YES; 355 | SDKROOT = iphoneos; 356 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 357 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 358 | }; 359 | name = Debug; 360 | }; 361 | 933EF28825460FE800D1D09B /* Release */ = { 362 | isa = XCBuildConfiguration; 363 | buildSettings = { 364 | ALWAYS_SEARCH_USER_PATHS = NO; 365 | CLANG_ANALYZER_NONNULL = YES; 366 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 367 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 368 | CLANG_CXX_LIBRARY = "libc++"; 369 | CLANG_ENABLE_MODULES = YES; 370 | CLANG_ENABLE_OBJC_ARC = YES; 371 | CLANG_ENABLE_OBJC_WEAK = YES; 372 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 373 | CLANG_WARN_BOOL_CONVERSION = YES; 374 | CLANG_WARN_COMMA = YES; 375 | CLANG_WARN_CONSTANT_CONVERSION = YES; 376 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 377 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 378 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 379 | CLANG_WARN_EMPTY_BODY = YES; 380 | CLANG_WARN_ENUM_CONVERSION = YES; 381 | CLANG_WARN_INFINITE_RECURSION = YES; 382 | CLANG_WARN_INT_CONVERSION = YES; 383 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 384 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 385 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 386 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 387 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 388 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 389 | CLANG_WARN_STRICT_PROTOTYPES = YES; 390 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 391 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 392 | CLANG_WARN_UNREACHABLE_CODE = YES; 393 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 394 | COPY_PHASE_STRIP = NO; 395 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 396 | ENABLE_NS_ASSERTIONS = NO; 397 | ENABLE_STRICT_OBJC_MSGSEND = YES; 398 | GCC_C_LANGUAGE_STANDARD = gnu11; 399 | GCC_NO_COMMON_BLOCKS = YES; 400 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 401 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 402 | GCC_WARN_UNDECLARED_SELECTOR = YES; 403 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 404 | GCC_WARN_UNUSED_FUNCTION = YES; 405 | GCC_WARN_UNUSED_VARIABLE = YES; 406 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 407 | MTL_ENABLE_DEBUG_INFO = NO; 408 | MTL_FAST_MATH = YES; 409 | SDKROOT = iphoneos; 410 | SWIFT_COMPILATION_MODE = wholemodule; 411 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 412 | VALIDATE_PRODUCT = YES; 413 | }; 414 | name = Release; 415 | }; 416 | 933EF28A25460FE800D1D09B /* Debug */ = { 417 | isa = XCBuildConfiguration; 418 | buildSettings = { 419 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 420 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 421 | CODE_SIGN_IDENTITY = "Apple Development"; 422 | CODE_SIGN_STYLE = Automatic; 423 | DEVELOPMENT_TEAM = ""; 424 | INFOPLIST_FILE = DynamicMenu/Root/Info.plist; 425 | LD_RUNPATH_SEARCH_PATHS = ( 426 | "$(inherited)", 427 | "@executable_path/Frameworks", 428 | ); 429 | PRODUCT_BUNDLE_IDENTIFIER = dev.mv.DynamicMenu; 430 | PRODUCT_NAME = "$(TARGET_NAME)"; 431 | PROVISIONING_PROFILE_SPECIFIER = ""; 432 | SWIFT_VERSION = 5.0; 433 | TARGETED_DEVICE_FAMILY = "1,2"; 434 | }; 435 | name = Debug; 436 | }; 437 | 933EF28B25460FE800D1D09B /* Release */ = { 438 | isa = XCBuildConfiguration; 439 | buildSettings = { 440 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 441 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 442 | CODE_SIGN_IDENTITY = "Apple Development"; 443 | CODE_SIGN_STYLE = Automatic; 444 | DEVELOPMENT_TEAM = ""; 445 | INFOPLIST_FILE = DynamicMenu/Root/Info.plist; 446 | LD_RUNPATH_SEARCH_PATHS = ( 447 | "$(inherited)", 448 | "@executable_path/Frameworks", 449 | ); 450 | PRODUCT_BUNDLE_IDENTIFIER = dev.mv.DynamicMenu; 451 | PRODUCT_NAME = "$(TARGET_NAME)"; 452 | PROVISIONING_PROFILE_SPECIFIER = ""; 453 | SWIFT_VERSION = 5.0; 454 | TARGETED_DEVICE_FAMILY = "1,2"; 455 | }; 456 | name = Release; 457 | }; 458 | /* End XCBuildConfiguration section */ 459 | 460 | /* Begin XCConfigurationList section */ 461 | 933EF27025460FE600D1D09B /* Build configuration list for PBXProject "DynamicMenu" */ = { 462 | isa = XCConfigurationList; 463 | buildConfigurations = ( 464 | 933EF28725460FE800D1D09B /* Debug */, 465 | 933EF28825460FE800D1D09B /* Release */, 466 | ); 467 | defaultConfigurationIsVisible = 0; 468 | defaultConfigurationName = Release; 469 | }; 470 | 933EF28925460FE800D1D09B /* Build configuration list for PBXNativeTarget "DynamicMenu" */ = { 471 | isa = XCConfigurationList; 472 | buildConfigurations = ( 473 | 933EF28A25460FE800D1D09B /* Debug */, 474 | 933EF28B25460FE800D1D09B /* Release */, 475 | ); 476 | defaultConfigurationIsVisible = 0; 477 | defaultConfigurationName = Release; 478 | }; 479 | /* End XCConfigurationList section */ 480 | }; 481 | rootObject = 933EF26D25460FE600D1D09B /* Project object */; 482 | } 483 | -------------------------------------------------------------------------------- /DynamicMenu.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /DynamicMenu.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /DynamicMenu.xcodeproj/project.xcworkspace/xcuserdata/marcyvernon.xcuserdatad/IDEFindNavigatorScopes.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /DynamicMenu.xcodeproj/xcuserdata/marcyvernon.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | DynamicMenu.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "iphone_20x20@2x.png", 5 | "idiom" : "iphone", 6 | "scale" : "2x", 7 | "size" : "20x20" 8 | }, 9 | { 10 | "filename" : "iphone_20x20@3x.png", 11 | "idiom" : "iphone", 12 | "scale" : "3x", 13 | "size" : "20x20" 14 | }, 15 | { 16 | "filename" : "iphone_29x29@2x.png", 17 | "idiom" : "iphone", 18 | "scale" : "2x", 19 | "size" : "29x29" 20 | }, 21 | { 22 | "filename" : "iphone_29x29@3x.png", 23 | "idiom" : "iphone", 24 | "scale" : "3x", 25 | "size" : "29x29" 26 | }, 27 | { 28 | "filename" : "iphone_40x40@2x.png", 29 | "idiom" : "iphone", 30 | "scale" : "2x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "filename" : "iphone_40x40@3x.png", 35 | "idiom" : "iphone", 36 | "scale" : "3x", 37 | "size" : "40x40" 38 | }, 39 | { 40 | "filename" : "iphone_60x60@2x.png", 41 | "idiom" : "iphone", 42 | "scale" : "2x", 43 | "size" : "60x60" 44 | }, 45 | { 46 | "filename" : "iphone_60x60@3x.png", 47 | "idiom" : "iphone", 48 | "scale" : "3x", 49 | "size" : "60x60" 50 | }, 51 | { 52 | "filename" : "ipad_20x20.png", 53 | "idiom" : "ipad", 54 | "scale" : "1x", 55 | "size" : "20x20" 56 | }, 57 | { 58 | "filename" : "ipad_20x20@2x.png", 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "20x20" 62 | }, 63 | { 64 | "filename" : "ipad_29x29.png", 65 | "idiom" : "ipad", 66 | "scale" : "1x", 67 | "size" : "29x29" 68 | }, 69 | { 70 | "filename" : "ipad_29x29@2x.png", 71 | "idiom" : "ipad", 72 | "scale" : "2x", 73 | "size" : "29x29" 74 | }, 75 | { 76 | "filename" : "ipad_40x40.png", 77 | "idiom" : "ipad", 78 | "scale" : "1x", 79 | "size" : "40x40" 80 | }, 81 | { 82 | "filename" : "ipad_40x40@2x.png", 83 | "idiom" : "ipad", 84 | "scale" : "2x", 85 | "size" : "40x40" 86 | }, 87 | { 88 | "filename" : "ipad_76x76.png", 89 | "idiom" : "ipad", 90 | "scale" : "1x", 91 | "size" : "76x76" 92 | }, 93 | { 94 | "filename" : "ipad_76x76@2x.png", 95 | "idiom" : "ipad", 96 | "scale" : "2x", 97 | "size" : "76x76" 98 | }, 99 | { 100 | "filename" : "ipad_83x83@2x.png", 101 | "idiom" : "ipad", 102 | "scale" : "2x", 103 | "size" : "83.5x83.5" 104 | }, 105 | { 106 | "filename" : "iphone_1024x1024.png", 107 | "idiom" : "ios-marketing", 108 | "scale" : "1x", 109 | "size" : "1024x1024" 110 | } 111 | ], 112 | "info" : { 113 | "author" : "xcode", 114 | "version" : 1 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_20x20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_20x20.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_20x20@2x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_29x29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_29x29.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_29x29@2x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_40x40.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_40x40@2x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_76x76.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_76x76@2x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_83x83@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/ipad_83x83@2x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_1024x1024.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_20x20@2x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_20x20@3x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_29x29@2x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_29x29@3x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_40x40@2x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_40x40@3x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_60x60@2x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Assets.xcassets/AppIcon.appiconset/iphone_60x60@3x.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball1.imageset/Ball1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Balls.xcassets/Ball1.imageset/Ball1.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Ball1.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball10.imageset/Ball10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Balls.xcassets/Ball10.imageset/Ball10.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Ball10.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball2.imageset/Ball2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Balls.xcassets/Ball2.imageset/Ball2.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Ball2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball3.imageset/Ball3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Balls.xcassets/Ball3.imageset/Ball3.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Ball3.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball4.imageset/Ball4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Balls.xcassets/Ball4.imageset/Ball4.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Ball4.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball5.imageset/Ball5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Balls.xcassets/Ball5.imageset/Ball5.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Ball5.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball6.imageset/Ball6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Balls.xcassets/Ball6.imageset/Ball6.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Ball6.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball7.imageset/Ball7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Balls.xcassets/Ball7.imageset/Ball7.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Ball7.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball8.imageset/Ball8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Balls.xcassets/Ball8.imageset/Ball8.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Ball8.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball9.imageset/Ball9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Balls.xcassets/Ball9.imageset/Ball9.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Ball9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Ball9.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Balls.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Cat1.imageset/Cat1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Cats.xcassets/Cat1.imageset/Cat1.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Cat1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Cat1.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Cat2.imageset/Cat2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Cats.xcassets/Cat2.imageset/Cat2.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Cat2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Cat2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Cat3.imageset/Cat3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Cats.xcassets/Cat3.imageset/Cat3.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Cat3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Cat3.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Cat4.imageset/Cat4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Cats.xcassets/Cat4.imageset/Cat4.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Cat4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Cat4.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Cat5.imageset/Cat5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Cats.xcassets/Cat5.imageset/Cat5.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Cat5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Cat5.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Cat6.imageset/Cat6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Cats.xcassets/Cat6.imageset/Cat6.png -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Cat6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Cat6.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/blank.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "blank.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DynamicMenu/Assets/Cats.xcassets/blank.imageset/blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/DynamicMenu/Assets/Cats.xcassets/blank.imageset/blank.png -------------------------------------------------------------------------------- /DynamicMenu/Constants/Constants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Constants.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/26/20. 6 | // 7 | 8 | import UIKit 9 | 10 | //MARK: - Pick Desired Menu Style 11 | // SET menuType FOR MENU DESIGN 12 | let menuType = 6 // Corresponds to index number of menuArray 13 | 14 | struct Data { 15 | //MARK: - Set for Menu 16 | let bgColor: UIColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) 17 | let isShadowOn = false 18 | let shadow: CGFloat = 1.0 19 | 20 | //MARK: - Menu Choices 21 | let menuArray: [[(title: String, segue: String?, shape: ShapeType, imageName: String?, font: Font, fontSize: CGFloat, titleColor: UIColor, shapeColor: UIColor, frameX: Int, frameY: Int, frameWidth: Int, frameHeight: Int, borderColor: UIColor, borderWidth: CGFloat)]] = [ 22 | [ 23 | ("Supplies", K.one, .circle, nil, .regular, 40, .label, .systemBackground, 10, 0, 220, 60, .label, 1.0), 24 | ("Treats", K.two, .circle, nil, .bold, 40, .label, .systemBackground, 0, 0, 140, 140, .label, 1.0), 25 | ("Food", K.three, .circle, nil, .plain, 60, .label, .systemBackground, 100, 100, 150, 150, .label, 1.0), 26 | ("Toys", K.four, .circle, nil, .bold, 45, .label, .systemBackground, 0, 400, 110, 110, .label, 1.0), 27 | ("Carriers", K.four, .circle, nil, .regular, 40, .label, .systemBackground, 0, 400, 200, 90, .label, 1.0), 28 | ("Litter", K.four, .circle, nil, .regular, 50, .label, .systemBackground, 0, 400, 220, 80, .label, 1.0), 29 | ("Beds/Towers", K.four, .circle, nil, .plain, 25, .label, .systemBackground, 0, 400, 200, 60, .label, 1.0), 30 | ("Flea and Tick", K.four, .circle, nil, .regular, 25, .label, .systemBackground, 50, 50, 200, 60, .label, 1.0), 31 | ("Cat Songs", K.one, .image, "Cat1", .plain, 12, .label, #colorLiteral(red: 0.6546350121, green: 0.4760367274, blue: 0.5770899057, alpha: 1), 0, 400, 106, 154, .label, 0.0), 32 | ("Cat Poems", K.one, .image, "Cat2", .plain, 12, .label, #colorLiteral(red: 0.9770404696, green: 0.4807606339, blue: 0.460550487, alpha: 1), 0, 160, 119, 131, .label, 0.0), 33 | ("Cat Drawings", K.one, .image, "Cat3", .plain, 12, .label, #colorLiteral(red: 0.5610517859, green: 0.546002686, blue: 0, alpha: 1), 200, 160, 119, 131, .label, 0.0), 34 | ("Cat Memes", K.one, .image, "Cat4", .plain, 12, .label, #colorLiteral(red: 0, green: 0.5649836659, blue: 0.5651857257, alpha: 1), 200, 0, 154, 142, .label, 0.0), 35 | ("Cats Photos", K.one, .image, "Cat5", .plain, 12, .label, #colorLiteral(red: 0.8920195699, green: 0.3525260091, blue: 0.6284474134, alpha: 1), 0, 0, 106, 154, .label, 0.0), 36 | ("Cat Videos", K.one, .image, "Cat6", .plain, 12, .label, #colorLiteral(red: 0.9548518062, green: 0.7142229676, blue: 0, alpha: 1), 200, 320, 154, 142, .label, 0.0), 37 | ], 38 | [ 39 | ("Play", K.one, .circle, nil, .regular, 80, .label, #colorLiteral(red: 0.9366931319, green: 0.5399537086, blue: 0.6667494178, alpha: 1), 100, 100, 250, 250, .label, 0.0), 40 | (" 🔈 ", nil, .circle, nil, .plain, 50, .label, #colorLiteral(red: 0.4745098039, green: 0.8392156863, blue: 0.9764705882, alpha: 1), 0, 0, 150, 150, .label, 0.0), 41 | ("Settings", K.three, .roundedSquare, nil, .regular, 35, .label, #colorLiteral(red : 0.721568644, green : 0.8862745166, blue : 0.5921568871, alpha : 1), 0, 200, 200, 80, .label, 0.0), 42 | ("Friends", K.four, .circle, nil, .bold, 60, .label, #colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1), 0, 400, 280, 180, .label, 0.0), 43 | ("Scores", K.five, .roundedSquare, nil, .regular, 40, .label, #colorLiteral(red: 0.956412375, green: 0.6578175426, blue: 0.5438622832, alpha: 1), 200, 0, 180, 100, .label, 0.0), 44 | ], 45 | [ 46 | ("Users", K.one, .circle, nil, .regular, 60, .label, .systemBackground, 100, 100, 200, 100, .label, 1.0), 47 | ("Tags", K.two, .circle, nil, .bold, 40, .label, .systemBackground, 0, 0, 130, 60, .label, 1.0), 48 | ("Jobs", K.three, .circle, nil, .bold, 40, .label, .systemBackground, 100, 0, 130, 60, .label, 1.0), 49 | ("Companies", K.four, .circle, nil, .bold, 25, .label, .systemBackground, 0, 400, 150, 60, .label, 1.0), 50 | ("Newest", K.five, .circle, nil, .regular, 40, .label, .systemBackground, 0, 200, 180, 80, .label, 1.0), 51 | ("Active", K.one, .circle, nil, .regular, 50, .label, .systemBackground, 100, 100, 180, 80, .label, 1.0), 52 | ("Bountied", K.two, .circle, nil, .bold, 25, .label, .systemBackground, 0, 0, 150, 80, .label, 1.0), 53 | ("Unanswered", K.three, .circle, nil, .regular, 25, .label, .systemBackground, 100, 0, 180, 60, .label, 1.0), 54 | ("More", K.four, .circle, nil, .bold, 50, .label, .systemBackground, 0, 400, 150, 80, .label, 1.0), 55 | ("Filter", K.five, .circle, nil, .regular, 40, .label, .systemBackground, 0, 200, 150, 80, .label, 1.0), 56 | ("Products", K.five, .circle, nil, .bold, 38, .label, .systemBackground, 0, 200, 180, 80, .label, 1.0), 57 | ("Teams", K.five, .circle, nil, .regular, 40, .label, .systemBackground, 0, 200, 150, 80, .label, 1.0), 58 | ("Free Trial", K.five, .circle, nil, .regular, 25, .label, .systemBackground, 0, 200, 180, 60, .label, 1.0), 59 | ("Home", K.five, .circle, nil, .regular, 40, .label, .systemBackground, 0, 200, 150, 80, .label, 1.0), 60 | ], 61 | [ 62 | ("Order Now", K.one, .square, nil, .regular, 30, .label, #colorLiteral(red: 0.8549019694, green: 0.250980407, blue: 0.4784313738, alpha: 1), 100, 100, 175, 80, .label, 0.0), 63 | ("Menu", K.two, .square, nil, .bold, 40, .label, #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1), 0, 0, 250, 250, .label, 0.0), 64 | ("Reservations", K.three, .square, nil, .regular, 25, .label, #colorLiteral(red: 0.7254902124, green: 0.4784313738, blue: 0.09803921729, alpha: 1), 100, 0, 200, 80, .label, 0.0), 65 | ("Locations", K.four, .square, nil, .bold, 20, .label, #colorLiteral(red: 0.9411764741, green: 0.4980392158, blue: 0.3529411852, alpha: 1), 0, 400, 110, 50, .label, 0.0), 66 | ("Gift Cards", K.five, .square, nil, .regular, 25, .label, #colorLiteral(red: 0.9568627477, green: 0.6588235497, blue: 0.5450980663, alpha: 1), 200, 0, 180, 60, .label, 0.0), 67 | ("More", K.five, .square, nil, .regular, 40, .label, #colorLiteral(red: 0.8549019694, green: 0.250980407, blue: 0.4784313738, alpha: 1), 200, 0, 140, 80, .label, 0.0), 68 | ("Specials", K.one, .square, nil, .regular, 30, .label, #colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1), 100, 100, 150, 50, .label, 0.0), 69 | ("Hours", K.two, .square, nil, .bold, 30, .label, #colorLiteral(red: 0.9411764741, green: 0.4980392158, blue: 0.3529411852, alpha: 1), 0, 0, 130, 60, .label, 0.0), 70 | ("Guests", K.three, .square, nil, .regular, 35, .label, #colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1), 100, 0, 200, 80, .label, 0.0), 71 | ("Delivery", K.four, .square, nil, .bold, 20, .label, #colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1), 0, 400, 120, 60, .label, 0.0), 72 | ("Additions", K.five, .square, nil, .regular, 25, .label, #colorLiteral(red: 0.9568627477, green: 0.6588235497, blue: 0.5450980663, alpha: 1), 200, 0, 150, 70, .label, 0.0), 73 | ], 74 | [ 75 | ("Holiday Deals", K.one, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1), 0, 0, 188, 40, .label, 1.0), 76 | ("Returns & Orders", K.two, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.1764705926, green: 0.4980392158, blue: 0.7568627596, alpha: 1), 0, 45, 188, 40, .label, 1.0), 77 | ("Account", K.three, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.8078431487, green: 0.02745098062, blue: 0.3333333433, alpha: 1), 0, 90, 188, 40, .label, 1.0), 78 | ("Customer Service", K.four, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1), 0, 135, 188, 40, .label, 1.0), 79 | ("Buy Again", K.five, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.1764705926, green: 0.4980392158, blue: 0.7568627596, alpha: 1), 0, 180, 188, 40, .label, 1.0), 80 | ("Gift Cards", K.two, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1), 0, 225, 188, 40, .label, 1.0), 81 | ("Prime Video", K.three, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1), 0, 270, 188, 40, .label, 1.0), 82 | ("Recently Viewed", K.four, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1), 0, 315, 188, 40, .label, 1.0), 83 | ("Purchases", K.five, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1), 0, 360, 188, 40, .label, 1.0), 84 | ("Recommended", K.one, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.8549019694, green: 0.250980407, blue: 0.4784313738, alpha: 1), 0, 405, 188, 40, .label, 1.0), 85 | ("Save on Tools", K.two, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.8078431487, green: 0.02745098062, blue: 0.3333333433, alpha: 1), 200, 0, 188, 40, .label, 1.0), 86 | ("Daily Deal", K.three, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1), 200, 45, 188, 40, .label, 1.0), 87 | ("New Deals", K.four, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.8549019694, green: 0.250980407, blue: 0.4784313738, alpha: 1), 200, 90, 188, 40, .label, 1.0), 88 | ("Digital Content", K.five, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1), 200, 135, 188, 40, .label, 1.0), 89 | ("Departments", K.five, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.4666666687, green: 0.7647058964, blue: 0.2666666806, alpha: 1), 200, 180, 188, 40, .label, 1.0), 90 | ("Features", K.one, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.8078431487, green: 0.02745098062, blue: 0.3333333433, alpha: 1), 200, 225, 188, 40, .label, 1.0), 91 | ("Help and Settings", K.two, .roundedSquare, nil, .regular, 20, .systemBackground, #colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1), 200, 270, 188, 40, .label, 1.0), 92 | ], 93 | [ 94 | ("Lemon", K.four, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1), 100, 100, 120, 120, .white, 2.0), 95 | ("Lemon", K.four, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1), 100, 100, 120, 120, .white, 2.0), 96 | ("Lime", K.three, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.3790850262, green: 0.679406655, blue: 0.2013752477, alpha: 1), 0, 0, 120, 120, .white, 2.0), 97 | ("Cherry", K.one, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.6784736889, green: 0.1388022762, blue: 0.0687624826, alpha: 1), 100, 0, 120, 120, .white, 2.0), 98 | ("Grape", K.two, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.3478851828, green: 0.3075663227, blue: 0.9589628831, alpha: 1), 0, 400, 120, 120, .white, 2.0), 99 | ("Berry", K.two, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.2136861014, green: 0.5766190101, blue: 0.7934070172, alpha: 1), 200, 0, 120, 120, .white, 2.0), 100 | ("Orange", K.one, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.9332630431, green: 0.4008268866, blue: 0.09215667306, alpha: 1), 100, 100, 120, 120, .white, 2.0), 101 | ("Cherry", K.one, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.6784736889, green: 0.1388022762, blue: 0.0687624826, alpha: 1), 100, 0, 120, 120, .white, 2.0), 102 | ("Grape", K.two, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.3478851828, green: 0.3075663227, blue: 0.9589628831, alpha: 1), 0, 400, 120, 120, .white, 2.0), 103 | ("Berry", K.two, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.2136861014, green: 0.5766190101, blue: 0.7934070172, alpha: 1), 200, 0, 120, 120, .white, 2.0), 104 | ("Orange", K.one, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.9332630431, green: 0.4008268866, blue: 0.09215667306, alpha: 1), 100, 100, 120, 120, .white, 2.0), 105 | ("Lemon", K.four, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1), 100, 100, 120, 120, .white, 2.0), 106 | ("Lime", K.three, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.3790850262, green: 0.679406655, blue: 0.2013752477, alpha: 1), 0, 0, 120, 120, .white, 2.0), 107 | ("Lime", K.three, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.3790850262, green: 0.679406655, blue: 0.2013752477, alpha: 1), 0, 0, 120, 120, .white, 2.0), 108 | ("Cherry", K.one, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.6784736889, green: 0.1388022762, blue: 0.0687624826, alpha: 1), 100, 0, 120, 120, .white, 2.0), 109 | ("Grape", K.two, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.3478851828, green: 0.3075663227, blue: 0.9589628831, alpha: 1), 0, 400, 120, 120, .white, 2.0), 110 | ("Berry", K.two, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.2136861014, green: 0.5766190101, blue: 0.7934070172, alpha: 1), 200, 0, 120, 120, .white, 2.0), 111 | ("Orange", K.one, .circle, nil, .funky, 25, #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.8401380565), #colorLiteral(red: 0.9332630431, green: 0.4008268866, blue: 0.09215667306, alpha: 1), 100, 100, 120, 120, .white, 2.0), 112 | ], 113 | [ 114 | ("Wifi", K.one, .image, "Ball1", .plain, 12, .label, #colorLiteral(red: 0.0009948144434, green: 0.7751826048, blue: 0.7728715539, alpha: 1), 0, 400, 100, 100, .label, 0.0), 115 | ("Photos", K.two, .image, "Ball2", .plain, 12, .label, #colorLiteral(red: 0.9451019168, green: 0.8836047053, blue: 0.5347298384, alpha: 1), 0, 160, 120, 120, .label, 0.0), 116 | ("Microphone", K.three, .image, "Ball3", .plain, 12, .label, #colorLiteral(red: 0.9505361915, green: 0.5736863017, blue: 0.1980937421, alpha: 1), 200, 160, 100, 100, .label, 0.0), 117 | ("Settings", K.four, .image, "Ball4", .plain, 12, .label, #colorLiteral(red: 0.7231143117, green: 0.8726579547, blue: 0.4351766109, alpha: 1), 200, 0, 80, 80, .label, 0.0), 118 | ("Charts", K.three, .image, "Ball5", .plain, 12, .label, #colorLiteral(red: 0.004767735954, green: 0.7750266194, blue: 0.7691761255, alpha: 1), 0, 0, 120, 120, .label, 0.0), 119 | ("Timers", K.four, .image, "Ball6", .plain, 12, .label, #colorLiteral(red: 0.9413021207, green: 0.8834956288, blue: 0.5348696113, alpha: 1), 200, 320, 100, 100, .label, 0.0), 120 | ("Documents", K.four, .image, "Ball7", .plain, 12, .label, #colorLiteral(red: 0.7007273436, green: 0.8521744609, blue: 0.4283357263, alpha: 1), 200, 320, 140, 140, .label, 0.0), 121 | ("Drawings", K.four, .image, "Ball8", .plain, 12, .label, #colorLiteral(red: 0.9473592639, green: 0.5629658103, blue: 0.1932924986, alpha: 1), 200, 320, 160, 160, .label, 0.0), 122 | ("Videos", K.four, .image, "Ball9", .plain, 12, .label, #colorLiteral(red: 0.7079086304, green: 0.8622669578, blue: 0.4274529219, alpha: 1), 200, 320, 140, 140, .label, 0.0), 123 | ("Trash", K.four, .image, "Ball10", .plain, 12, .label, #colorLiteral(red: 0.9541819692, green: 0.5739480853, blue: 0.2037713826, alpha: 1), 200, 320, 80, 80, .label, 0.0), 124 | ], 125 | ] 126 | } 127 | 128 | //MARK: - String Constants 129 | struct K { 130 | static var oops = "Oops" 131 | static var one = "One" 132 | static var two = "Two" 133 | static var three = "Three" 134 | static var four = "Four" 135 | static var five = "Five" 136 | } 137 | 138 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /DynamicMenu/Controllers/Animator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Animator.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/27/20. 6 | // 7 | 8 | import UIKit 9 | import AVFoundation 10 | 11 | class Animator: UIDynamicAnimator { 12 | 13 | var gravity : UIGravityBehavior! 14 | var isSoundOn : Bool = false 15 | 16 | func addBehaviors(items: [UIView]) { 17 | addGravity(items) 18 | addCollisionBehavior(items) 19 | addItemBehaviors(items) 20 | } 21 | 22 | private func addGravity(_ items: [UIView]) { 23 | gravity = UIGravityBehavior(items: items) 24 | gravity.magnitude = 1.0 25 | self.addBehavior(gravity) 26 | } 27 | 28 | private func addCollisionBehavior(_ items: [UIView]) { 29 | let collision = UICollisionBehavior(items: items) 30 | collision.collisionDelegate = self 31 | collision.translatesReferenceBoundsIntoBoundary = true 32 | self.addBehavior(collision) 33 | } 34 | 35 | private func addItemBehaviors(_ items: [UIView]) { 36 | let itemBehaviour = UIDynamicItemBehavior(items: items) 37 | itemBehaviour.elasticity = 0.7 38 | itemBehaviour.friction = 0.0 39 | itemBehaviour.density = 1.0 40 | itemBehaviour.allowsRotation = true 41 | itemBehaviour.resistance = 0.0 42 | self.addBehavior(itemBehaviour) 43 | } 44 | } // end of Animator 45 | 46 | 47 | extension Animator: UICollisionBehaviorDelegate { 48 | 49 | func collisionBehavior(_ behavior: UICollisionBehavior, 50 | beganContactFor item: UIDynamicItem, 51 | withBoundaryIdentifier identifier: NSCopying?, 52 | at p: CGPoint) { 53 | if isSoundOn { 54 | AudioServicesPlayAlertSound(SystemSoundID(1057)) 55 | } 56 | } 57 | } // end of UICollisionBehaviorDelegate 58 | -------------------------------------------------------------------------------- /DynamicMenu/Controllers/DynamicMenu.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DynamicMenu.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/27/20. 6 | // 7 | 8 | import UIKit 9 | import CoreMotion 10 | 11 | protocol DynamicMenuDelegate { 12 | func selectScreen(segue: String?, sender: Shape) 13 | } 14 | 15 | class DynamicMenu { 16 | 17 | var shapes : [UIView] = [] 18 | var animator : Animator! 19 | var motionManager : CMMotionManager! 20 | var timer : Timer! 21 | var isSoundOn : Bool = false 22 | var delegate : DynamicMenuDelegate? 23 | let data = Data() 24 | var menuType = 0 25 | 26 | //MARK: - Menu Creation 27 | func createMenu(displayView: UIView, menuType: Int) { 28 | self.menuType = menuType 29 | addMotionDetection() 30 | createShapes(displayView: displayView, menuType: menuType) 31 | createAnimator(displayView: displayView, backgroundColor: data.bgColor) 32 | animator.addBehaviors(items: shapes) 33 | createTimer(time: 0.1, shouldRepeat: true) 34 | } 35 | 36 | //MARK: - SET UP 37 | 38 | private func createAnimator(displayView: UIView, backgroundColor: UIColor ) { 39 | animator = Animator(referenceView: displayView) 40 | animator.referenceView?.backgroundColor = backgroundColor 41 | } 42 | 43 | private func addMotionDetection() { 44 | motionManager = CMMotionManager() 45 | motionManager.startAccelerometerUpdates() 46 | } 47 | 48 | private func createShapes(displayView: UIView, menuType: Int) { 49 | 50 | for (key, info) in data.menuArray[menuType].enumerated() { 51 | 52 | let shape = Shape(frame: CGRect(x: info.frameX, y: info.frameY, width: info.frameWidth, height: info.frameHeight)) 53 | .title(info.title, font: info.font.rawValue, fontSize: info.fontSize, titleColor: info.titleColor) 54 | .shape(info.shape, imageName: info.imageName) 55 | .shadow(data.shadow, isOn: data.isShadowOn) 56 | .color(info.shapeColor, shape: info.shape) 57 | .borderColor(info.borderColor, width: info.borderWidth) 58 | .segue(info.segue) 59 | .tag(key) 60 | 61 | shape.addTarget(self, action: #selector(selectButton(sender:)), for: .touchUpInside) 62 | shapes.append(shape) 63 | displayView.addSubview(shape) 64 | } 65 | } 66 | 67 | //MARK: - Button actions 68 | 69 | @objc func selectButton(sender: Shape) { 70 | let buttonType = data.menuArray[menuType][sender.tag].segue 71 | 72 | if buttonType == nil { 73 | isSoundOn = !isSoundOn 74 | animator.isSoundOn = isSoundOn 75 | let sound = isSoundOn ? " 🔊 " : " 🔈 " 76 | _ = sender.title( sound , font: Font.plain.rawValue, fontSize: 50, titleColor: UIColor.white) 77 | } else { 78 | disappear() 79 | delegate?.selectScreen(segue: buttonType, sender: sender) 80 | } 81 | } 82 | 83 | 84 | //MARK: - Timer methods to move shapes 85 | 86 | private func createTimer(time: Double, shouldRepeat: Bool) { 87 | timer = Timer.scheduledTimer(timeInterval: time, target: self, selector: #selector(update), userInfo: nil, repeats: shouldRepeat) 88 | } 89 | 90 | @objc func update() { 91 | if let accelerometerData = motionManager.accelerometerData { 92 | animator.gravity.gravityDirection = CGVector(dx: accelerometerData.acceleration.x , dy: accelerometerData.acceleration.y * -1) 93 | } 94 | } 95 | 96 | //MARK: - Animation pause/restart 97 | 98 | func reappear() { 99 | animator.addBehaviors(items: shapes) 100 | createTimer(time: 0.1, shouldRepeat: true) 101 | } 102 | 103 | func disappear() { 104 | animator.removeAllBehaviors() 105 | timer.invalidate() 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /DynamicMenu/Controllers/Shape.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Shape.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/25/20. 6 | // 7 | 8 | import UIKit 9 | 10 | class Shape: UIButton { 11 | 12 | var segue: String? 13 | 14 | override init(frame: CGRect) { 15 | super.init(frame: frame) 16 | } 17 | 18 | func shape(_ shape: ShapeType, imageName: String?) -> Self { 19 | 20 | if shape == .circle { 21 | layer.cornerRadius = frame.size.height / 2 22 | clipsToBounds = true 23 | } 24 | 25 | if shape == .roundedSquare { 26 | layer.cornerRadius = frame.size.height / 5 27 | clipsToBounds = true 28 | } 29 | 30 | if shape == .image { 31 | if let image = UIImage(named: imageName ?? "blank") { 32 | self.setImage(image, for: .normal) 33 | } 34 | clipsToBounds = true 35 | } 36 | 37 | isUserInteractionEnabled = true 38 | return self 39 | } 40 | 41 | func color(_ color: UIColor, shape: ShapeType = .square) -> Self { 42 | if shape != .image { 43 | backgroundColor = color 44 | } 45 | tintColor = color 46 | return self 47 | } 48 | 49 | func borderColor(_ color: UIColor, width: CGFloat) -> Self { 50 | layer.borderColor = color.cgColor 51 | layer.borderWidth = width 52 | return self 53 | } 54 | 55 | func shadow(_ shadow: CGFloat, isOn: Bool) -> Self { 56 | if isOn == true { 57 | layer.masksToBounds = false 58 | layer.shadowColor = UIColor.black.cgColor 59 | layer.shadowOffset = CGSize(width : shadow, height : shadow) 60 | layer.shadowOpacity = 1.0 61 | } 62 | return self 63 | } 64 | 65 | func title(_ title: String, font: String, fontSize: CGFloat, titleColor: UIColor) -> Self { 66 | 67 | titleLabel?.frame = CGRect(x : 0, 68 | y : self.frame.size.height / 2 - 10, 69 | width : self.frame.size.width, 70 | height: fontSize + 4) 71 | 72 | setTitle(title, for: .normal) 73 | setTitleColor(titleColor, for: .normal) 74 | titleLabel?.textAlignment = .center 75 | contentVerticalAlignment = .center 76 | titleLabel?.font = UIFont(name: font, size: fontSize) 77 | return self 78 | } 79 | 80 | func segue(_ segue: String?) -> Self { 81 | self.segue = segue 82 | return self 83 | } 84 | 85 | func tag(_ tag: Int) -> Self { 86 | self.tag = tag 87 | return self 88 | } 89 | 90 | required init?(coder: NSCoder) { 91 | fatalError("init(coder:) has not been implemented") 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /DynamicMenu/Root/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/25/20. 6 | // 7 | 8 | import UIKit 9 | 10 | @main 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { return true } 14 | 15 | // MARK: UISceneSession Lifecycle 16 | 17 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 18 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 19 | } 20 | 21 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {} 22 | } 23 | 24 | -------------------------------------------------------------------------------- /DynamicMenu/Root/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | UISceneConfigurations 28 | 29 | UIWindowSceneSessionRoleApplication 30 | 31 | 32 | UISceneConfigurationName 33 | Default Configuration 34 | UISceneDelegateClassName 35 | $(PRODUCT_MODULE_NAME).SceneDelegate 36 | UISceneStoryboardFile 37 | Main 38 | 39 | 40 | 41 | 42 | UIApplicationSupportsIndirectInputEvents 43 | 44 | UILaunchStoryboardName 45 | LaunchScreen 46 | UIMainStoryboardFile 47 | Main 48 | UIRequiredDeviceCapabilities 49 | 50 | armv7 51 | 52 | UISupportedInterfaceOrientations 53 | 54 | UIInterfaceOrientationPortrait 55 | 56 | UISupportedInterfaceOrientations~ipad 57 | 58 | UIInterfaceOrientationPortrait 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /DynamicMenu/Root/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/25/20. 6 | // 7 | 8 | import UIKit 9 | 10 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 11 | 12 | var window: UIWindow? 13 | 14 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 15 | guard let _ = (scene as? UIWindowScene) else { return } 16 | } 17 | 18 | func sceneDidDisconnect(_ scene: UIScene) {} 19 | func sceneDidBecomeActive(_ scene: UIScene) {} 20 | func sceneWillResignActive(_ scene: UIScene) {} 21 | func sceneWillEnterForeground(_ scene: UIScene) {} 22 | func sceneDidEnterBackground(_ scene: UIScene) {} 23 | } 24 | 25 | -------------------------------------------------------------------------------- /DynamicMenu/Storyboards/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /DynamicMenu/Storyboards/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | -------------------------------------------------------------------------------- /DynamicMenu/ViewControllers/Enums.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Enums.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/27/20. 6 | // 7 | 8 | import UIKit 9 | 10 | enum ShapeType { 11 | case circle 12 | case square 13 | case roundedSquare 14 | case image 15 | } 16 | 17 | enum Font: String { 18 | case regular = "AmericanTypewriter" 19 | case bold = "BanglaSangamMN-Bold" 20 | case funky = "Optima-ExtraBlack" 21 | case plain = "Helvetica" 22 | } 23 | 24 | 25 | -------------------------------------------------------------------------------- /DynamicMenu/ViewControllers/FiveViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FiveViewController.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/28/20. 6 | // 7 | 8 | import UIKit 9 | 10 | class FiveViewController: UIViewController {} 11 | -------------------------------------------------------------------------------- /DynamicMenu/ViewControllers/FourViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FourViewController.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/28/20. 6 | // 7 | 8 | import UIKit 9 | 10 | class FourViewController: UIViewController {} 11 | -------------------------------------------------------------------------------- /DynamicMenu/ViewControllers/OneViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OneViewController.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/28/20. 6 | // 7 | 8 | import UIKit 9 | 10 | class OneViewController: UIViewController {} 11 | -------------------------------------------------------------------------------- /DynamicMenu/ViewControllers/ThreeViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ThreeViewController.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/28/20. 6 | // 7 | 8 | import UIKit 9 | 10 | class ThreeViewController: UIViewController {} 11 | -------------------------------------------------------------------------------- /DynamicMenu/ViewControllers/TwoViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TwoViewController.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/28/20. 6 | // 7 | 8 | import UIKit 9 | 10 | class TwoViewController: UIViewController {} 11 | -------------------------------------------------------------------------------- /DynamicMenu/ViewControllers/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // DynamicMenu 4 | // 5 | // Created by Marcy Vernon on 10/25/20. 6 | // 7 | 8 | import UIKit 9 | import CoreMotion 10 | 11 | class ViewController: UIViewController { 12 | 13 | private var menu = DynamicMenu() 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | menu.createMenu(displayView: view, menuType: menuType) 18 | menu.delegate = self 19 | } 20 | 21 | //MARK: - Remove Root Navigation Header ; Pause/Restart Animation 22 | override func viewWillAppear(_ animated: Bool) { 23 | super.viewWillAppear(animated) 24 | self.navigationController?.setNavigationBarHidden(true, animated: animated) 25 | menu.reappear() 26 | } 27 | 28 | override func viewWillDisappear(_ animated: Bool) { 29 | super.viewWillDisappear(animated) 30 | self.navigationController?.setNavigationBarHidden(false, animated: animated) 31 | menu.disappear() 32 | } 33 | 34 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 35 | if let button = sender as? Shape { 36 | segue.destination.title = button.titleLabel?.text 37 | segue.destination.view.backgroundColor = button.tintColor 38 | } 39 | } 40 | } // end of ViewController 41 | 42 | 43 | extension ViewController: DynamicMenuDelegate { 44 | func selectScreen(segue: String?, sender: Shape) { 45 | if let segue = segue { 46 | performSegue(withIdentifier: segue, sender: sender) 47 | } 48 | } 49 | } 50 | 51 | -------------------------------------------------------------------------------- /GitHub-Images/DynamicMenu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/GitHub-Images/DynamicMenu.gif -------------------------------------------------------------------------------- /GitHub-Images/DynamicMenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/GitHub-Images/DynamicMenu.png -------------------------------------------------------------------------------- /GitHub-Images/DynamicMenu2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/GitHub-Images/DynamicMenu2.gif -------------------------------------------------------------------------------- /GitHub-Images/DynamicMenu3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/GitHub-Images/DynamicMenu3.gif -------------------------------------------------------------------------------- /GitHub-Images/DynamicMenu4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/GitHub-Images/DynamicMenu4.gif -------------------------------------------------------------------------------- /GitHub-Images/Menus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PepperoniJoe/DynamicMenu/a05c0ef5bba7ca3f734c559351c47906b5c2c461/GitHub-Images/Menus.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018-2020 Marcy Vernon 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dynamic Menu 2 | [![Xcode version](https://img.shields.io/badge/xcode-12%20-brightgreen)](https://developer.apple.com/xcode/) 3 | [![Language](https://img.shields.io/badge/swift-5.0-orange.svg)](https://developer.apple.com/swift) 4 | [![Language](https://img.shields.io/badge/swift-iOS14-orange.svg)](https://developer.apple.com/xcode/swift) 5 | [![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](http://mit-license.org) 6 | 7 | An example iOS14 app to demo a UIKit Dynamic use of physics for a moving menu. 8 | The menu freely moves as device is moved. 9 | 10 | 11 | 12 | Menus can be varied by shape, image, color, border, font, size, background color and shadows. 13 | 14 | 15 | 16 | Menus are generated from data contained in an array. Each menu item segues to a corresponding view controller of the same name and color. 17 | 18 | 19 | 20 | Tap on a shape to access the corresponding view controller. 21 | 22 | 23 | 24 | **Technical Info:** \ 25 | Xcode 12 project written in Swift 5 for iOS 14\ 26 | Swift, UIKit Dynamics, Target Action, Storyboard. custom method chaining, AVFoundation 27 | 28 | **See Also:** \ 29 | [Quickies - a variety of example iOS apps](https://github.com/PepperoniJoe/Quickies)\ 30 | [Make Icons Swiftly - used to generate app icon sets 31 | ](https://github.com/PepperoniJoe/Make-Icons-Swiftly) 32 | 33 | **Author:** \ 34 | Marcy Vernon [@MarcyVernon](https://twitter.com/MarcyVernon) 35 | 36 | **License:** \ 37 | "DynamicMenu" is under the MIT license. See [LICENSE](/LICENSE) for more information. 38 | 39 | 40 | --------------------------------------------------------------------------------