├── Apple TV 1st Gen.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── dank9.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── dank9.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── Apple TV 1st Gen ├── AppDelegate.swift ├── Apple_TV_1st_Gen.xcdatamodeld │ ├── .xccurrentversion │ └── Apple_TV_1st_Gen.xcdatamodel │ │ └── contents ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── BlurredMoviesIcon.imageset │ │ ├── BlurredMoviesIcon.png │ │ └── Contents.json │ ├── BlurredMusicIcon.imageset │ │ ├── BlurredMusicIcon.png │ │ └── Contents.json │ ├── BlurredPhotosIcon.imageset │ │ ├── BlurredPhotosIcon.png │ │ └── Contents.json │ ├── BlurredPodcastIcon.imageset │ │ ├── BlurredPodcastIcon.png │ │ └── Contents.json │ ├── BlurredSettingsIcon.imageset │ │ ├── BlurredSettingsIcon.png │ │ └── Contents.json │ ├── BlurredSourcesIcon.imageset │ │ ├── BlurredSourcesIcon.png │ │ └── Contents.json │ ├── BlurredTVIcon.imageset │ │ ├── BlurredTVIcon.png │ │ └── Contents.json │ ├── Contents.json │ ├── MoviesIcon.imageset │ │ ├── Contents.json │ │ └── MoviesIcon.png │ ├── MusicIcon.imageset │ │ ├── Contents.json │ │ └── MusicIcon.png │ ├── PhotosIcon.imageset │ │ ├── Contents.json │ │ └── PhotosIcon.png │ ├── PodcastsIcon.imageset │ │ ├── Contents.json │ │ └── PodcastsIcon.png │ ├── SettingsIcon.imageset │ │ ├── Contents.json │ │ └── SettingsIcon.png │ ├── SourcesIcon.imageset │ │ ├── Contents.json │ │ └── SourcesIcon.png │ ├── TvIcon.imageset │ │ ├── Contents.json │ │ └── TvIcon.png │ └── appleTVNameImageGlow.imageset │ │ ├── Contents.json │ │ └── appleTVNameImageGlow.png ├── Base.lproj │ └── LaunchScreen.storyboard ├── ContentView.swift ├── Info.plist ├── LucidaGrande.ttf ├── LucidaGrandeBold.ttf ├── MyriadProRegular.ttf ├── MyriadProSemibold.ttf ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json └── SceneDelegate.swift ├── Apple TV 1st GenTests ├── Apple_TV_1st_GenTests.swift └── Info.plist ├── Apple TV 1st GenUITests ├── Apple_TV_1st_GenUITests.swift └── Info.plist └── README.md /Apple TV 1st Gen.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D33CA7B326890FDF0000432E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D33CA7B226890FDF0000432E /* AppDelegate.swift */; }; 11 | D33CA7B526890FDF0000432E /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D33CA7B426890FDF0000432E /* SceneDelegate.swift */; }; 12 | D33CA7B726890FDF0000432E /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D33CA7B626890FDF0000432E /* ContentView.swift */; }; 13 | D33CA7BA26890FDF0000432E /* Apple_TV_1st_Gen.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = D33CA7B826890FDF0000432E /* Apple_TV_1st_Gen.xcdatamodeld */; }; 14 | D33CA7BC26890FEB0000432E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D33CA7BB26890FEB0000432E /* Assets.xcassets */; }; 15 | D33CA7BF26890FEB0000432E /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D33CA7BE26890FEB0000432E /* Preview Assets.xcassets */; }; 16 | D33CA7C226890FEB0000432E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D33CA7C026890FEB0000432E /* LaunchScreen.storyboard */; }; 17 | D33CA7CD26890FEC0000432E /* Apple_TV_1st_GenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D33CA7CC26890FEC0000432E /* Apple_TV_1st_GenTests.swift */; }; 18 | D33CA7D826890FEC0000432E /* Apple_TV_1st_GenUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D33CA7D726890FEC0000432E /* Apple_TV_1st_GenUITests.swift */; }; 19 | D33CA7E7268A3B9F0000432E /* LucidaGrandeBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D33CA7E5268A3B9E0000432E /* LucidaGrandeBold.ttf */; }; 20 | D33CA7E8268A3B9F0000432E /* LucidaGrande.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D33CA7E6268A3B9E0000432E /* LucidaGrande.ttf */; }; 21 | D33CA7EA268A4E9B0000432E /* MyriadProRegular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D33CA7E9268A4E9B0000432E /* MyriadProRegular.ttf */; }; 22 | D33CA7EE268A4F5A0000432E /* MyriadProSemibold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D33CA7ED268A4F5A0000432E /* MyriadProSemibold.ttf */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXContainerItemProxy section */ 26 | D33CA7C926890FEC0000432E /* PBXContainerItemProxy */ = { 27 | isa = PBXContainerItemProxy; 28 | containerPortal = D33CA7A726890FDE0000432E /* Project object */; 29 | proxyType = 1; 30 | remoteGlobalIDString = D33CA7AE26890FDF0000432E; 31 | remoteInfo = "Apple TV 1st Gen"; 32 | }; 33 | D33CA7D426890FEC0000432E /* PBXContainerItemProxy */ = { 34 | isa = PBXContainerItemProxy; 35 | containerPortal = D33CA7A726890FDE0000432E /* Project object */; 36 | proxyType = 1; 37 | remoteGlobalIDString = D33CA7AE26890FDF0000432E; 38 | remoteInfo = "Apple TV 1st Gen"; 39 | }; 40 | /* End PBXContainerItemProxy section */ 41 | 42 | /* Begin PBXFileReference section */ 43 | D33CA7AF26890FDF0000432E /* Apple TV 1st Gen.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Apple TV 1st Gen.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | D33CA7B226890FDF0000432E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 45 | D33CA7B426890FDF0000432E /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 46 | D33CA7B626890FDF0000432E /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 47 | D33CA7B926890FDF0000432E /* Apple_TV_1st_Gen.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Apple_TV_1st_Gen.xcdatamodel; sourceTree = ""; }; 48 | D33CA7BB26890FEB0000432E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 49 | D33CA7BE26890FEB0000432E /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 50 | D33CA7C126890FEB0000432E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 51 | D33CA7C326890FEB0000432E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 52 | D33CA7C826890FEC0000432E /* Apple TV 1st GenTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Apple TV 1st GenTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | D33CA7CC26890FEC0000432E /* Apple_TV_1st_GenTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Apple_TV_1st_GenTests.swift; sourceTree = ""; }; 54 | D33CA7CE26890FEC0000432E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 55 | D33CA7D326890FEC0000432E /* Apple TV 1st GenUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Apple TV 1st GenUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | D33CA7D726890FEC0000432E /* Apple_TV_1st_GenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Apple_TV_1st_GenUITests.swift; sourceTree = ""; }; 57 | D33CA7D926890FEC0000432E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58 | D33CA7E5268A3B9E0000432E /* LucidaGrandeBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = LucidaGrandeBold.ttf; sourceTree = ""; }; 59 | D33CA7E6268A3B9E0000432E /* LucidaGrande.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = LucidaGrande.ttf; sourceTree = ""; }; 60 | D33CA7E9268A4E9B0000432E /* MyriadProRegular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = MyriadProRegular.ttf; sourceTree = ""; }; 61 | D33CA7ED268A4F5A0000432E /* MyriadProSemibold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = MyriadProSemibold.ttf; sourceTree = ""; }; 62 | /* End PBXFileReference section */ 63 | 64 | /* Begin PBXFrameworksBuildPhase section */ 65 | D33CA7AC26890FDF0000432E /* Frameworks */ = { 66 | isa = PBXFrameworksBuildPhase; 67 | buildActionMask = 2147483647; 68 | files = ( 69 | ); 70 | runOnlyForDeploymentPostprocessing = 0; 71 | }; 72 | D33CA7C526890FEC0000432E /* Frameworks */ = { 73 | isa = PBXFrameworksBuildPhase; 74 | buildActionMask = 2147483647; 75 | files = ( 76 | ); 77 | runOnlyForDeploymentPostprocessing = 0; 78 | }; 79 | D33CA7D026890FEC0000432E /* Frameworks */ = { 80 | isa = PBXFrameworksBuildPhase; 81 | buildActionMask = 2147483647; 82 | files = ( 83 | ); 84 | runOnlyForDeploymentPostprocessing = 0; 85 | }; 86 | /* End PBXFrameworksBuildPhase section */ 87 | 88 | /* Begin PBXGroup section */ 89 | D33CA7A626890FDE0000432E = { 90 | isa = PBXGroup; 91 | children = ( 92 | D33CA7B126890FDF0000432E /* Apple TV 1st Gen */, 93 | D33CA7CB26890FEC0000432E /* Apple TV 1st GenTests */, 94 | D33CA7D626890FEC0000432E /* Apple TV 1st GenUITests */, 95 | D33CA7B026890FDF0000432E /* Products */, 96 | ); 97 | sourceTree = ""; 98 | }; 99 | D33CA7B026890FDF0000432E /* Products */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | D33CA7AF26890FDF0000432E /* Apple TV 1st Gen.app */, 103 | D33CA7C826890FEC0000432E /* Apple TV 1st GenTests.xctest */, 104 | D33CA7D326890FEC0000432E /* Apple TV 1st GenUITests.xctest */, 105 | ); 106 | name = Products; 107 | sourceTree = ""; 108 | }; 109 | D33CA7B126890FDF0000432E /* Apple TV 1st Gen */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | D33CA7B226890FDF0000432E /* AppDelegate.swift */, 113 | D33CA7B426890FDF0000432E /* SceneDelegate.swift */, 114 | D33CA7B626890FDF0000432E /* ContentView.swift */, 115 | D33CA7BB26890FEB0000432E /* Assets.xcassets */, 116 | D33CA7C026890FEB0000432E /* LaunchScreen.storyboard */, 117 | D33CA7C326890FEB0000432E /* Info.plist */, 118 | D33CA7E6268A3B9E0000432E /* LucidaGrande.ttf */, 119 | D33CA7ED268A4F5A0000432E /* MyriadProSemibold.ttf */, 120 | D33CA7E5268A3B9E0000432E /* LucidaGrandeBold.ttf */, 121 | D33CA7E9268A4E9B0000432E /* MyriadProRegular.ttf */, 122 | D33CA7B826890FDF0000432E /* Apple_TV_1st_Gen.xcdatamodeld */, 123 | D33CA7BD26890FEB0000432E /* Preview Content */, 124 | ); 125 | path = "Apple TV 1st Gen"; 126 | sourceTree = ""; 127 | }; 128 | D33CA7BD26890FEB0000432E /* Preview Content */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | D33CA7BE26890FEB0000432E /* Preview Assets.xcassets */, 132 | ); 133 | path = "Preview Content"; 134 | sourceTree = ""; 135 | }; 136 | D33CA7CB26890FEC0000432E /* Apple TV 1st GenTests */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | D33CA7CC26890FEC0000432E /* Apple_TV_1st_GenTests.swift */, 140 | D33CA7CE26890FEC0000432E /* Info.plist */, 141 | ); 142 | path = "Apple TV 1st GenTests"; 143 | sourceTree = ""; 144 | }; 145 | D33CA7D626890FEC0000432E /* Apple TV 1st GenUITests */ = { 146 | isa = PBXGroup; 147 | children = ( 148 | D33CA7D726890FEC0000432E /* Apple_TV_1st_GenUITests.swift */, 149 | D33CA7D926890FEC0000432E /* Info.plist */, 150 | ); 151 | path = "Apple TV 1st GenUITests"; 152 | sourceTree = ""; 153 | }; 154 | /* End PBXGroup section */ 155 | 156 | /* Begin PBXNativeTarget section */ 157 | D33CA7AE26890FDF0000432E /* Apple TV 1st Gen */ = { 158 | isa = PBXNativeTarget; 159 | buildConfigurationList = D33CA7DC26890FEC0000432E /* Build configuration list for PBXNativeTarget "Apple TV 1st Gen" */; 160 | buildPhases = ( 161 | D33CA7AB26890FDF0000432E /* Sources */, 162 | D33CA7AC26890FDF0000432E /* Frameworks */, 163 | D33CA7AD26890FDF0000432E /* Resources */, 164 | ); 165 | buildRules = ( 166 | ); 167 | dependencies = ( 168 | ); 169 | name = "Apple TV 1st Gen"; 170 | productName = "Apple TV 1st Gen"; 171 | productReference = D33CA7AF26890FDF0000432E /* Apple TV 1st Gen.app */; 172 | productType = "com.apple.product-type.application"; 173 | }; 174 | D33CA7C726890FEC0000432E /* Apple TV 1st GenTests */ = { 175 | isa = PBXNativeTarget; 176 | buildConfigurationList = D33CA7DF26890FEC0000432E /* Build configuration list for PBXNativeTarget "Apple TV 1st GenTests" */; 177 | buildPhases = ( 178 | D33CA7C426890FEC0000432E /* Sources */, 179 | D33CA7C526890FEC0000432E /* Frameworks */, 180 | D33CA7C626890FEC0000432E /* Resources */, 181 | ); 182 | buildRules = ( 183 | ); 184 | dependencies = ( 185 | D33CA7CA26890FEC0000432E /* PBXTargetDependency */, 186 | ); 187 | name = "Apple TV 1st GenTests"; 188 | productName = "Apple TV 1st GenTests"; 189 | productReference = D33CA7C826890FEC0000432E /* Apple TV 1st GenTests.xctest */; 190 | productType = "com.apple.product-type.bundle.unit-test"; 191 | }; 192 | D33CA7D226890FEC0000432E /* Apple TV 1st GenUITests */ = { 193 | isa = PBXNativeTarget; 194 | buildConfigurationList = D33CA7E226890FEC0000432E /* Build configuration list for PBXNativeTarget "Apple TV 1st GenUITests" */; 195 | buildPhases = ( 196 | D33CA7CF26890FEC0000432E /* Sources */, 197 | D33CA7D026890FEC0000432E /* Frameworks */, 198 | D33CA7D126890FEC0000432E /* Resources */, 199 | ); 200 | buildRules = ( 201 | ); 202 | dependencies = ( 203 | D33CA7D526890FEC0000432E /* PBXTargetDependency */, 204 | ); 205 | name = "Apple TV 1st GenUITests"; 206 | productName = "Apple TV 1st GenUITests"; 207 | productReference = D33CA7D326890FEC0000432E /* Apple TV 1st GenUITests.xctest */; 208 | productType = "com.apple.product-type.bundle.ui-testing"; 209 | }; 210 | /* End PBXNativeTarget section */ 211 | 212 | /* Begin PBXProject section */ 213 | D33CA7A726890FDE0000432E /* Project object */ = { 214 | isa = PBXProject; 215 | attributes = { 216 | LastSwiftUpdateCheck = 1250; 217 | LastUpgradeCheck = 1250; 218 | TargetAttributes = { 219 | D33CA7AE26890FDF0000432E = { 220 | CreatedOnToolsVersion = 12.5; 221 | }; 222 | D33CA7C726890FEC0000432E = { 223 | CreatedOnToolsVersion = 12.5; 224 | TestTargetID = D33CA7AE26890FDF0000432E; 225 | }; 226 | D33CA7D226890FEC0000432E = { 227 | CreatedOnToolsVersion = 12.5; 228 | TestTargetID = D33CA7AE26890FDF0000432E; 229 | }; 230 | }; 231 | }; 232 | buildConfigurationList = D33CA7AA26890FDF0000432E /* Build configuration list for PBXProject "Apple TV 1st Gen" */; 233 | compatibilityVersion = "Xcode 9.3"; 234 | developmentRegion = en; 235 | hasScannedForEncodings = 0; 236 | knownRegions = ( 237 | en, 238 | Base, 239 | ); 240 | mainGroup = D33CA7A626890FDE0000432E; 241 | productRefGroup = D33CA7B026890FDF0000432E /* Products */; 242 | projectDirPath = ""; 243 | projectRoot = ""; 244 | targets = ( 245 | D33CA7AE26890FDF0000432E /* Apple TV 1st Gen */, 246 | D33CA7C726890FEC0000432E /* Apple TV 1st GenTests */, 247 | D33CA7D226890FEC0000432E /* Apple TV 1st GenUITests */, 248 | ); 249 | }; 250 | /* End PBXProject section */ 251 | 252 | /* Begin PBXResourcesBuildPhase section */ 253 | D33CA7AD26890FDF0000432E /* Resources */ = { 254 | isa = PBXResourcesBuildPhase; 255 | buildActionMask = 2147483647; 256 | files = ( 257 | D33CA7E7268A3B9F0000432E /* LucidaGrandeBold.ttf in Resources */, 258 | D33CA7EE268A4F5A0000432E /* MyriadProSemibold.ttf in Resources */, 259 | D33CA7C226890FEB0000432E /* LaunchScreen.storyboard in Resources */, 260 | D33CA7E8268A3B9F0000432E /* LucidaGrande.ttf in Resources */, 261 | D33CA7EA268A4E9B0000432E /* MyriadProRegular.ttf in Resources */, 262 | D33CA7BF26890FEB0000432E /* Preview Assets.xcassets in Resources */, 263 | D33CA7BC26890FEB0000432E /* Assets.xcassets in Resources */, 264 | ); 265 | runOnlyForDeploymentPostprocessing = 0; 266 | }; 267 | D33CA7C626890FEC0000432E /* Resources */ = { 268 | isa = PBXResourcesBuildPhase; 269 | buildActionMask = 2147483647; 270 | files = ( 271 | ); 272 | runOnlyForDeploymentPostprocessing = 0; 273 | }; 274 | D33CA7D126890FEC0000432E /* Resources */ = { 275 | isa = PBXResourcesBuildPhase; 276 | buildActionMask = 2147483647; 277 | files = ( 278 | ); 279 | runOnlyForDeploymentPostprocessing = 0; 280 | }; 281 | /* End PBXResourcesBuildPhase section */ 282 | 283 | /* Begin PBXSourcesBuildPhase section */ 284 | D33CA7AB26890FDF0000432E /* Sources */ = { 285 | isa = PBXSourcesBuildPhase; 286 | buildActionMask = 2147483647; 287 | files = ( 288 | D33CA7BA26890FDF0000432E /* Apple_TV_1st_Gen.xcdatamodeld in Sources */, 289 | D33CA7B326890FDF0000432E /* AppDelegate.swift in Sources */, 290 | D33CA7B526890FDF0000432E /* SceneDelegate.swift in Sources */, 291 | D33CA7B726890FDF0000432E /* ContentView.swift in Sources */, 292 | ); 293 | runOnlyForDeploymentPostprocessing = 0; 294 | }; 295 | D33CA7C426890FEC0000432E /* Sources */ = { 296 | isa = PBXSourcesBuildPhase; 297 | buildActionMask = 2147483647; 298 | files = ( 299 | D33CA7CD26890FEC0000432E /* Apple_TV_1st_GenTests.swift in Sources */, 300 | ); 301 | runOnlyForDeploymentPostprocessing = 0; 302 | }; 303 | D33CA7CF26890FEC0000432E /* Sources */ = { 304 | isa = PBXSourcesBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | D33CA7D826890FEC0000432E /* Apple_TV_1st_GenUITests.swift in Sources */, 308 | ); 309 | runOnlyForDeploymentPostprocessing = 0; 310 | }; 311 | /* End PBXSourcesBuildPhase section */ 312 | 313 | /* Begin PBXTargetDependency section */ 314 | D33CA7CA26890FEC0000432E /* PBXTargetDependency */ = { 315 | isa = PBXTargetDependency; 316 | target = D33CA7AE26890FDF0000432E /* Apple TV 1st Gen */; 317 | targetProxy = D33CA7C926890FEC0000432E /* PBXContainerItemProxy */; 318 | }; 319 | D33CA7D526890FEC0000432E /* PBXTargetDependency */ = { 320 | isa = PBXTargetDependency; 321 | target = D33CA7AE26890FDF0000432E /* Apple TV 1st Gen */; 322 | targetProxy = D33CA7D426890FEC0000432E /* PBXContainerItemProxy */; 323 | }; 324 | /* End PBXTargetDependency section */ 325 | 326 | /* Begin PBXVariantGroup section */ 327 | D33CA7C026890FEB0000432E /* LaunchScreen.storyboard */ = { 328 | isa = PBXVariantGroup; 329 | children = ( 330 | D33CA7C126890FEB0000432E /* Base */, 331 | ); 332 | name = LaunchScreen.storyboard; 333 | sourceTree = ""; 334 | }; 335 | /* End PBXVariantGroup section */ 336 | 337 | /* Begin XCBuildConfiguration section */ 338 | D33CA7DA26890FEC0000432E /* Debug */ = { 339 | isa = XCBuildConfiguration; 340 | buildSettings = { 341 | ALWAYS_SEARCH_USER_PATHS = NO; 342 | CLANG_ANALYZER_NONNULL = YES; 343 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 344 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 345 | CLANG_CXX_LIBRARY = "libc++"; 346 | CLANG_ENABLE_MODULES = YES; 347 | CLANG_ENABLE_OBJC_ARC = YES; 348 | CLANG_ENABLE_OBJC_WEAK = YES; 349 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 350 | CLANG_WARN_BOOL_CONVERSION = YES; 351 | CLANG_WARN_COMMA = YES; 352 | CLANG_WARN_CONSTANT_CONVERSION = YES; 353 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 354 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 355 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 356 | CLANG_WARN_EMPTY_BODY = YES; 357 | CLANG_WARN_ENUM_CONVERSION = YES; 358 | CLANG_WARN_INFINITE_RECURSION = YES; 359 | CLANG_WARN_INT_CONVERSION = YES; 360 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 361 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 362 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 363 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 364 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 365 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 366 | CLANG_WARN_STRICT_PROTOTYPES = YES; 367 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 368 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 369 | CLANG_WARN_UNREACHABLE_CODE = YES; 370 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 371 | COPY_PHASE_STRIP = NO; 372 | DEBUG_INFORMATION_FORMAT = dwarf; 373 | ENABLE_STRICT_OBJC_MSGSEND = YES; 374 | ENABLE_TESTABILITY = YES; 375 | GCC_C_LANGUAGE_STANDARD = gnu11; 376 | GCC_DYNAMIC_NO_PIC = NO; 377 | GCC_NO_COMMON_BLOCKS = YES; 378 | GCC_OPTIMIZATION_LEVEL = 0; 379 | GCC_PREPROCESSOR_DEFINITIONS = ( 380 | "DEBUG=1", 381 | "$(inherited)", 382 | ); 383 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 384 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 385 | GCC_WARN_UNDECLARED_SELECTOR = YES; 386 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 387 | GCC_WARN_UNUSED_FUNCTION = YES; 388 | GCC_WARN_UNUSED_VARIABLE = YES; 389 | IPHONEOS_DEPLOYMENT_TARGET = 14.5; 390 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 391 | MTL_FAST_MATH = YES; 392 | ONLY_ACTIVE_ARCH = YES; 393 | SDKROOT = iphoneos; 394 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 395 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 396 | }; 397 | name = Debug; 398 | }; 399 | D33CA7DB26890FEC0000432E /* Release */ = { 400 | isa = XCBuildConfiguration; 401 | buildSettings = { 402 | ALWAYS_SEARCH_USER_PATHS = NO; 403 | CLANG_ANALYZER_NONNULL = YES; 404 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 405 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 406 | CLANG_CXX_LIBRARY = "libc++"; 407 | CLANG_ENABLE_MODULES = YES; 408 | CLANG_ENABLE_OBJC_ARC = YES; 409 | CLANG_ENABLE_OBJC_WEAK = YES; 410 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 411 | CLANG_WARN_BOOL_CONVERSION = YES; 412 | CLANG_WARN_COMMA = YES; 413 | CLANG_WARN_CONSTANT_CONVERSION = YES; 414 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 415 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 416 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 417 | CLANG_WARN_EMPTY_BODY = YES; 418 | CLANG_WARN_ENUM_CONVERSION = YES; 419 | CLANG_WARN_INFINITE_RECURSION = YES; 420 | CLANG_WARN_INT_CONVERSION = YES; 421 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 422 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 423 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 424 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 425 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 426 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 427 | CLANG_WARN_STRICT_PROTOTYPES = YES; 428 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 429 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 430 | CLANG_WARN_UNREACHABLE_CODE = YES; 431 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 432 | COPY_PHASE_STRIP = NO; 433 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 434 | ENABLE_NS_ASSERTIONS = NO; 435 | ENABLE_STRICT_OBJC_MSGSEND = YES; 436 | GCC_C_LANGUAGE_STANDARD = gnu11; 437 | GCC_NO_COMMON_BLOCKS = YES; 438 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 439 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 440 | GCC_WARN_UNDECLARED_SELECTOR = YES; 441 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 442 | GCC_WARN_UNUSED_FUNCTION = YES; 443 | GCC_WARN_UNUSED_VARIABLE = YES; 444 | IPHONEOS_DEPLOYMENT_TARGET = 14.5; 445 | MTL_ENABLE_DEBUG_INFO = NO; 446 | MTL_FAST_MATH = YES; 447 | SDKROOT = iphoneos; 448 | SWIFT_COMPILATION_MODE = wholemodule; 449 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 450 | VALIDATE_PRODUCT = YES; 451 | }; 452 | name = Release; 453 | }; 454 | D33CA7DD26890FEC0000432E /* Debug */ = { 455 | isa = XCBuildConfiguration; 456 | buildSettings = { 457 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 458 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 459 | CODE_SIGN_STYLE = Automatic; 460 | DEVELOPMENT_ASSET_PATHS = "\"Apple TV 1st Gen/Preview Content\""; 461 | ENABLE_PREVIEWS = YES; 462 | INFOPLIST_FILE = "Apple TV 1st Gen/Info.plist"; 463 | LD_RUNPATH_SEARCH_PATHS = ( 464 | "$(inherited)", 465 | "@executable_path/Frameworks", 466 | ); 467 | PRODUCT_BUNDLE_IDENTIFIER = "zink.Apple-TV-1st-Gen"; 468 | PRODUCT_NAME = "$(TARGET_NAME)"; 469 | SWIFT_VERSION = 5.0; 470 | TARGETED_DEVICE_FAMILY = 2; 471 | }; 472 | name = Debug; 473 | }; 474 | D33CA7DE26890FEC0000432E /* Release */ = { 475 | isa = XCBuildConfiguration; 476 | buildSettings = { 477 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 478 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 479 | CODE_SIGN_STYLE = Automatic; 480 | DEVELOPMENT_ASSET_PATHS = "\"Apple TV 1st Gen/Preview Content\""; 481 | ENABLE_PREVIEWS = YES; 482 | INFOPLIST_FILE = "Apple TV 1st Gen/Info.plist"; 483 | LD_RUNPATH_SEARCH_PATHS = ( 484 | "$(inherited)", 485 | "@executable_path/Frameworks", 486 | ); 487 | PRODUCT_BUNDLE_IDENTIFIER = "zink.Apple-TV-1st-Gen"; 488 | PRODUCT_NAME = "$(TARGET_NAME)"; 489 | SWIFT_VERSION = 5.0; 490 | TARGETED_DEVICE_FAMILY = 2; 491 | }; 492 | name = Release; 493 | }; 494 | D33CA7E026890FEC0000432E /* Debug */ = { 495 | isa = XCBuildConfiguration; 496 | buildSettings = { 497 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 498 | BUNDLE_LOADER = "$(TEST_HOST)"; 499 | CODE_SIGN_STYLE = Automatic; 500 | INFOPLIST_FILE = "Apple TV 1st GenTests/Info.plist"; 501 | IPHONEOS_DEPLOYMENT_TARGET = 14.5; 502 | LD_RUNPATH_SEARCH_PATHS = ( 503 | "$(inherited)", 504 | "@executable_path/Frameworks", 505 | "@loader_path/Frameworks", 506 | ); 507 | PRODUCT_BUNDLE_IDENTIFIER = "zink.Apple-TV-1st-GenTests"; 508 | PRODUCT_NAME = "$(TARGET_NAME)"; 509 | SWIFT_VERSION = 5.0; 510 | TARGETED_DEVICE_FAMILY = "1,2"; 511 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Apple TV 1st Gen.app/Apple TV 1st Gen"; 512 | }; 513 | name = Debug; 514 | }; 515 | D33CA7E126890FEC0000432E /* Release */ = { 516 | isa = XCBuildConfiguration; 517 | buildSettings = { 518 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 519 | BUNDLE_LOADER = "$(TEST_HOST)"; 520 | CODE_SIGN_STYLE = Automatic; 521 | INFOPLIST_FILE = "Apple TV 1st GenTests/Info.plist"; 522 | IPHONEOS_DEPLOYMENT_TARGET = 14.5; 523 | LD_RUNPATH_SEARCH_PATHS = ( 524 | "$(inherited)", 525 | "@executable_path/Frameworks", 526 | "@loader_path/Frameworks", 527 | ); 528 | PRODUCT_BUNDLE_IDENTIFIER = "zink.Apple-TV-1st-GenTests"; 529 | PRODUCT_NAME = "$(TARGET_NAME)"; 530 | SWIFT_VERSION = 5.0; 531 | TARGETED_DEVICE_FAMILY = "1,2"; 532 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Apple TV 1st Gen.app/Apple TV 1st Gen"; 533 | }; 534 | name = Release; 535 | }; 536 | D33CA7E326890FEC0000432E /* Debug */ = { 537 | isa = XCBuildConfiguration; 538 | buildSettings = { 539 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 540 | CODE_SIGN_STYLE = Automatic; 541 | INFOPLIST_FILE = "Apple TV 1st GenUITests/Info.plist"; 542 | LD_RUNPATH_SEARCH_PATHS = ( 543 | "$(inherited)", 544 | "@executable_path/Frameworks", 545 | "@loader_path/Frameworks", 546 | ); 547 | PRODUCT_BUNDLE_IDENTIFIER = "zink.Apple-TV-1st-GenUITests"; 548 | PRODUCT_NAME = "$(TARGET_NAME)"; 549 | SWIFT_VERSION = 5.0; 550 | TARGETED_DEVICE_FAMILY = "1,2"; 551 | TEST_TARGET_NAME = "Apple TV 1st Gen"; 552 | }; 553 | name = Debug; 554 | }; 555 | D33CA7E426890FEC0000432E /* Release */ = { 556 | isa = XCBuildConfiguration; 557 | buildSettings = { 558 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 559 | CODE_SIGN_STYLE = Automatic; 560 | INFOPLIST_FILE = "Apple TV 1st GenUITests/Info.plist"; 561 | LD_RUNPATH_SEARCH_PATHS = ( 562 | "$(inherited)", 563 | "@executable_path/Frameworks", 564 | "@loader_path/Frameworks", 565 | ); 566 | PRODUCT_BUNDLE_IDENTIFIER = "zink.Apple-TV-1st-GenUITests"; 567 | PRODUCT_NAME = "$(TARGET_NAME)"; 568 | SWIFT_VERSION = 5.0; 569 | TARGETED_DEVICE_FAMILY = "1,2"; 570 | TEST_TARGET_NAME = "Apple TV 1st Gen"; 571 | }; 572 | name = Release; 573 | }; 574 | /* End XCBuildConfiguration section */ 575 | 576 | /* Begin XCConfigurationList section */ 577 | D33CA7AA26890FDF0000432E /* Build configuration list for PBXProject "Apple TV 1st Gen" */ = { 578 | isa = XCConfigurationList; 579 | buildConfigurations = ( 580 | D33CA7DA26890FEC0000432E /* Debug */, 581 | D33CA7DB26890FEC0000432E /* Release */, 582 | ); 583 | defaultConfigurationIsVisible = 0; 584 | defaultConfigurationName = Release; 585 | }; 586 | D33CA7DC26890FEC0000432E /* Build configuration list for PBXNativeTarget "Apple TV 1st Gen" */ = { 587 | isa = XCConfigurationList; 588 | buildConfigurations = ( 589 | D33CA7DD26890FEC0000432E /* Debug */, 590 | D33CA7DE26890FEC0000432E /* Release */, 591 | ); 592 | defaultConfigurationIsVisible = 0; 593 | defaultConfigurationName = Release; 594 | }; 595 | D33CA7DF26890FEC0000432E /* Build configuration list for PBXNativeTarget "Apple TV 1st GenTests" */ = { 596 | isa = XCConfigurationList; 597 | buildConfigurations = ( 598 | D33CA7E026890FEC0000432E /* Debug */, 599 | D33CA7E126890FEC0000432E /* Release */, 600 | ); 601 | defaultConfigurationIsVisible = 0; 602 | defaultConfigurationName = Release; 603 | }; 604 | D33CA7E226890FEC0000432E /* Build configuration list for PBXNativeTarget "Apple TV 1st GenUITests" */ = { 605 | isa = XCConfigurationList; 606 | buildConfigurations = ( 607 | D33CA7E326890FEC0000432E /* Debug */, 608 | D33CA7E426890FEC0000432E /* Release */, 609 | ); 610 | defaultConfigurationIsVisible = 0; 611 | defaultConfigurationName = Release; 612 | }; 613 | /* End XCConfigurationList section */ 614 | 615 | /* Begin XCVersionGroup section */ 616 | D33CA7B826890FDF0000432E /* Apple_TV_1st_Gen.xcdatamodeld */ = { 617 | isa = XCVersionGroup; 618 | children = ( 619 | D33CA7B926890FDF0000432E /* Apple_TV_1st_Gen.xcdatamodel */, 620 | ); 621 | currentVersion = D33CA7B926890FDF0000432E /* Apple_TV_1st_Gen.xcdatamodel */; 622 | path = Apple_TV_1st_Gen.xcdatamodeld; 623 | sourceTree = ""; 624 | versionGroupType = wrapper.xcdatamodel; 625 | }; 626 | /* End XCVersionGroup section */ 627 | }; 628 | rootObject = D33CA7A726890FDE0000432E /* Project object */; 629 | } 630 | -------------------------------------------------------------------------------- /Apple TV 1st Gen.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Apple TV 1st Gen.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Apple TV 1st Gen.xcodeproj/project.xcworkspace/xcuserdata/dank9.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen.xcodeproj/project.xcworkspace/xcuserdata/dank9.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Apple TV 1st Gen.xcodeproj/xcuserdata/dank9.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Apple TV 1st Gen.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Apple TV 1st Gen 4 | // 5 | // Created by Zane Kleinberg on 6/28/21. 6 | // 7 | 8 | import UIKit 9 | import CoreData 10 | 11 | @main 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | // MARK: UISceneSession Lifecycle 22 | 23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 24 | // Called when a new scene session is being created. 25 | // Use this method to select a configuration to create the new scene with. 26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 27 | } 28 | 29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { 30 | // Called when the user discards a scene session. 31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 33 | } 34 | 35 | // MARK: - Core Data stack 36 | 37 | lazy var persistentContainer: NSPersistentContainer = { 38 | /* 39 | The persistent container for the application. This implementation 40 | creates and returns a container, having loaded the store for the 41 | application to it. This property is optional since there are legitimate 42 | error conditions that could cause the creation of the store to fail. 43 | */ 44 | let container = NSPersistentContainer(name: "Apple_TV_1st_Gen") 45 | container.loadPersistentStores(completionHandler: { (storeDescription, error) in 46 | if let error = error as NSError? { 47 | // Replace this implementation with code to handle the error appropriately. 48 | // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 49 | 50 | /* 51 | Typical reasons for an error here include: 52 | * The parent directory does not exist, cannot be created, or disallows writing. 53 | * The persistent store is not accessible, due to permissions or data protection when the device is locked. 54 | * The device is out of space. 55 | * The store could not be migrated to the current model version. 56 | Check the error message to determine what the actual problem was. 57 | */ 58 | fatalError("Unresolved error \(error), \(error.userInfo)") 59 | } 60 | }) 61 | return container 62 | }() 63 | 64 | // MARK: - Core Data Saving support 65 | 66 | func saveContext () { 67 | let context = persistentContainer.viewContext 68 | if context.hasChanges { 69 | do { 70 | try context.save() 71 | } catch { 72 | // Replace this implementation with code to handle the error appropriately. 73 | // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 74 | let nserror = error as NSError 75 | fatalError("Unresolved error \(nserror), \(nserror.userInfo)") 76 | } 77 | } 78 | } 79 | 80 | } 81 | 82 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Apple_TV_1st_Gen.xcdatamodeld/.xccurrentversion: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | _XCCurrentVersionName 6 | Apple_TV_1st_Gen.xcdatamodel 7 | 8 | 9 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Apple_TV_1st_Gen.xcdatamodeld/Apple_TV_1st_Gen.xcdatamodel/contents: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | } 93 | ], 94 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredMoviesIcon.imageset/BlurredMoviesIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/BlurredMoviesIcon.imageset/BlurredMoviesIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredMoviesIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "BlurredMoviesIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredMusicIcon.imageset/BlurredMusicIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/BlurredMusicIcon.imageset/BlurredMusicIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredMusicIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "BlurredMusicIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredPhotosIcon.imageset/BlurredPhotosIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/BlurredPhotosIcon.imageset/BlurredPhotosIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredPhotosIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "BlurredPhotosIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredPodcastIcon.imageset/BlurredPodcastIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/BlurredPodcastIcon.imageset/BlurredPodcastIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredPodcastIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "BlurredPodcastIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredSettingsIcon.imageset/BlurredSettingsIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/BlurredSettingsIcon.imageset/BlurredSettingsIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredSettingsIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "BlurredSettingsIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredSourcesIcon.imageset/BlurredSourcesIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/BlurredSourcesIcon.imageset/BlurredSourcesIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredSourcesIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "BlurredSourcesIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredTVIcon.imageset/BlurredTVIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/BlurredTVIcon.imageset/BlurredTVIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/BlurredTVIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "BlurredTVIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/MoviesIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "MoviesIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/MoviesIcon.imageset/MoviesIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/MoviesIcon.imageset/MoviesIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/MusicIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "MusicIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/MusicIcon.imageset/MusicIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/MusicIcon.imageset/MusicIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/PhotosIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "PhotosIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/PhotosIcon.imageset/PhotosIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/PhotosIcon.imageset/PhotosIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/PodcastsIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "PodcastsIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/PodcastsIcon.imageset/PodcastsIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/PodcastsIcon.imageset/PodcastsIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/SettingsIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "SettingsIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/SettingsIcon.imageset/SettingsIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/SettingsIcon.imageset/SettingsIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/SourcesIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "SourcesIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/SourcesIcon.imageset/SourcesIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/SourcesIcon.imageset/SourcesIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/TvIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "TvIcon.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/TvIcon.imageset/TvIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/TvIcon.imageset/TvIcon.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/appleTVNameImageGlow.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "appleTVNameImageGlow.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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/Assets.xcassets/appleTVNameImageGlow.imageset/appleTVNameImageGlow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/Assets.xcassets/appleTVNameImageGlow.imageset/appleTVNameImageGlow.png -------------------------------------------------------------------------------- /Apple TV 1st Gen/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 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // Apple TV 1st Gen 4 | // 5 | // Created by Zane Kleinberg on 6/28/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ContentView: View { 11 | var body: some View { 12 | GeometryReader{ geometry in 13 | ZStack { 14 | Color.black.edgesIgnoringSafeArea(.all) 15 | HStack { 16 | lefthand_view().frame(width: geometry.size.width/2, height: geometry.size.height) 17 | righthand_view().frame(width: geometry.size.width/2, height: geometry.size.height) 18 | } 19 | } 20 | } 21 | } 22 | } 23 | 24 | struct righthand_view: View { 25 | var body: some View { 26 | ZStack { 27 | VStack(alignment: .center, spacing: 0) { 28 | tv_header() 29 | Spacer().frame(height: 30) 30 | selected_item(text: "Movies").frame(height: 60).padding([.leading, .trailing], 40) 31 | unselected_item(text: "TV Shows").frame(height: 60).padding([.leading, .trailing], 40) 32 | unselected_item(text: "Music").frame(height: 60).padding([.leading, .trailing], 40) 33 | unselected_item(text: "Podcasts").frame(height: 60).padding([.leading, .trailing], 40) 34 | unselected_item(text: "Photos").frame(height: 60).padding([.leading, .trailing], 40) 35 | unselected_item(text: "Settings").frame(height: 60).padding([.leading, .trailing], 40) 36 | unselected_item(text: "Sources").frame(height: 60).padding([.leading, .trailing], 40) 37 | Spacer().frame(height: 100) 38 | } 39 | } 40 | } 41 | } 42 | 43 | struct tv_header: View { 44 | var body: some View { 45 | HStack(alignment: .bottom, spacing: 5) { 46 | Spacer() 47 | ZStack { 48 | Text("").fontWeight(.bold).font(.system(size: 80)).foregroundColor(.white).blur(radius: 10) 49 | Text("").fontWeight(.bold).font(.system(size: 80)).foregroundColor(.white) 50 | } 51 | Text("tv").font(Font.custom("Myriad Pro Semibold", size: 80)).foregroundColor(.white) 52 | Spacer() 53 | } 54 | } 55 | } 56 | 57 | struct selected_item: View { 58 | var text: String 59 | var body: some View { 60 | GeometryReader { geometry in 61 | ZStack { 62 | Rectangle().fill(Color(red: 43/255, green: 75/255, blue: 121/255)) 63 | Rectangle().fill(Color.black).frame(width: geometry.size.width, height: geometry.size.height).border(Color(red: 38/255, green: 79/255, blue: 142/255), width: 2).glow(color: Color(red: 43/255, green: 75/255, blue: 121/255).opacity(0.5), radius: 30) 64 | VStack(spacing: 0) { 65 | Rectangle().fill(LinearGradient(gradient: Gradient(stops: [.init(color: Color(red: 116/255, green: 115/255, blue: 112/255), location: 0), .init(color: Color(red: 53/255, green: 53/255, blue: 53/255), location: 1)]), startPoint: .top, endPoint: .bottom)).frame(width: geometry.size.width-4, height: geometry.size.height/2.5).cornerRadiusSpecific(radius: 4, corners: [.bottomLeft, .bottomRight]).padding([.top], 2) 66 | Spacer() 67 | } 68 | VStack(spacing: 0) { 69 | Spacer() 70 | Rectangle().fill(LinearGradient(gradient: Gradient(stops: [.init(color: Color(red: 59/255, green: 59/255, blue: 59/255), location: 0), .init(color: Color(red: 25/255, green: 25/255, blue: 25/255), location: 1)]), startPoint: .bottom, endPoint: .top)).frame(width: geometry.size.width-4, height: geometry.size.height/6.5).cornerRadiusSpecific(radius: 4, corners: [.topLeft, .topRight]).padding([.bottom], 2) 71 | } 72 | HStack { 73 | Text(text).font(Font.custom("Lucida Grande Bold", size: 30)).foregroundColor(.white).padding(.leading, 20) 74 | Spacer() 75 | ZStack { 76 | Image(systemName: "chevron.right").font(.system(size: 25, weight: .heavy)).foregroundColor(.white).padding(.trailing, 20).blur(radius: 5) 77 | Image(systemName: "chevron.right").font(.system(size: 25, weight: .heavy)).foregroundColor(.white).padding(.trailing, 20) 78 | } 79 | } 80 | } 81 | } 82 | } 83 | } 84 | 85 | struct unselected_item: View { 86 | var text: String 87 | var body: some View { 88 | ZStack { 89 | HStack { 90 | Text(text).font(Font.custom("Lucida Grande Bold", size: 30)).foregroundColor(.white).padding(.leading, 20) 91 | Spacer() 92 | Image(systemName: "chevron.right").font(.system(size: 25, weight: .heavy)).foregroundColor(Color(red: 133/255, green: 133/255, blue: 133/255)).padding(.trailing, 20) 93 | } 94 | } 95 | } 96 | } 97 | 98 | struct lefthand_view: View { 99 | var body: some View { 100 | ZStack { 101 | //Smaller Music Icon 102 | VStack { 103 | HStack { 104 | ZStack { 105 | Image("MusicIcon").blur(radius: 20) 106 | Image("MusicIcon").rotationEffect(.degrees(-180)).rotation3DEffect( 107 | .degrees(180), 108 | axis: (x:0, y: 1, z: 0) 109 | ).offset(y:-110 + 512).opacity(0.05) 110 | }.scaleEffect(0.30).padding(.top, 75).offset(x:-165) 111 | Spacer() 112 | } 113 | Spacer() 114 | }.clipped() 115 | //Smaller TV Icon 116 | VStack { 117 | ZStack { 118 | Image("TvIcon").blur(radius: 20) 119 | Image("TvIcon").rotationEffect(.degrees(-180)).rotation3DEffect( 120 | .degrees(180), 121 | axis: (x:0, y: 1, z: 0) 122 | ).offset(y:-110 + 512).opacity(0.25) 123 | }.scaleEffect(0.40).padding(.top, 115).padding(.trailing, 280) 124 | Spacer() 125 | } 126 | 127 | //Larger Movie Icon 128 | HStack { 129 | Spacer() 130 | ZStack { 131 | Image("MoviesIcon") 132 | Image("MoviesIcon").rotationEffect(.degrees(-180)).rotation3DEffect( 133 | .degrees(180), 134 | axis: (x:0, y: 1, z: 0) 135 | ).offset(y:-110 + 512).opacity(0.25) 136 | } 137 | } 138 | } 139 | } 140 | } 141 | 142 | //** MARK: Extensions 143 | 144 | struct CornerRadiusStyle: ViewModifier { 145 | var radius: CGFloat 146 | var corners: UIRectCorner 147 | 148 | struct CornerRadiusShape: Shape { 149 | 150 | var radius = CGFloat.infinity 151 | var corners = UIRectCorner.allCorners 152 | 153 | func path(in rect: CGRect) -> Path { 154 | let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) 155 | return Path(path.cgPath) 156 | } 157 | } 158 | 159 | func body(content: Content) -> some View { 160 | content 161 | .clipShape(CornerRadiusShape(radius: radius, corners: corners)) 162 | } 163 | } 164 | 165 | extension View { 166 | func cornerRadiusSpecific(radius: CGFloat, corners: UIRectCorner) -> some View { 167 | ModifiedContent(content: self, modifier: CornerRadiusStyle(radius: radius, corners: corners)) 168 | } 169 | } 170 | 171 | 172 | extension View { 173 | func glow(color: Color = .red, radius: CGFloat = 20) -> some View { 174 | self 175 | .shadow(color: color, radius: radius / 3) 176 | .shadow(color: color, radius: radius / 3) 177 | .shadow(color: color, radius: radius / 3) 178 | } 179 | } 180 | 181 | 182 | struct ContentView_Previews: PreviewProvider { 183 | static var previews: some View { 184 | ContentView() 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/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 | 37 | 38 | 39 | 40 | UIApplicationSupportsIndirectInputEvents 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UIRequiredDeviceCapabilities 45 | 46 | armv7 47 | 48 | UISupportedInterfaceOrientations 49 | 50 | UIInterfaceOrientationPortrait 51 | UIInterfaceOrientationLandscapeLeft 52 | UIInterfaceOrientationLandscapeRight 53 | 54 | UISupportedInterfaceOrientations~ipad 55 | 56 | UIInterfaceOrientationLandscapeLeft 57 | UIInterfaceOrientationLandscapeRight 58 | 59 | UIAppFonts 60 | 61 | MyriadProRegular.ttf 62 | MyriadProSemibold.ttf 63 | LucidaGrandeBold.ttf 64 | LucidaGrande.ttf 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/LucidaGrande.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/LucidaGrande.ttf -------------------------------------------------------------------------------- /Apple TV 1st Gen/LucidaGrandeBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/LucidaGrandeBold.ttf -------------------------------------------------------------------------------- /Apple TV 1st Gen/MyriadProRegular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/MyriadProRegular.ttf -------------------------------------------------------------------------------- /Apple TV 1st Gen/MyriadProSemibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zzanehip/Apple-TV-Experiment/783a72cbdb8b2f0a7e7b66abbbaabd8669a7c243/Apple TV 1st Gen/MyriadProSemibold.ttf -------------------------------------------------------------------------------- /Apple TV 1st Gen/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Apple TV 1st Gen/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // Apple TV 1st Gen 4 | // 5 | // Created by Zane Kleinberg on 6/28/21. 6 | // 7 | 8 | import UIKit 9 | import SwiftUI 10 | 11 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | 16 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 17 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 18 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 19 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 20 | 21 | // Get the managed object context from the shared persistent container. 22 | let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 23 | 24 | // Create the SwiftUI view and set the context as the value for the managedObjectContext environment keyPath. 25 | // Add `@Environment(\.managedObjectContext)` in the views that will need the context. 26 | let contentView = ContentView().environment(\.managedObjectContext, context) 27 | 28 | // Use a UIHostingController as window root view controller. 29 | if let windowScene = scene as? UIWindowScene { 30 | let window = UIWindow(windowScene: windowScene) 31 | window.rootViewController = UIHostingController(rootView: contentView) 32 | self.window = window 33 | window.makeKeyAndVisible() 34 | } 35 | } 36 | 37 | func sceneDidDisconnect(_ scene: UIScene) { 38 | // Called as the scene is being released by the system. 39 | // This occurs shortly after the scene enters the background, or when its session is discarded. 40 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 41 | // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). 42 | } 43 | 44 | func sceneDidBecomeActive(_ scene: UIScene) { 45 | // Called when the scene has moved from an inactive state to an active state. 46 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 47 | } 48 | 49 | func sceneWillResignActive(_ scene: UIScene) { 50 | // Called when the scene will move from an active state to an inactive state. 51 | // This may occur due to temporary interruptions (ex. an incoming phone call). 52 | } 53 | 54 | func sceneWillEnterForeground(_ scene: UIScene) { 55 | // Called as the scene transitions from the background to the foreground. 56 | // Use this method to undo the changes made on entering the background. 57 | } 58 | 59 | func sceneDidEnterBackground(_ scene: UIScene) { 60 | // Called as the scene transitions from the foreground to the background. 61 | // Use this method to save data, release shared resources, and store enough scene-specific state information 62 | // to restore the scene back to its current state. 63 | 64 | // Save changes in the application's managed object context when the application transitions to the background. 65 | (UIApplication.shared.delegate as? AppDelegate)?.saveContext() 66 | } 67 | 68 | 69 | } 70 | 71 | -------------------------------------------------------------------------------- /Apple TV 1st GenTests/Apple_TV_1st_GenTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Apple_TV_1st_GenTests.swift 3 | // Apple TV 1st GenTests 4 | // 5 | // Created by Zane Kleinberg on 6/28/21. 6 | // 7 | 8 | import XCTest 9 | @testable import Apple_TV_1st_Gen 10 | 11 | class Apple_TV_1st_GenTests: XCTestCase { 12 | 13 | override func setUpWithError() throws { 14 | // Put setup code here. This method is called before the invocation of each test method in the class. 15 | } 16 | 17 | override func tearDownWithError() throws { 18 | // Put teardown code here. This method is called after the invocation of each test method in the class. 19 | } 20 | 21 | func testExample() throws { 22 | // This is an example of a functional test case. 23 | // Use XCTAssert and related functions to verify your tests produce the correct results. 24 | } 25 | 26 | func testPerformanceExample() throws { 27 | // This is an example of a performance test case. 28 | self.measure { 29 | // Put the code you want to measure the time of here. 30 | } 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /Apple TV 1st GenTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Apple TV 1st GenUITests/Apple_TV_1st_GenUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Apple_TV_1st_GenUITests.swift 3 | // Apple TV 1st GenUITests 4 | // 5 | // Created by Elaine Kleinberg on 6/28/21. 6 | // 7 | 8 | import XCTest 9 | 10 | class Apple_TV_1st_GenUITests: XCTestCase { 11 | 12 | override func setUpWithError() throws { 13 | // Put setup code here. This method is called before the invocation of each test method in the class. 14 | 15 | // In UI tests it is usually best to stop immediately when a failure occurs. 16 | continueAfterFailure = false 17 | 18 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 19 | } 20 | 21 | override func tearDownWithError() throws { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | } 24 | 25 | func testExample() throws { 26 | // UI tests must launch the application that they test. 27 | let app = XCUIApplication() 28 | app.launch() 29 | 30 | // Use recording to get started writing UI tests. 31 | // Use XCTAssert and related functions to verify your tests produce the correct results. 32 | } 33 | 34 | func testLaunchPerformance() throws { 35 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { 36 | // This measures how long it takes to launch your application. 37 | measure(metrics: [XCTApplicationLaunchMetric()]) { 38 | XCUIApplication().launch() 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Apple TV 1st GenUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Apple-TV-Experiment 2 | A little experiment to recreate the Apple TV 1st Gen home-screen in SwiftUI. 3 | --------------------------------------------------------------------------------