From afa8cde4270688d9db7f4f17f29cd74325f8277d Mon Sep 17 00:00:00 2001 From: Wenyu Zhang Date: Tue, 9 Mar 2021 07:17:43 -0800 Subject: [PATCH 1/5] Delete Shrine demo project because it no longer reflects Material component's demo usage. PiperOrigin-RevId: 361803184 --- demos/README.md | 1 - demos/Shrine/.swiftlint.yml | 1 - demos/Shrine/Podfile | 8 - demos/Shrine/Shrine.xcodeproj/project.pbxproj | 419 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Shrine.xcscheme | 91 ---- .../contents.xcworkspacedata | 10 - demos/Shrine/Shrine/AppDelegate.swift | 37 -- .../AppIcon.appiconset/Contents.json | 98 ---- .../AppIcon.appiconset/logo2x.png | Bin 2194 -> 0 bytes .../AppIcon.appiconset/logo3x.png | Bin 3148 -> 0 bytes .../AppIcon.appiconset/logo_167.png | Bin 26480 -> 0 bytes .../AppIcon.appiconset/logo_76.png | Bin 18294 -> 0 bytes .../AppIcon.appiconset/logo_76_2x.png | Bin 24945 -> 0 bytes .../Shrine/Assets.xcassets/Contents.json | 6 - .../ShrineLaunchLogo.imageset/Contents.json | 12 - .../Shrine_logo_launchscreen.pdf | Bin 22898 -> 0 bytes .../ShrineLogo.imageset/Contents.json | 12 - .../shrine_logo_withicon.pdf | Bin 19910 -> 0 bytes .../ShrineTextLogo.imageset/Contents.json | 12 - .../shrine_text_logo.pdf | Bin 21608 -> 0 bytes .../Shrine/Base.lproj/LaunchScreen.storyboard | 39 -- demos/Shrine/Shrine/Info.plist | 49 -- .../Shrine/Resources/AbrilFatface-Regular.ttf | Bin 67364 -> 0 bytes demos/Shrine/Shrine/Resources/OFL.txt | 93 ---- demos/Shrine/Shrine/Resources/products.json | 100 ----- demos/Shrine/Shrine/Shrine-Bridging-Header.h | 15 - .../Shrine/ShrineCollectionViewCell.swift | 125 ------ .../ShrineCollectionViewController.swift | 142 ------ demos/Shrine/Shrine/ShrineData.swift | 63 --- .../Shrine/ShrineDetailViewController.swift | 164 ------- ...lexibleHeaderContainerViewController.swift | 45 -- .../Shrine/ShrineHeaderContentView.swift | 180 -------- demos/Shrine/Shrine/ShrineHeaderPage.swift | 95 ---- demos/Shrine/Shrine/ShrineInkOverlay.swift | 41 -- 35 files changed, 1865 deletions(-) delete mode 120000 demos/Shrine/.swiftlint.yml delete mode 100644 demos/Shrine/Podfile delete mode 100644 demos/Shrine/Shrine.xcodeproj/project.pbxproj delete mode 100644 demos/Shrine/Shrine.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 demos/Shrine/Shrine.xcodeproj/xcshareddata/xcschemes/Shrine.xcscheme delete mode 100644 demos/Shrine/Shrine.xcworkspace/contents.xcworkspacedata delete mode 100644 demos/Shrine/Shrine/AppDelegate.swift delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo2x.png delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo3x.png delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo_167.png delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo_76.png delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo_76_2x.png delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/Contents.json delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/ShrineLaunchLogo.imageset/Contents.json delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/ShrineLaunchLogo.imageset/Shrine_logo_launchscreen.pdf delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/ShrineLogo.imageset/Contents.json delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/ShrineLogo.imageset/shrine_logo_withicon.pdf delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/ShrineTextLogo.imageset/Contents.json delete mode 100644 demos/Shrine/Shrine/Assets.xcassets/ShrineTextLogo.imageset/shrine_text_logo.pdf delete mode 100644 demos/Shrine/Shrine/Base.lproj/LaunchScreen.storyboard delete mode 100644 demos/Shrine/Shrine/Info.plist delete mode 100644 demos/Shrine/Shrine/Resources/AbrilFatface-Regular.ttf delete mode 100644 demos/Shrine/Shrine/Resources/OFL.txt delete mode 100644 demos/Shrine/Shrine/Resources/products.json delete mode 100644 demos/Shrine/Shrine/Shrine-Bridging-Header.h delete mode 100644 demos/Shrine/Shrine/ShrineCollectionViewCell.swift delete mode 100644 demos/Shrine/Shrine/ShrineCollectionViewController.swift delete mode 100644 demos/Shrine/Shrine/ShrineData.swift delete mode 100644 demos/Shrine/Shrine/ShrineDetailViewController.swift delete mode 100644 demos/Shrine/Shrine/ShrineFlexibleHeaderContainerViewController.swift delete mode 100644 demos/Shrine/Shrine/ShrineHeaderContentView.swift delete mode 100644 demos/Shrine/Shrine/ShrineHeaderPage.swift delete mode 100644 demos/Shrine/Shrine/ShrineInkOverlay.swift diff --git a/demos/README.md b/demos/README.md index 7eb5b2f8cdb..1fbe0f8a313 100644 --- a/demos/README.md +++ b/demos/README.md @@ -2,7 +2,6 @@ The following demo apps can be found in this directory: -- [Shrine](Shrine/) - a demo shopping app, incorporating a flexible header, custom typography, and collections - [Bare](Bare/) - a skeleton example app used to measure the size of Material Components for iOS ## Trying out Material Components diff --git a/demos/Shrine/.swiftlint.yml b/demos/Shrine/.swiftlint.yml deleted file mode 120000 index e5c8a05550f..00000000000 --- a/demos/Shrine/.swiftlint.yml +++ /dev/null @@ -1 +0,0 @@ -../../.swiftlint.yml \ No newline at end of file diff --git a/demos/Shrine/Podfile b/demos/Shrine/Podfile deleted file mode 100644 index 9c0863bc126..00000000000 --- a/demos/Shrine/Podfile +++ /dev/null @@ -1,8 +0,0 @@ -platform :ios, "10.0" -use_frameworks! - -target 'Shrine' do - pod 'MaterialComponents/AppBar', :path => '../../' - pod 'MaterialComponents/PageControl', :path => '../../' - pod 'RemoteImageServiceForMDCDemos', :path => '../supplemental' -end diff --git a/demos/Shrine/Shrine.xcodeproj/project.pbxproj b/demos/Shrine/Shrine.xcodeproj/project.pbxproj deleted file mode 100644 index 51dcba8c602..00000000000 --- a/demos/Shrine/Shrine.xcodeproj/project.pbxproj +++ /dev/null @@ -1,419 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 6B0C01BA37AC5D6B39F49F16 /* Pods_Shrine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E79DB3BB3A6DCA8E56C685D /* Pods_Shrine.framework */; }; - CBAF7A311E1577380022A08F /* ShrineHeaderPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAF7A301E1577380022A08F /* ShrineHeaderPage.swift */; }; - DE064E731C83D20E00B17776 /* ShrineFlexibleHeaderContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE064E721C83D20E00B17776 /* ShrineFlexibleHeaderContainerViewController.swift */; }; - DE34DEBB1C88E90000E04B65 /* ShrineInkOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE34DEBA1C88E90000E04B65 /* ShrineInkOverlay.swift */; }; - DE34DEBF1C8A34B100E04B65 /* ShrineHeaderContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE34DEBE1C8A34B100E04B65 /* ShrineHeaderContentView.swift */; }; - DE3CFD831C84FE0B006BACA7 /* products.json in Resources */ = {isa = PBXBuildFile; fileRef = DE3CFD821C84FE0B006BACA7 /* products.json */; }; - DE3CFD851C873A07006BACA7 /* ShrineDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE3CFD841C873A07006BACA7 /* ShrineDetailViewController.swift */; }; - DE5D2A481C81068100C9C650 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE5D2A471C81068100C9C650 /* AppDelegate.swift */; }; - DE5D2A4F1C81068100C9C650 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DE5D2A4E1C81068100C9C650 /* Assets.xcassets */; }; - DE5D2A521C81068100C9C650 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DE5D2A501C81068100C9C650 /* LaunchScreen.storyboard */; }; - DE5D2A5A1C81092D00C9C650 /* ShrineCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE5D2A591C81092D00C9C650 /* ShrineCollectionViewCell.swift */; }; - DE5D2A5C1C810E6600C9C650 /* ShrineCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE5D2A5B1C810E6600C9C650 /* ShrineCollectionViewController.swift */; }; - DE6887EA1C849C7C0074A8C5 /* AbrilFatface-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = DE6887E91C849C7C0074A8C5 /* AbrilFatface-Regular.ttf */; }; - DE6887F31C84FCD40074A8C5 /* ShrineData.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6887F21C84FCD40074A8C5 /* ShrineData.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 1C7F50E40E35B48C29C884F8 /* Pods-Shrine.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Shrine.release.xcconfig"; path = "Pods/Target Support Files/Pods-Shrine/Pods-Shrine.release.xcconfig"; sourceTree = ""; }; - 2E79DB3BB3A6DCA8E56C685D /* Pods_Shrine.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Shrine.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3D22DA7C0F576B707C1CA5BE /* Pods-Shrine.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Shrine.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Shrine/Pods-Shrine.debug.xcconfig"; sourceTree = ""; }; - CBAF7A301E1577380022A08F /* ShrineHeaderPage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShrineHeaderPage.swift; sourceTree = ""; }; - DE064E721C83D20E00B17776 /* ShrineFlexibleHeaderContainerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShrineFlexibleHeaderContainerViewController.swift; sourceTree = ""; }; - DE34DEBA1C88E90000E04B65 /* ShrineInkOverlay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShrineInkOverlay.swift; sourceTree = ""; }; - DE34DEBE1C8A34B100E04B65 /* ShrineHeaderContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShrineHeaderContentView.swift; sourceTree = ""; }; - DE3CFD821C84FE0B006BACA7 /* products.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = products.json; path = Shrine/Resources/products.json; sourceTree = ""; }; - DE3CFD841C873A07006BACA7 /* ShrineDetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShrineDetailViewController.swift; sourceTree = ""; }; - DE5D2A441C81068100C9C650 /* Shrine.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Shrine.app; sourceTree = BUILT_PRODUCTS_DIR; }; - DE5D2A471C81068100C9C650 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - DE5D2A4E1C81068100C9C650 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - DE5D2A511C81068100C9C650 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - DE5D2A531C81068100C9C650 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DE5D2A591C81092D00C9C650 /* ShrineCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShrineCollectionViewCell.swift; sourceTree = ""; }; - DE5D2A5B1C810E6600C9C650 /* ShrineCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShrineCollectionViewController.swift; sourceTree = ""; }; - DE6887E91C849C7C0074A8C5 /* AbrilFatface-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "AbrilFatface-Regular.ttf"; path = "Shrine/Resources/AbrilFatface-Regular.ttf"; sourceTree = ""; }; - DE6887EE1C849F7E0074A8C5 /* Shrine-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Shrine-Bridging-Header.h"; sourceTree = ""; }; - DE6887F21C84FCD40074A8C5 /* ShrineData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShrineData.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - DE5D2A411C81068100C9C650 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6B0C01BA37AC5D6B39F49F16 /* Pods_Shrine.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 642D1F1EA5C73400CE64F5A2 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 2E79DB3BB3A6DCA8E56C685D /* Pods_Shrine.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 7DA6FBA546AC6B885D4CA01F /* Pods */ = { - isa = PBXGroup; - children = ( - 3D22DA7C0F576B707C1CA5BE /* Pods-Shrine.debug.xcconfig */, - 1C7F50E40E35B48C29C884F8 /* Pods-Shrine.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - DE5D2A3B1C81068100C9C650 = { - isa = PBXGroup; - children = ( - DE5D2A461C81068100C9C650 /* Shrine */, - DE5D2A451C81068100C9C650 /* Products */, - DE6887E81C849C6C0074A8C5 /* Resources */, - 7DA6FBA546AC6B885D4CA01F /* Pods */, - 642D1F1EA5C73400CE64F5A2 /* Frameworks */, - ); - sourceTree = ""; - }; - DE5D2A451C81068100C9C650 /* Products */ = { - isa = PBXGroup; - children = ( - DE5D2A441C81068100C9C650 /* Shrine.app */, - ); - name = Products; - sourceTree = ""; - }; - DE5D2A461C81068100C9C650 /* Shrine */ = { - isa = PBXGroup; - children = ( - DE5D2A471C81068100C9C650 /* AppDelegate.swift */, - DE5D2A4E1C81068100C9C650 /* Assets.xcassets */, - DE5D2A531C81068100C9C650 /* Info.plist */, - DE5D2A501C81068100C9C650 /* LaunchScreen.storyboard */, - DE6887EE1C849F7E0074A8C5 /* Shrine-Bridging-Header.h */, - DE5D2A591C81092D00C9C650 /* ShrineCollectionViewCell.swift */, - DE5D2A5B1C810E6600C9C650 /* ShrineCollectionViewController.swift */, - DE6887F21C84FCD40074A8C5 /* ShrineData.swift */, - DE3CFD841C873A07006BACA7 /* ShrineDetailViewController.swift */, - DE064E721C83D20E00B17776 /* ShrineFlexibleHeaderContainerViewController.swift */, - DE34DEBE1C8A34B100E04B65 /* ShrineHeaderContentView.swift */, - DE34DEBA1C88E90000E04B65 /* ShrineInkOverlay.swift */, - CBAF7A301E1577380022A08F /* ShrineHeaderPage.swift */, - ); - path = Shrine; - sourceTree = ""; - }; - DE6887E81C849C6C0074A8C5 /* Resources */ = { - isa = PBXGroup; - children = ( - DE6887E91C849C7C0074A8C5 /* AbrilFatface-Regular.ttf */, - DE3CFD821C84FE0B006BACA7 /* products.json */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - DE5D2A431C81068100C9C650 /* Shrine */ = { - isa = PBXNativeTarget; - buildConfigurationList = DE5D2A561C81068100C9C650 /* Build configuration list for PBXNativeTarget "Shrine" */; - buildPhases = ( - BD04A4A94E7A074ACE45ED21 /* [CP] Check Pods Manifest.lock */, - DE5D2A401C81068100C9C650 /* Sources */, - DE5D2A411C81068100C9C650 /* Frameworks */, - DE5D2A421C81068100C9C650 /* Resources */, - D1F846F8DE8314F37D7BCFC1 /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Shrine; - productName = Shrine; - productReference = DE5D2A441C81068100C9C650 /* Shrine.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - DE5D2A3C1C81068100C9C650 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0800; - ORGANIZATIONNAME = "Junius Gunaratne"; - TargetAttributes = { - DE5D2A431C81068100C9C650 = { - CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 1010; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = DE5D2A3F1C81068100C9C650 /* Build configuration list for PBXProject "Shrine" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = DE5D2A3B1C81068100C9C650; - productRefGroup = DE5D2A451C81068100C9C650 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - DE5D2A431C81068100C9C650 /* Shrine */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - DE5D2A421C81068100C9C650 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DE3CFD831C84FE0B006BACA7 /* products.json in Resources */, - DE5D2A521C81068100C9C650 /* LaunchScreen.storyboard in Resources */, - DE5D2A4F1C81068100C9C650 /* Assets.xcassets in Resources */, - DE6887EA1C849C7C0074A8C5 /* AbrilFatface-Regular.ttf in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - BD04A4A94E7A074ACE45ED21 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Shrine-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - D1F846F8DE8314F37D7BCFC1 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Shrine/Pods-Shrine-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/MDFInternationalization/MDFInternationalization.framework", - "${BUILT_PRODUCTS_DIR}/MDFTextAccessibility/MDFTextAccessibility.framework", - "${BUILT_PRODUCTS_DIR}/MaterialComponents/MaterialComponents.framework", - "${BUILT_PRODUCTS_DIR}/RemoteImageServiceForMDCDemos/RemoteImageServiceForMDCDemos.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MDFInternationalization.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MDFTextAccessibility.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MaterialComponents.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RemoteImageServiceForMDCDemos.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Shrine/Pods-Shrine-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - DE5D2A401C81068100C9C650 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DE3CFD851C873A07006BACA7 /* ShrineDetailViewController.swift in Sources */, - DE5D2A5A1C81092D00C9C650 /* ShrineCollectionViewCell.swift in Sources */, - DE5D2A481C81068100C9C650 /* AppDelegate.swift in Sources */, - DE5D2A5C1C810E6600C9C650 /* ShrineCollectionViewController.swift in Sources */, - DE34DEBF1C8A34B100E04B65 /* ShrineHeaderContentView.swift in Sources */, - CBAF7A311E1577380022A08F /* ShrineHeaderPage.swift in Sources */, - DE064E731C83D20E00B17776 /* ShrineFlexibleHeaderContainerViewController.swift in Sources */, - DE6887F31C84FCD40074A8C5 /* ShrineData.swift in Sources */, - DE34DEBB1C88E90000E04B65 /* ShrineInkOverlay.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - DE5D2A501C81068100C9C650 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - DE5D2A511C81068100C9C650 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - DE5D2A541C81068100C9C650 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - DE5D2A551C81068100C9C650 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - DE5D2A571C81068100C9C650 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3D22DA7C0F576B707C1CA5BE /* Pods-Shrine.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = Shrine/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = google.com.Shrine; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Shrine/Shrine-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; - }; - name = Debug; - }; - DE5D2A581C81068100C9C650 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1C7F50E40E35B48C29C884F8 /* Pods-Shrine.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = Shrine/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = google.com.Shrine; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Shrine/Shrine-Bridging-Header.h"; - SWIFT_VERSION = 4.2; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - DE5D2A3F1C81068100C9C650 /* Build configuration list for PBXProject "Shrine" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DE5D2A541C81068100C9C650 /* Debug */, - DE5D2A551C81068100C9C650 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DE5D2A561C81068100C9C650 /* Build configuration list for PBXNativeTarget "Shrine" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DE5D2A571C81068100C9C650 /* Debug */, - DE5D2A581C81068100C9C650 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = DE5D2A3C1C81068100C9C650 /* Project object */; -} diff --git a/demos/Shrine/Shrine.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/demos/Shrine/Shrine.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 964895fa9db..00000000000 --- a/demos/Shrine/Shrine.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/demos/Shrine/Shrine.xcodeproj/xcshareddata/xcschemes/Shrine.xcscheme b/demos/Shrine/Shrine.xcodeproj/xcshareddata/xcschemes/Shrine.xcscheme deleted file mode 100644 index b3d4345a236..00000000000 --- a/demos/Shrine/Shrine.xcodeproj/xcshareddata/xcschemes/Shrine.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/Shrine/Shrine.xcworkspace/contents.xcworkspacedata b/demos/Shrine/Shrine.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 2cd146d4c0d..00000000000 --- a/demos/Shrine/Shrine.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/demos/Shrine/Shrine/AppDelegate.swift b/demos/Shrine/Shrine/AppDelegate.swift deleted file mode 100644 index 5b141797897..00000000000 --- a/demos/Shrine/Shrine/AppDelegate.swift +++ /dev/null @@ -1,37 +0,0 @@ -/* - Copyright 2016-present the Material Components for iOS authors. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -import UIKit -import MaterialComponents.MaterialIcons_ic_arrow_back - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - func application(_ application: UIApplication, didFinishLaunchingWithOptions - launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - window = UIWindow(frame: UIScreen.main.bounds) - let flexHeadVC = ShrineFlexibleHeaderContainerViewController() - window?.rootViewController = flexHeadVC - window?.makeKeyAndVisible() - - MDCIcons.ic_arrow_backUseNewStyle(true) - - return true - } - -} diff --git a/demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/Contents.json b/demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index e21c8528d8d..00000000000 --- a/demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "logo2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "logo3x.png", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "logo_76.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "logo_76_2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "logo_167.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo2x.png b/demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo2x.png deleted file mode 100644 index c72c0c58d91299884685c35d0cf1d4e81c8d1e6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2194 zcmV;D2yOR?P)3Iw%24Y+Z-2V{Rp@s)6?$_PPGfZDwamx$Lk~W%xw3Tj%)`A38bo7Ya(3tbU-$}~ z%=E-F?2(}ZnwxswOKYJ8q%X8+P|79xcV=H=G<9X^2IULwl&!(fuTH&S+Zr5|0=g6s zMpNlEnra{5K+y2IZBroe$YsClEi`AlHNG|;q^O~DVK zKY+V@aqWi<_|K{n;HVnvZ^MD%v4wLWMQG80kzNYl@KbHnNAnS?hz8Zr&*tC2pP?s~ zs%=vAQ<)g~A2D?5&;n9~77ZMj*lVmhwIUkyuM`0>AN6ZLZD0%K_@Ipk5|AQ-Xdo%* zl2$TZDH^nR0)o0R+~39*Lkma|K{T+&Mh?%U>qu`94O+GW0v`tco2jFYKB#~c5kx}~ zL|rItMZ-lvZf|X4vp5>`H}WnZMFi2Hu@GNe|7F`nG}r>NN{pTUx8Ve&h$9+$r*6Pu zC>jg_ftIl=j6XeC`ELRVND)UgbeV=7*C#vgnKZ=^koB!?y0}rdz!XA2ia4S{ zPY?Uc^6K|4O)&%n-x2fy46R;Rx9y4X=@KrSHktvC8+Xv=;N&dAEqgcofBLy+ZAT3BWjNY$K(M!Q zi^!s(cWR{UE*cF2(lro<77$L4hIhL8&3CO6TvuP8vz@LvJ^F-GZn3sKIiQ1HXwnna z5Z`@D2dL`kOy|%oT^fAy@pFvB-T8AD2M5eiXCFBo0t)yIbkL~UE{#AxqnrAM#kqi{ zoM+zpc=2GW*Lq>Ia6;~!TR-e>e^rjG_F=q{my zBXrvVh?e&D)^?y_j!PWofl#0Pari`#)K1SpiC75Mks?6-G}CVR9!$HEF{?mLL98P1n6kJQJ!(}gsI;<0FF zWK1Er*HeyQ7rW)UObXVW?rSiX0!(%h*(uy55MEwb#9s$fRJoZO4|HpPS(2_L+Fsm` zn;mt#hnwwT~kM@Ix5`C4br@nAfFR`xaUdJMy&+jo__hz|K}lcyWdk*N&w z{G5N#?rsl3tot*001L;5t!{Ynb3s5mx;+G;>>_%Z23s}P%7pfFp+LL1J>G?;hQ<#1 zqxr!1=;uO#c5!>&BO<&zdYCEWdz1Y7xqzTu+@9ZvNOfbl-*hJQ>*vCPX1hJV5s?uH zz5BV~pm}c3Z$w1hm@r%42;t{~gJ!!uUl9@B5yfZ7OgBRKxfq~%ZqHXl#MEOL2m|@K zNT3;R&sRjm)MF9|!}+;Lpm}c3JtA5K!k~UG9%zQ!bB~BL?{w9TpnfhYXj`}E9uYC` zbPa@|{akF&R&LKRBAN%n2!1X$Xj`}E5)sV4&|?R9DWTw>6=+tVMi#)ybr17UnWmmak4 z_Vjg83d>|l#4E$;EzoKGTo#}ex2NAuOe11flSdy$rTdLkel82pWzV9~9Is-ojEIKz zS$EJ0{ah}fTSxB()NkRV5wV#yK4XPGcqO@?%LueG`zvnGJR;TwLNId){ajw4mGf8J zo=HTc&%vSs4IP<2;W56S%L}wJq7}Di5)p5aOGarR1Zhs|=duH>%u&?snMB0Ohf&dI zU#0SMIf7PP7j=8h5s}_|jDfJci$A%a%Mo;g+iQ-9dLUHR1rz$YOhMPVJu18Ult`aW zT#5`(&cx5<3%b(n(Y+GIEy|Ix2#`CDebsYbaFJKqY0$NHy3upl?2n4i%mJ-kcT0lz)XaOx{UH=I%0I(R% UN!0flBme*a07*qoM6N<$f|mCgzyJUM diff --git a/demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo3x.png b/demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo3x.png deleted file mode 100644 index 01a53b68a9d69307f4305e696423e096c614f07a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3148 zcmbW4SvVWo+Q+F`%wlMg8cN!Tp_FP&HA@pS5sI``n;2^rGn*2#D(RrKK~-pF*Ob~) zDuz;a)s)(zLfUE_Q)oA}4eiPPF20-doSSp8*84uc^?%m;u8Z}5)+%swK}w2)#QFI6 zBvBXbJb1C=pCNjTH@E#(9>fdBtYgNlc(Bl}fvQHfveNhbZpXqZgizaFZcyV**JIDGr^hu$Yhk4a|0Pi?wAwtDsbAt`nwtE&1Q z>E1vSHZv({hwf(!WtLg~jJ>|uHiEXb9^kX)zoZq-=kHfN-x){j3%LGlx?M?$+LS4! zF~1x6*5KKmbam(BmnDaFR>E8A*N0#*-?QYamk&}_ZKV`-qpiSx)%Q{pzZrI%5$C!e z)RDT<%zu>r0jVM-5mp@m=Vg7&_gC`|%0A%;T=3%9mpE^oXSV?&5GA89i3e?4-W^D1 zT#{N~%x9gp%CYCOOG+DSby4}I)2W_U#2}KVw-1KdrUoe?1Ewucw_8QEF|QR5m0A?_ z?N*++0|XTk-jb8@9tD z+n>CouEtAQ4mR3)Ti>KJ;Tns1alC^``ss|J3ic!lcJMnEL5SR>S=1B z6XN0zyZS=2K1uX+z8{1hhm>SrGwpdn8gh5r8x-o4j2s?C``=ibA=*}OsMoh;b7NY# zzJ=wL7E>TjB$Dp}S=&z~fxu>_4FgtH*QRiX5}hPk7)m1;bZq%@vTfRYM;g~v*&7Sg zYlV*Hh(p1lO7Skc08F-AukY?vBfppeL1aF8#&I4F_Y!f4vKI4idG-JJt_z~5je<3F zbF;yYL6zTl`d{mlg~3iW(f)V@$^OveTgnK@`_M0i>>}UIOY_8xYQi#}EUOd;!}Qjp zZ;BRbskqg9V6C@(TCj|e>mT|7A|&z*Q<)SCK+iL6a>|L1HGxVF2vMP-_|LTzqik{q zPFKzu1=TB#o)9nm*WNp%Wfj?oianxQdzxoYrVZu-q++cN5=Jke$Gw-il=$Dbd zkM_?$AH{zbJ>RPJ0lPUc5^2~41IZP`ud{}Ds2%j2Vw0ebILmDH*iCZNsbsc}-93CX@z&vR5=?Oo}TaWxosnk%;&5H^C zNDF+=J_m)QjT=W|MuEls6xliY;~P25xl_exlWg}bYCcz#ea_$?K>!A=QhY2D^+LPZ z=q)LzyD0SAgIVFsgO%|e(F|$!&^HmbX4=AC!gSEA$zFBjEebFcoupr=qNy-V59SxC zXm^$)O$pau^=B$yU=redVZ9llfoyn^#8q)coZY6*F%0Zd-WUgCnuY5#9@xz5R77Z&Yd|{2 zjeRko-l&A@>~ly&NKIr11t@8B@O@7Qk7X-(Ro$4G!AU=?wt_F+k#NXIqq5y2J<_6L z^lEKix5iOxk%>Ai^_%NFX~SNjHao>9!==;Fw(_8^|;Wl#Rm6OLaJCD2AD*lHe% zT#@}{E{-mUB)5AJDgi$wZhRLwGUedRgn0y7hCWhRnN{GjED%oP?;0e@4_@x8#jjf} zGPWxsaof~|oPkdf?spRJpo9E^~v@fDlV6|$?&NQt(gk@YN(5t!d}|82E3Ud^bz!p6DP!| zO`xr6EMp!CJM;gQYy>t{+_%{=xuM72IUH<~IEf3+k-76y&YPB_7kf2<&L)6_V&rHMtDKPz$BWugBMr)XO}#?Q#!hXR|0DmDIop* zDrOC5SoZor80m*Es{4cH-ju4(3gxoo5iC}zZOtK zY09ihKW8(-qRu1!OA{!HqLw&I-<6j_;@4zJb!8L^g8~m&*r6WX7?_-+m7qCMOuy`n zfvCow@F-4n3@x(W;~?;N%=~*^J9vbDb>tJuOj}gKnV#^soRD~0OP$Bq5bbix?1O>H zm57CU4@Z5LH zX7jHo7;y0}o31EG9GWwBXb98y%_isqN`GFsoQO@J(Gz>~O-GlMYtzYB#MqrW2)Mml z&Bl8F^V<|m$$9Z@>JWopsG?~#!X2z!jCR-WPG7ri!@KFlwCBOPD~d!{7azTLMv7&3 zT+e=HhncZc&B%BbW`|h|oHfadcRjN9LNA@0v=-Fslbz|4>>Uc`y_rV}|Ho%@&dzUq0(_oqV0#M9m%{rV@S*Ho K?5H+Zv;PgJ&DmZ6 diff --git a/demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo_167.png b/demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo_167.png deleted file mode 100644 index 8843740fbcb61db33605ae5e72ba6339a9155c1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26480 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 diff --git a/demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo_76_2x.png b/demos/Shrine/Shrine/Assets.xcassets/AppIcon.appiconset/logo_76_2x.png deleted file mode 100644 index d36c2e41e74fe48c7241354c01f46967f0708b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24945 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 diff --git a/demos/Shrine/Shrine/Assets.xcassets/ShrineLogo.imageset/Contents.json b/demos/Shrine/Shrine/Assets.xcassets/ShrineLogo.imageset/Contents.json deleted file mode 100644 index 2d8fc3618c2..00000000000 --- a/demos/Shrine/Shrine/Assets.xcassets/ShrineLogo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "shrine_logo_withicon.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/demos/Shrine/Shrine/Assets.xcassets/ShrineLogo.imageset/shrine_logo_withicon.pdf b/demos/Shrine/Shrine/Assets.xcassets/ShrineLogo.imageset/shrine_logo_withicon.pdf deleted file mode 100644 index a16bedec7dd26d0353c6acf1731b44c6427969db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19910 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 diff --git a/demos/Shrine/Shrine/Assets.xcassets/ShrineTextLogo.imageset/Contents.json b/demos/Shrine/Shrine/Assets.xcassets/ShrineTextLogo.imageset/Contents.json deleted file mode 100644 index 35488c87ac4..00000000000 --- a/demos/Shrine/Shrine/Assets.xcassets/ShrineTextLogo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "shrine_text_logo.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/demos/Shrine/Shrine/Assets.xcassets/ShrineTextLogo.imageset/shrine_text_logo.pdf b/demos/Shrine/Shrine/Assets.xcassets/ShrineTextLogo.imageset/shrine_text_logo.pdf deleted file mode 100644 index 4842ea21dd99e7fc4d527eb2ffa71b0ac0a1513e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21608 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 diff --git a/demos/Shrine/Shrine/Base.lproj/LaunchScreen.storyboard b/demos/Shrine/Shrine/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 2c00847056b..00000000000 --- a/demos/Shrine/Shrine/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/Shrine/Shrine/Info.plist b/demos/Shrine/Shrine/Info.plist deleted file mode 100644 index 330b85aa31f..00000000000 --- a/demos/Shrine/Shrine/Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - com.google.mdc-shrine - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UIAppFonts - - AbrilFatface-Regular.ttf - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/demos/Shrine/Shrine/Resources/AbrilFatface-Regular.ttf b/demos/Shrine/Shrine/Resources/AbrilFatface-Regular.ttf deleted file mode 100644 index e761f7b9c3c77290511fd87c296c8a3077d5db44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67364 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 pk(n;pt-Ffdx_`%8RNv$HYxO?+Za4iq_TAp2` Int { - return 1 - } - - override func collectionView(_ collectionView: UICollectionView, - numberOfItemsInSection section: Int) -> Int { - return self.shrineData.titles.count - } - - override func collectionView(_ collectionView: UICollectionView, - cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ShrineCollectionViewCell", - for: indexPath) as! ShrineCollectionViewCell - let itemNum: NSInteger = (indexPath as NSIndexPath).row - - let title = self.shrineData.titles[itemNum] as! String - let imageName = self.shrineData.imageNames[itemNum] as! String - let avatar = self.shrineData.avatars[itemNum] as! String - let shopTitle = self.shrineData.shopTitles[itemNum] as! String - let price = self.shrineData.prices[itemNum] as! String - cell.populateCell(title, imageName:imageName, avatar:avatar, shopTitle:shopTitle, price:price) - - return cell - } - - func collectionView(_ collectionView: UICollectionView, - layout collectionViewLayout: UICollectionViewLayout, - sizeForItemAt indexPath: IndexPath) -> CGSize { - var safeAreaInset: CGFloat = 20 - if #available(iOS 11.0, *) { - safeAreaInset += self.view.safeAreaInsets.left + self.view.safeAreaInsets.right - } - let cellWidth = floor((self.view.frame.size.width - 10 - safeAreaInset) / 2) - let cellHeight = cellWidth * 1.2 - return CGSize(width: cellWidth, height: cellHeight) - } - - override func collectionView(_ collectionView: UICollectionView, - didSelectItemAt indexPath: IndexPath) { - let itemNum: NSInteger = (indexPath as NSIndexPath).row - - let detailVC = ShrineDetailViewController() - detailVC.productTitle = self.shrineData.titles[itemNum] as! String - detailVC.desc = self.shrineData.descriptions[itemNum] as! String - detailVC.imageName = self.shrineData.imageNames[itemNum] as! String - - self.present(detailVC, animated: true, completion: nil) - } - - override func scrollViewDidScroll(_ scrollView: UIScrollView) { - headerViewController.scrollViewDidScroll(scrollView) - let scrollOffsetY = scrollView.contentOffset.y - let duration = 0.5 - var opacity: CGFloat = 1.0 - var logoTextImageViewOpacity: CGFloat = 0 - if scrollOffsetY > -240 { - opacity = 0 - logoTextImageViewOpacity = 1 - } - UIView.animate(withDuration: duration, animations: { - self.headerContentView.scrollView.alpha = opacity - self.headerContentView.pageControl.alpha = opacity - self.headerContentView.logoImageView.alpha = opacity - self.headerContentView.logoTextImageView.alpha = logoTextImageViewOpacity - }) - - } - - func sizeHeaderView() { - let headerView = headerViewController.headerView - let bounds = UIScreen.main.bounds - if bounds.size.width < bounds.size.height { - headerView.maximumHeight = 440 - } else { - headerView.maximumHeight = 72 - } - headerView.minimumHeight = 72 - } - - override func willAnimateRotation(to toInterfaceOrientation: UIInterfaceOrientation, - duration: TimeInterval) { - sizeHeaderView() - collectionView?.collectionViewLayout.invalidateLayout() - } - - override func viewWillAppear(_ animated: Bool) { - sizeHeaderView() - collectionView?.collectionViewLayout.invalidateLayout() - } - - func setupHeaderView() { - let headerView = headerViewController.headerView - headerView.trackingScrollView = collectionView - headerView.maximumHeight = 440 - headerView.minimumHeight = 72 - headerView.minMaxHeightIncludesSafeArea = false - headerView.backgroundColor = UIColor.white - headerView.autoresizingMask = [.flexibleWidth, .flexibleHeight] - headerContentView.frame = (headerView.bounds) - headerContentView.autoresizingMask = [.flexibleWidth, .flexibleHeight] - headerView.addSubview(headerContentView) - } - -} diff --git a/demos/Shrine/Shrine/ShrineData.swift b/demos/Shrine/Shrine/ShrineData.swift deleted file mode 100644 index d74812be505..00000000000 --- a/demos/Shrine/Shrine/ShrineData.swift +++ /dev/null @@ -1,63 +0,0 @@ -/* - Copyright 2016-present the Material Components for iOS authors. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -import UIKit - -class ShrineData { - - var imageNames = NSMutableArray() - var titles = NSMutableArray() - var descriptions = NSMutableArray() - var prices = NSMutableArray() - var avatars = NSMutableArray() - var shopTitles = NSMutableArray() - static var baseURL = "https://www.gstatic.com/angular/material-adaptive/shrine/" - - func readJSON() { - - let filePath = Bundle.main.path(forResource: "products", ofType: "json") - var json: NSDictionary! - do { - let data = try? Data(contentsOf: URL(fileURLWithPath: filePath!)) - let options = JSONSerialization.ReadingOptions() - json = try JSONSerialization.jsonObject(with: data!, options: options) as? NSDictionary - } catch _ { - print("Couldn't get JSON data") - } - - let products = json["products"] as! NSArray - for prod in products { - let product = prod as! NSDictionary - let imageName = product["image"] as! String - imageNames.add(imageName) - let title = product["title"] as! String - titles.add(title) - let description = product["description"] as! String - descriptions.add(description) - let price = product["price"] as! String - prices.add(price) - } - - let shops = json["shops"] as! NSArray - for shp in shops { - let shop = shp as! NSDictionary - let avatar = shop["avatar"] as! String - avatars.add(avatar) - let shopTitle = shop["shop"] as! String - shopTitles.add(shopTitle) - } - } -} diff --git a/demos/Shrine/Shrine/ShrineDetailViewController.swift b/demos/Shrine/Shrine/ShrineDetailViewController.swift deleted file mode 100644 index 8a1417b5e32..00000000000 --- a/demos/Shrine/Shrine/ShrineDetailViewController.swift +++ /dev/null @@ -1,164 +0,0 @@ -/* - Copyright 2016-present the Material Components for iOS authors. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -import UIKit -import MaterialComponents.MaterialAppBar -import MaterialComponents.MaterialButtons -import MaterialComponents.MaterialIcons_ic_arrow_back -import RemoteImageServiceForMDCDemos - -class ShrineDetailView: UIScrollView { - - var title = "" - var desc = "" - var imageName = "popsicle.png" - fileprivate var remoteImageService = RemoteImageService() - fileprivate var label = UILabel() - fileprivate var labelDesc = UILabel() - fileprivate var imageView = UIImageView() - - override func layoutSubviews() { - super.layoutSubviews() - backgroundColor = .white - let minContentHeight = CGFloat(640) - contentSize = CGSize(width: frame.width, height: minContentHeight) - - let labelPadding: CGFloat = 50 - imageView.frame = CGRect(x: labelPadding, y: labelPadding, - width: frame.size.width - 2 * labelPadding, height: 220) - imageView.contentMode = UIView.ContentMode.scaleAspectFit - imageView.autoresizingMask = .flexibleHeight - addSubview(imageView) - let urlString: String = ShrineData.baseURL + imageName - let url = URL(string: urlString) - remoteImageService.fetchImageAndThumbnail(from: url) { (image: UIImage?, _) -> Void in - DispatchQueue.main.async(execute: { - self.imageView.image = image - self.imageView.setNeedsDisplay() - }) - } - - configureTitleLabel(label: label, labelPadding: labelPadding) - self.addSubview(label) - - configureDescriptionLabel(label: labelDesc, labelPadding: labelPadding) - self.addSubview(labelDesc) - } - - // MARK: Private - - func configureTitleLabel(label: UILabel, labelPadding: CGFloat) { - label.font = UIFont(name: "AbrilFatface-Regular", size: 36) - label.textColor = UIColor(red: 0.039, green: 0.192, blue: 0.259, alpha: 1) - label.lineBreakMode = .byWordWrapping - label.numberOfLines = 2 - - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.lineHeightMultiple = 0.8 - let attrString = NSMutableAttributedString(string: title) - attrString.addAttribute(NSAttributedString.Key.paragraphStyle, - value:paragraphStyle, - range: NSRange(location: 0, length:attrString.length)) - label.attributedText = attrString - label.sizeToFit() - label.frame = CGRect(x: labelPadding, - y: 280, width: label.frame.size.width, height: label.frame.size.height) - label.autoresizingMask = [.flexibleWidth, .flexibleHeight] - } - - func configureDescriptionLabel(label: UILabel, labelPadding: CGFloat) { - label.lineBreakMode = .byWordWrapping - label.numberOfLines = 5 - label.font = UIFont(name: "Helvetica", size: 14) - label.textColor = UIColor(white: 0.54, alpha: 1) - let descParagraphStyle = NSMutableParagraphStyle() - descParagraphStyle.lineHeightMultiple = 1.5 - let descAttrString = NSMutableAttributedString(string: desc) - descAttrString.addAttribute(NSAttributedString.Key.paragraphStyle, - value:descParagraphStyle, - range:NSRange(location: 0, length: descAttrString.length)) - label.attributedText = descAttrString - label.frame = CGRect(x: labelPadding, - y: 360, width: self.frame.size.width - 2 * labelPadding, height: 160) - label.sizeToFit() - label.autoresizingMask = [.flexibleWidth, .flexibleHeight] - } -} - -class ShrineDetailViewController: UIViewController { - - let fabPadding: CGFloat = 25 - var productTitle = "" - var desc = "" - var imageName = "popsicle.png" - fileprivate let appBar = MDCAppBar() - fileprivate let floatingButton = MDCFloatingButton() - - init() { - super.init(nibName: nil, bundle: nil) - - addChild(appBar.headerViewController) - appBar.headerViewController.headerView.backgroundColor = .clear - appBar.navigationBar.tintColor = .black - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - } - - override func viewDidLoad() { - let detailView = ShrineDetailView(frame: view.frame) - detailView.title = productTitle - detailView.desc = desc - detailView.imageName = imageName - detailView.autoresizingMask = [.flexibleWidth, .flexibleHeight] - view.addSubview(detailView) - - appBar.addSubviewsToParent() - let backButton = UIBarButtonItem(title:"", - style:.done, - target:self, - action:#selector(dismissDetails)) - let backImage = MDCIcons.imageFor_ic_arrow_back() - backButton.image = backImage - appBar.navigationBar.leftBarButtonItem = backButton - - floatingButton.setTitle("+", for: UIControl.State()) - floatingButton.backgroundColor = - UIColor(red: 0.086, green: 0.941, blue: 0.941, alpha: 1) - floatingButton.sizeToFit() - view.addSubview(floatingButton) - } - - override func viewWillLayoutSubviews() { - var safeAreaInset: CGFloat = 0 - #if swift(>=3.2) - if #available(iOS 11.0, *) { - safeAreaInset = self.view.safeAreaInsets.bottom - } - #endif - let updatedFabPadding = max(fabPadding, safeAreaInset) - floatingButton.frame = CGRect(x: view.frame.width - floatingButton.frame.width - updatedFabPadding, - y: view.frame.height - floatingButton.frame.height - updatedFabPadding, - width: floatingButton.frame.width, - height: floatingButton.frame.height) - } - - @objc func dismissDetails() { - dismiss(animated: true, completion: nil) - } - -} diff --git a/demos/Shrine/Shrine/ShrineFlexibleHeaderContainerViewController.swift b/demos/Shrine/Shrine/ShrineFlexibleHeaderContainerViewController.swift deleted file mode 100644 index f0bdc7f7e40..00000000000 --- a/demos/Shrine/Shrine/ShrineFlexibleHeaderContainerViewController.swift +++ /dev/null @@ -1,45 +0,0 @@ -/* - Copyright 2016-present the Material Components for iOS authors. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -import UIKit -import MaterialComponents.MaterialFlexibleHeader - -class ShrineFlexibleHeaderContainerViewController: MDCFlexibleHeaderContainerViewController { - - init() { - let layout = UICollectionViewFlowLayout() - let sectionInset: CGFloat = 10.0 - layout.sectionInset = UIEdgeInsets(top: sectionInset, - left: sectionInset, - bottom: sectionInset, - right: sectionInset) - - if #available(iOS 11.0, *) { - layout.sectionInsetReference = .fromSafeArea - } - - let collectionVC = ShrineCollectionViewController(collectionViewLayout: layout) - super.init(contentViewController: collectionVC) - - collectionVC.headerViewController = self.headerViewController - collectionVC.setupHeaderView() - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - } - -} diff --git a/demos/Shrine/Shrine/ShrineHeaderContentView.swift b/demos/Shrine/Shrine/ShrineHeaderContentView.swift deleted file mode 100644 index 84054c18446..00000000000 --- a/demos/Shrine/Shrine/ShrineHeaderContentView.swift +++ /dev/null @@ -1,180 +0,0 @@ -/* - Copyright 2016-present the Material Components for iOS authors. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -import UIKit -import MaterialComponents.MaterialPageControl - -class ShrineHeaderContentView: UIView, UIScrollViewDelegate { - - var pageControl = MDCPageControl() - var scrollView = UIScrollView() - var logoImageView = UIImageView(image: UIImage(named: "ShrineLogo")) - var logoTextImageView = UIImageView(image: UIImage(named: "ShrineTextLogo")) - fileprivate var pages = NSMutableArray() - fileprivate var label = UILabel() - fileprivate var labelDesc = UILabel() - fileprivate var label2 = UILabel() - fileprivate var labelDesc2 = UILabel() - fileprivate var label3 = UILabel() - fileprivate var labelDesc3 = UILabel() - fileprivate var cyanBox = UIView() - fileprivate var cyanBox2 = UIView() - fileprivate var cyanBox3 = UIView() - fileprivate var imageView = UIImageView() - fileprivate var imageView2 = UIImageView() - fileprivate var imageView3 = UIImageView() - - override init(frame: CGRect) { - super.init(frame: frame) - commonInit() - } - - required init(coder: NSCoder) { - super.init(coder: coder)! - } - - func commonInit() { - let boundsWidth = bounds.width - let boundsHeight = bounds.height - scrollView.autoresizingMask = [.flexibleWidth, .flexibleHeight] - scrollView.delegate = self - scrollView.isPagingEnabled = true - scrollView.showsHorizontalScrollIndicator = false - addSubview(scrollView) - autoresizingMask = [.flexibleWidth, .flexibleHeight] - - for i in 0...2 { - let boundsLeft = CGFloat(i) * boundsWidth - let pageFrame = bounds.offsetBy(dx: boundsLeft, dy: 0) - let page = UIView(frame:pageFrame) - page.clipsToBounds = true - page.autoresizingMask = [.flexibleWidth, .flexibleHeight] - pages.add(page) - scrollView.addSubview(page) - } - - pageControl.numberOfPages = 3 - pageControl.autoresizingMask = [.flexibleWidth, .flexibleHeight] - let pageControlSize = pageControl.sizeThatFits(bounds.size) - pageControl.frame = CGRect(x: 0, - y: boundsHeight - pageControlSize.height, - width: boundsWidth, - height: pageControlSize.height) - pageControl.addTarget(self, action: #selector(didChangePage), - for: UIControl.Event.valueChanged) - addSubview(pageControl) - - addHeaderPages() - addSubview(logoImageView) - addSubview(logoTextImageView) - } - - func addHeaderPages() { - _ = ShrineHeaderPage(page: pages[0] as! UIView, - imageView: imageView, - label: label, - labelDesc: labelDesc, - cyanBox: cyanBox, - imageName: "chair.png", - description: "Green \ncomfort chair") - _ = ShrineHeaderPage(page: pages[1] as! UIView, - imageView: imageView2, - label: label2, - labelDesc: labelDesc2, - cyanBox: cyanBox2, - imageName: "backpack.png", - description: "Best gift for \nthe traveler") - _ = ShrineHeaderPage(page: pages[2] as! UIView, - imageView: imageView3, - label: label3, - labelDesc: labelDesc3, - cyanBox: cyanBox3, - imageName: "heels.png", - description: "Better \nwearing heels") - } - - override func layoutSubviews() { - super.layoutSubviews() - var safeAreaInset: CGFloat = 0 - #if swift(>=3.2) - if #available(iOS 11.0, *) { - safeAreaInset = min(self.safeAreaInsets.top, 10) - } - #endif - let boundsWidth = bounds.width - let boundsHeight = bounds.height - for i in 0...pages.count - 1 { - let boundsLeft = CGFloat(i) * boundsWidth - let pageFrame = bounds.offsetBy(dx: boundsLeft, dy: 0) - let page = pages[i] as! UIView - page.frame = pageFrame - } - let pageControlSize = pageControl.sizeThatFits(bounds.size) - pageControl.frame = CGRect(x: 0, y: boundsHeight - pageControlSize.height, width: boundsWidth, - height: pageControlSize.height) - let scrollWidth: CGFloat = boundsWidth * CGFloat(pages.count) - scrollView.frame = CGRect(x: 0, y: 0, width: boundsWidth, height: boundsHeight) - scrollView.contentSize = CGSize(width: scrollWidth, height: boundsHeight) - - let scrollViewOffsetX = CGFloat(pageControl.currentPage) * boundsWidth - scrollView.setContentOffset(CGPoint(x: scrollViewOffsetX, y: 0), animated: false) - logoImageView.center = CGPoint(x: (frame.size.width) / 2, y: 44 + safeAreaInset) - logoTextImageView.center = CGPoint(x: (frame.size.width) / 2, y: 44 + safeAreaInset) - - let labelWidth = CGFloat(250) - let labelWidthFrame = CGRect(x: frame.size.width - labelWidth, - y: 90, width: labelWidth, height: label.frame.size.height) - - let labelDescWidth = CGFloat(200) - let labelDescWidthFrame = CGRect(x: frame.size.width - labelDescWidth - 10, - y: 190, width: labelDescWidth, height: 40) - - label.frame = labelWidthFrame - labelDesc.frame = labelDescWidthFrame - label2.frame = labelWidthFrame - labelDesc2.frame = labelDescWidthFrame - label3.frame = labelWidthFrame - labelDesc3.frame = labelDescWidthFrame - - let cyanBoxFrame = CGRect(x: frame.size.width - 210, y: 180, width: 100, height: 8) - cyanBox.frame = cyanBoxFrame - cyanBox2.frame = cyanBoxFrame - cyanBox3.frame = cyanBoxFrame - - imageView.frame = CGRect(x: -180, y: 120, width: 420, height: frame.size.height) - imageView2.frame = CGRect(x: -220, y: 110, width: 420, height: frame.size.height) - imageView3.frame = CGRect(x: -180, y: 40, width: 420, height: frame.size.height) - } - - func scrollViewDidScroll(_ scrollView: UIScrollView) { - pageControl.scrollViewDidScroll(scrollView) - } - - func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - pageControl.scrollViewDidEndDecelerating(scrollView) - } - - func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { - pageControl.scrollViewDidEndScrollingAnimation(scrollView) - } - - @objc func didChangePage(_ sender: MDCPageControl) { - var offset = scrollView.contentOffset - offset.x = CGFloat(sender.currentPage) * scrollView.bounds.size.width - scrollView.setContentOffset(offset, animated: true) - } - -} diff --git a/demos/Shrine/Shrine/ShrineHeaderPage.swift b/demos/Shrine/Shrine/ShrineHeaderPage.swift deleted file mode 100644 index e71ce0af69b..00000000000 --- a/demos/Shrine/Shrine/ShrineHeaderPage.swift +++ /dev/null @@ -1,95 +0,0 @@ -/* - Copyright 2016-present the Material Components for iOS authors. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -import UIKit -import RemoteImageServiceForMDCDemos - -struct ShrineHeaderPage { - - let textColor = UIColor(red: 10 / 255, green: 49 / 255, blue: 66 / 255, alpha: 1) - let fontAbril = UIFont(name: "AbrilFatface-Regular", size: 36) - let fontHelvetica = UIFont(name: "Helvetica", size: 14) - let cyanBoxColor = UIColor(red: 0.19, green: 0.94, blue: 0.94, alpha: 1) - let descColor = UIColor(white: 0.54, alpha: 1) - let descString = "Leave the tunnel and the rain is fallin amazing things happen when you wait" - - var remoteImageService = RemoteImageService() - - var page: UIView - var imageView: UIView - var label: UILabel - var labelDesc: UILabel - var cyanBox: UIView - var imageName: String - var description: String - - init(page: UIView, imageView: UIImageView, label: UILabel, labelDesc: UILabel, - cyanBox: UIView, imageName: String, description: String) { - self.page = page - self.imageView = imageView - self.label = label - self.labelDesc = labelDesc - self.cyanBox = cyanBox - self.imageName = imageName - self.description = description - - imageView.contentMode = UIView.ContentMode.scaleAspectFill - imageView.autoresizingMask = .flexibleHeight - (page as AnyObject).addSubview(imageView) - let url = URL(string: ShrineData.baseURL + imageName) - remoteImageService.fetchImageAndThumbnail(from: url) { (image: UIImage?, _: UIImage?) -> Void in - DispatchQueue.main.async(execute: { - imageView.image = image - imageView.setNeedsDisplay() - }) - } - - label.font = fontAbril - label.textColor = textColor - label.lineBreakMode = .byWordWrapping - label.numberOfLines = 2 - label.attributedText = attributedString(description, lineHeightMultiple: 0.8) - label.sizeToFit() - (page as AnyObject).addSubview(label) - - labelDesc.lineBreakMode = .byWordWrapping - labelDesc.numberOfLines = 3 - labelDesc.font = fontHelvetica - labelDesc.textColor = descColor - labelDesc.attributedText = attributedString(descString, lineHeightMultiple: 1.2) - labelDesc.autoresizingMask = .flexibleWidth - (page as AnyObject).addSubview(labelDesc) - - cyanBox.backgroundColor = cyanBoxColor - (page as AnyObject).addSubview(cyanBox) - - let inkOverlay = ShrineInkOverlay(frame: (page as AnyObject).bounds) - inkOverlay.autoresizingMask = [.flexibleWidth, .flexibleHeight] - (page as AnyObject).addSubview(inkOverlay) - - } - - func attributedString(_ string: String, - lineHeightMultiple: CGFloat) -> NSMutableAttributedString { - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.lineHeightMultiple = lineHeightMultiple - let attrString = NSMutableAttributedString(string: string) - attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, - range:NSRange(location: 0, length: attrString.length)) - return attrString - } - -} diff --git a/demos/Shrine/Shrine/ShrineInkOverlay.swift b/demos/Shrine/Shrine/ShrineInkOverlay.swift deleted file mode 100644 index dc06e5e55ce..00000000000 --- a/demos/Shrine/Shrine/ShrineInkOverlay.swift +++ /dev/null @@ -1,41 +0,0 @@ -/* - Copyright 2016-present the Material Components for iOS authors. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -import UIKit -import MaterialComponents.MaterialInk - -class ShrineInkOverlay: UIView, MDCInkTouchControllerDelegate { - - fileprivate var inkTouchController: MDCInkTouchController? - - override init(frame: CGRect) { - super.init(frame: frame) - let cyan = UIColor(red: 22 / 255, green: 240 / 255, blue: 240 / 255, alpha: 0.2) - self.inkTouchController = MDCInkTouchController(view:self) - self.inkTouchController!.defaultInkView.inkColor = cyan - self.inkTouchController!.addInkView() - self.inkTouchController!.delegate = self - } - - required init(coder: NSCoder) { - super.init(coder: coder)! - } - - override func layoutSubviews() { - super.layoutSubviews() - } - -} From ff33bab752cb518e46d2a2d4011045d081428b80 Mon Sep 17 00:00:00 2001 From: Nobody Date: Mon, 15 Mar 2021 14:07:22 -0700 Subject: [PATCH 2/5] New in-development Shadow component (not ready for public use). PiperOrigin-RevId: 363026026 --- components/Shadow/src/MDCShadow.h | 64 +++++ components/Shadow/src/MDCShadow.m | 126 ++++++++++ components/Shadow/src/MDCShadowConfiguring.h | 87 +++++++ components/Shadow/src/MDCShadowConfiguring.m | 52 ++++ components/Shadow/src/MaterialShadow.h | 17 ++ .../Shadow/src/private/MDCShadow+Internal.h | 25 ++ .../tests/snapshot/MDCShadowSnapshotTests.m | 234 ++++++++++++++++++ components/Shadow/tests/unit/MDCShadowTests.m | 90 +++++++ 8 files changed, 695 insertions(+) create mode 100644 components/Shadow/src/MDCShadow.h create mode 100644 components/Shadow/src/MDCShadow.m create mode 100644 components/Shadow/src/MDCShadowConfiguring.h create mode 100644 components/Shadow/src/MDCShadowConfiguring.m create mode 100644 components/Shadow/src/MaterialShadow.h create mode 100644 components/Shadow/src/private/MDCShadow+Internal.h create mode 100644 components/Shadow/tests/snapshot/MDCShadowSnapshotTests.m create mode 100644 components/Shadow/tests/unit/MDCShadowTests.m diff --git a/components/Shadow/src/MDCShadow.h b/components/Shadow/src/MDCShadow.h new file mode 100644 index 00000000000..d4a7fb3aa7f --- /dev/null +++ b/components/Shadow/src/MDCShadow.h @@ -0,0 +1,64 @@ +// Copyright 2021-present the Material Components for iOS authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +/** + Immutable value type holding shadow metrics to apply to a view's layer. Use + `MDCShadowForElevation()` or `MDCShadowBuilder` to create this object. + */ +__attribute__((objc_subclassing_restricted)) @interface MDCShadow : NSObject + +/** CALayer.shadowOpacity */ +@property(nonatomic, readonly) CGFloat opacity; + +/** CALayer.shadowRadius */ +@property(nonatomic, readonly) CGFloat radius; + +/** CALayer.shadowOffset */ +@property(nonatomic, readonly) CGSize offset; + +- (nonnull instancetype)init NS_UNAVAILABLE; + +@end + +/** + Mutable builder to construct immutable `MDCShadow` objects. + */ +__attribute__((objc_subclassing_restricted)) @interface MDCShadowBuilder : NSObject + +/** CALayer.shadowOpacity */ +@property(nonatomic) CGFloat opacity; + +/** CALayer.shadowRadius */ +@property(nonatomic) CGFloat radius; + +/** CALayer.shadowOffset */ +@property(nonatomic) CGSize offset; + +/** Returns an immutable value type containing a snapshot of the values in this object. */ +- (nonnull MDCShadow *)build; + +@end + +/** + Default color for a Material shadow. On iOS >= 13, this is a dynamic color. + */ +FOUNDATION_EXTERN UIColor *_Nonnull MDCShadowColor(void); + +/** + Returns an `MDCShadow` representing the Material shadow metrics for the given elevation (in + points). + */ +FOUNDATION_EXTERN MDCShadow *_Nonnull MDCShadowForElevation(CGFloat elevation); diff --git a/components/Shadow/src/MDCShadow.m b/components/Shadow/src/MDCShadow.m new file mode 100644 index 00000000000..897165f1ee0 --- /dev/null +++ b/components/Shadow/src/MDCShadow.m @@ -0,0 +1,126 @@ +// Copyright 2021-present the Material Components for iOS authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "MDCShadow.h" + +#import "MaterialAvailability.h" +#import "MDCShadow+Internal.h" + +@implementation MDCShadow + +- (instancetype)initWithOpacity:(CGFloat)opacity radius:(CGFloat)radius offset:(CGSize)offset { + self = [super init]; + if (self) { + _opacity = opacity; + _radius = radius; + _offset = offset; + } + return self; +} + +- (BOOL)isEqual:(id)other { + if (self == other) { + return YES; + } + if (![other isKindOfClass:[MDCShadow class]]) { + return NO; + } + MDCShadow *otherShadow = other; + return _opacity == otherShadow.opacity && _radius == otherShadow.radius && + CGSizeEqualToSize(_offset, otherShadow.offset); +} + +- (NSUInteger)hash { + const NSUInteger kPrime = 31; + NSUInteger result = 1; + result = result * kPrime + (NSUInteger)_opacity; + result = result * kPrime + (NSUInteger)_radius; + result = result * kPrime + (NSUInteger)(_offset.width); + result = result * kPrime + (NSUInteger)(_offset.height); + return result; +} + +@end + +@implementation MDCShadowBuilder + +- (MDCShadow *)build { + return [[MDCShadow alloc] initWithOpacity:self.opacity radius:self.radius offset:self.offset]; +} + +@end + +static UIColor *LightStyleShadowColor(void) { + static UIColor *lightStyleShadowColor; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + lightStyleShadowColor = [UIColor colorWithRed:0.235 green:0.251 blue:0.263 alpha:1]; + }); + return lightStyleShadowColor; +} + +UIColor *MDCShadowColor(void) { +#if MDC_AVAILABLE_SDK_IOS(13_0) + if (@available(iOS 13.0, *)) { + return [UIColor colorWithDynamicProvider:^(UITraitCollection *traitCollection) { + switch (traitCollection.userInterfaceStyle) { + case UIUserInterfaceStyleUnspecified: + __attribute__((fallthrough)); + case UIUserInterfaceStyleLight: + return LightStyleShadowColor(); + case UIUserInterfaceStyleDark: + return UIColor.blackColor; + } + __builtin_unreachable(); + }]; + } +#endif // MDC_AVAILABLE_SDK_IOS(13_0) + return LightStyleShadowColor(); +} + +static int ShadowElevationToLevel(CGFloat elevation) { + if (elevation < 1) { + return 0; + } + if (elevation < 3) { + return 1; + } + if (elevation < 6) { + return 2; + } + if (elevation < 8) { + return 3; + } + if (elevation < 12) { + return 4; + } + return 5; +} + +MDCShadow *MDCShadowForElevation(CGFloat elevation) { + static NSArray *shadowLevels; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + shadowLevels = @[ + [[MDCShadow alloc] initWithOpacity:0 radius:0 offset:CGSizeMake(0, 0)], + [[MDCShadow alloc] initWithOpacity:0.43 radius:2.5 offset:CGSizeMake(0, 1)], + [[MDCShadow alloc] initWithOpacity:0.4 radius:3.25 offset:CGSizeMake(0, 1.25)], + [[MDCShadow alloc] initWithOpacity:0.34 radius:4.75 offset:CGSizeMake(0, 2.25)], + [[MDCShadow alloc] initWithOpacity:0.42 radius:6 offset:CGSizeMake(0, 3)], + [[MDCShadow alloc] initWithOpacity:0.4 radius:7.25 offset:CGSizeMake(0, 5)], + ]; + }); + int shadowLevel = ShadowElevationToLevel(elevation); + return shadowLevels[shadowLevel]; +} diff --git a/components/Shadow/src/MDCShadowConfiguring.h b/components/Shadow/src/MDCShadowConfiguring.h new file mode 100644 index 00000000000..e1910ee38f3 --- /dev/null +++ b/components/Shadow/src/MDCShadowConfiguring.h @@ -0,0 +1,87 @@ +// Copyright 2021-present the Material Components for iOS authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +@class MDCShadow; + +/** + Given a view and a shadow color (e.g. `MDCShadowColor()`) along with an elevation, updates + the shadow properties of `view.layer`: + + * shadowColor + * shadowOpacity + * shadowRadius + * shadowOffset + * shadowPath + + `shadowPath` will be set to the current bounds of the given view (including rounded + corners if set on view.layer). + + TODO(b/182581383): maskedCorners, cornerCurve, and cornerCurveExpansionFactor are not + yet supported. + + If `elevation` is < 1, disables the view's shadow. Otherwise, enables the shadow. + + Call this function from your `UIView` subclass's `-layoutSubviews` to update `shadowPath` + whenever the view's bounds change. + */ +FOUNDATION_EXTERN void MDCConfigureShadowForViewWithElevation(UIView *_Nonnull view, + UIColor *_Nonnull shadowColor, + CGFloat elevation) + NS_SWIFT_NAME(MDCConfigureShadow(for:color:elevation:)); + +/** + Given a view and a shadow color (e.g. `MDCShadowColor()`) along with an `MDCShadow` value, updates + the shadow properties of `view.layer`: + + * shadowColor + * shadowOpacity + * shadowRadius + * shadowOffset + * shadowPath + + `shadowPath` will be set to the current bounds of the given view (including rounded + corners if set on view.layer). + + TODO(b/182581383): maskedCorners, cornerCurve, and cornerCurveExpansionFactor are not + yet supported. + + Call this function from your `UIView` subclass's `-layoutSubviews` to update `shadowPath` + whenever the view's bounds change. + */ +FOUNDATION_EXTERN void MDCConfigureShadowForViewWithShadow(UIView *_Nonnull view, + UIColor *_Nonnull shadowColor, + MDCShadow *_Nonnull shadow) + NS_SWIFT_NAME(MDCConfigureShadow(for:color:shadow:)); + +/** + Given a view, a shadow color (e.g. `MDCShadowColor()`), an `MDCShadow` value, and a `path` in the + view's coordinate space representing the shape of the view, updates the shadow properties of + `view.layer`: + + * shadowColor + * shadowOpacity + * shadowRadius + * shadowOffset + * shadowPath + + Call this function from your `UIView` subclass's `-layoutSubviews` to update `shadowPath` + whenever the view's bounds or shape changes. + */ +FOUNDATION_EXTERN void MDCConfigureShadowForViewWithShadowAndPath(UIView *_Nonnull view, + UIColor *_Nonnull shadowColor, + MDCShadow *_Nonnull shadow, + CGPathRef _Nonnull path) + NS_SWIFT_NAME(MDCConfigureShadow(for:color:shadow:path:)); diff --git a/components/Shadow/src/MDCShadowConfiguring.m b/components/Shadow/src/MDCShadowConfiguring.m new file mode 100644 index 00000000000..c2414f19fd9 --- /dev/null +++ b/components/Shadow/src/MDCShadowConfiguring.m @@ -0,0 +1,52 @@ +// Copyright 2021-present the Material Components for iOS authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "MDCShadowConfiguring.h" + +#import "MaterialAvailability.h" +#import "MDCShadow.h" + +void MDCConfigureShadowForViewWithElevation(UIView *view, UIColor *shadowColor, CGFloat elevation) { + MDCShadow *shadow = MDCShadowForElevation(elevation); + if (!shadow) { + view.layer.shadowColor = nil; + view.layer.shadowOpacity = 0; + view.layer.shadowRadius = 0; + view.layer.shadowOffset = CGSizeZero; + view.layer.shadowPath = nil; + return; + } + MDCConfigureShadowForViewWithShadow(view, shadowColor, shadow); +} + +void MDCConfigureShadowForViewWithShadow(UIView *view, UIColor *shadowColor, MDCShadow *shadow) { + // Support views both with and without cornerRadius set. + UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:view.bounds + cornerRadius:view.layer.cornerRadius]; + MDCConfigureShadowForViewWithShadowAndPath(view, shadowColor, shadow, path.CGPath); +} + +void MDCConfigureShadowForViewWithShadowAndPath(UIView *view, UIColor *shadowColor, + MDCShadow *shadow, CGPathRef path) { +#if MDC_AVAILABLE_SDK_IOS(13_0) + if (@available(ios 13.0, *)) { + shadowColor = [shadowColor resolvedColorWithTraitCollection:view.traitCollection]; + } +#endif // MDC_AVAILABLE_SDK_IOS(13_0) + view.layer.shadowColor = shadowColor.CGColor; + view.layer.shadowOpacity = shadow.opacity; + view.layer.shadowRadius = shadow.radius; + view.layer.shadowOffset = shadow.offset; + view.layer.shadowPath = path; +} diff --git a/components/Shadow/src/MaterialShadow.h b/components/Shadow/src/MaterialShadow.h new file mode 100644 index 00000000000..c4fb1074199 --- /dev/null +++ b/components/Shadow/src/MaterialShadow.h @@ -0,0 +1,17 @@ +// Copyright 2021-present the Material Components for iOS authors. All Rights +// Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "MDCShadow.h" +#import "MDCShadowConfiguring.h" diff --git a/components/Shadow/src/private/MDCShadow+Internal.h b/components/Shadow/src/private/MDCShadow+Internal.h new file mode 100644 index 00000000000..8c7225d5d2f --- /dev/null +++ b/components/Shadow/src/private/MDCShadow+Internal.h @@ -0,0 +1,25 @@ +// Copyright 2021-present the Material Components for iOS authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "MDCShadow.h" + +@interface MDCShadow () + +- (instancetype)initWithOpacity:(CGFloat)opacity + radius:(CGFloat)radius + offset:(CGSize)offset NS_DESIGNATED_INITIALIZER; + +@end diff --git a/components/Shadow/tests/snapshot/MDCShadowSnapshotTests.m b/components/Shadow/tests/snapshot/MDCShadowSnapshotTests.m new file mode 100644 index 00000000000..13c705e5d5b --- /dev/null +++ b/components/Shadow/tests/snapshot/MDCShadowSnapshotTests.m @@ -0,0 +1,234 @@ +// Copyright 2019-present the Material Components for iOS authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "MaterialAvailability.h" +#import "MaterialShadow.h" +#import "MaterialSnapshot.h" + +/** + Returns a dynamic color which is green in light mode and red in dark mode. + */ +static UIColor *MDCTestDynamicShadowColor(void) { +#if MDC_AVAILABLE_SDK_IOS(13_0) + if (@available(iOS 13.0, *)) { + return [UIColor colorWithDynamicProvider:^(UITraitCollection *traitCollection) { + switch (traitCollection.userInterfaceStyle) { + case UIUserInterfaceStyleUnspecified: + __attribute__((fallthrough)); + case UIUserInterfaceStyleLight: + return UIColor.greenColor; + case UIUserInterfaceStyleDark: + return UIColor.redColor; + } + __builtin_unreachable(); + }]; + } +#endif // MDC_AVAILABLE_SDK_IOS(13_0) + // Should not be reached (do not invoke this function on iOS < 13). + abort(); +} + +/** + A UIView that supports rendering a shadow and overriding its traitCollection. + */ +@interface MDCShadowTestView : UIView +@property(nonatomic) CGFloat shadowElevation; +@property(nonatomic, strong, nonnull) UIColor *shadowColor; +@property(nonatomic, strong, nullable) CAShapeLayer *shapeLayer; +@property(nonatomic, nullable) CGPathRef shapePath; +@property(nonatomic, strong, nullable) UITraitCollection *traitCollectionOverride; +@end + +@implementation MDCShadowTestView + +@synthesize shapePath = _shapePath; + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + _shadowColor = MDCShadowColor(); + } + return self; +} + +- (UITraitCollection *)traitCollection { + return self.traitCollectionOverride ?: [super traitCollection]; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + if (self.shapePath) { + self.backgroundColor = nil; + MDCShadow *shadow = MDCShadowForElevation(self.shadowElevation); + MDCConfigureShadowForViewWithShadowAndPath(self, self.shadowColor, shadow, self.shapePath); + } else { + self.backgroundColor = UIColor.whiteColor; + MDCConfigureShadowForViewWithElevation(self, self.shadowColor, self.shadowElevation); + } +} + +- (void)setShapePath:(CGPathRef)shapePath { + if (_shapeLayer) { + [_shapeLayer removeFromSuperlayer]; + _shapeLayer = nil; + } + if (shapePath) { + // Note we cannot use self.layer.mask here, as it would mask the shadow. + CAShapeLayer *shapeLayer = CAShapeLayer.layer; + shapeLayer.fillColor = UIColor.whiteColor.CGColor; + shapeLayer.path = shapePath; + [self.layer addSublayer:shapeLayer]; + } + _shapePath = shapePath; +} + +@end + +/** + Snapshot tests for MDCShadow functions. + */ +@interface MDCShadowSnapshotTests : MDCSnapshotTestCase + +@property(nonatomic, strong) MDCShadowTestView *view; + +@end + +@implementation MDCShadowSnapshotTests + +- (void)setUp { + [super setUp]; + self.view = [[MDCShadowTestView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)]; +} + +#pragma mark - Helpers + +- (void)generateSnapshotAndVerifyForView:(UIView *)view { + UIView *snapshotView = [view mdc_addToBackgroundView]; + [self snapshotVerifyView:snapshotView]; +} + +- (void)generateSnapshotForIOS13AndVerifyForView:(UIView *)view { + UIView *snapshotView = [view mdc_addToBackgroundView]; + [self snapshotVerifyViewForIOS13:snapshotView]; +} + +#pragma mark - Tests + +- (void)testShadowWithZeroElevationShouldNotRenderShadow { + // Given + self.view.shadowElevation = 0; + + // Then + [self generateSnapshotAndVerifyForView:self.view]; +} + +- (void)testShadowWithLowElevationShouldRenderShadow { + // Given + self.view.shadowElevation = 2; + + // Then + [self generateSnapshotAndVerifyForView:self.view]; +} + +- (void)testShadowWithHighElevationShouldRenderShadow { + // Given + self.view.shadowElevation = 10; + + // Then + [self generateSnapshotAndVerifyForView:self.view]; +} + +- (void)testShadowWithLowElevationShouldUpdateShadowOnBoundsChange { + // Given + self.view.shadowElevation = 2; + + // When + [self.view layoutIfNeeded]; + self.view.bounds = CGRectMake(0, 0, 180, 20); + + // Then + [self generateSnapshotAndVerifyForView:self.view]; +} + +- (void)testShadowWithLowElevationAndCornerRadiusShouldRenderRoundedShadow { + // Given + self.view.shadowElevation = 2; + self.view.layer.cornerRadius = 3; + + // Then + [self generateSnapshotAndVerifyForView:self.view]; +} + +- (void)testShadowWithLowElevationAndCornerRadiusShouldUpdateShadowOnBoundsChange { + // Given + self.view.shadowElevation = 2; + self.view.layer.cornerRadius = 3; + + // When + [self.view layoutIfNeeded]; + self.view.bounds = CGRectMake(0, 0, 180, 20); + + // Then + [self generateSnapshotAndVerifyForView:self.view]; +} + +- (void)testShadowWithLowElevationAndShapeLayerShouldRenderShapedShadow { + // Given + self.view.shadowElevation = 2; + UIBezierPath *triangleBezierPath = UIBezierPath.bezierPath; + [triangleBezierPath moveToPoint:CGPointMake(40, 0)]; + [triangleBezierPath addLineToPoint:CGPointMake(80, 80)]; + [triangleBezierPath addLineToPoint:CGPointMake(0, 80)]; + [triangleBezierPath closePath]; + self.view.shapePath = triangleBezierPath.CGPath; + + // Then + [self generateSnapshotAndVerifyForView:self.view]; +} + +- (void)testCustomShadowColorInLightModeShouldBeGreen { +#if MDC_AVAILABLE_SDK_IOS(13_0) + if (@available(iOS 13.0, *)) { + // Given + self.view.shadowElevation = 2; + self.view.shadowColor = MDCTestDynamicShadowColor(); + + // When + self.view.traitCollectionOverride = + [UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleLight]; + + // Then + [self generateSnapshotForIOS13AndVerifyForView:self.view]; + } +#endif // MDC_AVAILABLE_SDK_IOS(13_0) +} + +- (void)testCustomShadowColorInDarkModeShouldBeRed { +#if MDC_AVAILABLE_SDK_IOS(13_0) + if (@available(iOS 13.0, *)) { + // Given + self.view.shadowElevation = 2; + self.view.shadowColor = MDCTestDynamicShadowColor(); + + // When + self.view.traitCollectionOverride = + [UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleDark]; + + // Then + [self generateSnapshotForIOS13AndVerifyForView:self.view]; + } +#endif // MDC_AVAILABLE_SDK_IOS(13_0) +} + +@end diff --git a/components/Shadow/tests/unit/MDCShadowTests.m b/components/Shadow/tests/unit/MDCShadowTests.m new file mode 100644 index 00000000000..68b715250f1 --- /dev/null +++ b/components/Shadow/tests/unit/MDCShadowTests.m @@ -0,0 +1,90 @@ +// Copyright 2021-present the Material Components for iOS authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import "MDCShadow.h" + +@interface MDCShadowTests : XCTestCase +@end + +@implementation MDCShadowTests + +- (void)testZeroElevationShouldReturnEmptyShadow { + // Given + MDCShadow *shadow = MDCShadowForElevation(0); + + // Then + XCTAssertEqual(shadow.opacity, 0); + XCTAssertEqual(shadow.radius, 0); + XCTAssertEqual(shadow.offset.width + shadow.offset.height, 0); +} + +- (void)testLowElevationShouldReturnShadow { + // Given + MDCShadow *shadow = MDCShadowForElevation(2); + + // Then + XCTAssertGreaterThan(shadow.opacity, 0); + XCTAssertGreaterThan(shadow.radius, 0); + XCTAssertGreaterThan(shadow.offset.width + shadow.offset.height, 0); +} + +- (void)testHighElevationShouldReturnShadow { + // Given + MDCShadow *shadow = MDCShadowForElevation(24); + + // Then + XCTAssertGreaterThan(shadow.opacity, 0); + XCTAssertGreaterThan(shadow.radius, 0); + XCTAssertGreaterThan(shadow.offset.width + shadow.offset.height, 0); +} + +- (void)testSameElevationShouldBeEqualToSelf { + // Given + MDCShadow *lowElevationShadowA = MDCShadowForElevation(2); + MDCShadow *lowElevationShadowB = MDCShadowForElevation(2); + + // Then + XCTAssertEqualObjects(lowElevationShadowA, lowElevationShadowB); +} + +- (void)testLowElevationShouldReturnDifferentShadowFromHighElevation { + // Given + MDCShadow *lowElevationShadow = MDCShadowForElevation(2); + MDCShadow *highElevationShadow = MDCShadowForElevation(24); + + // Then + XCTAssertNotEqualObjects(lowElevationShadow, highElevationShadow); +} + +- (void)testBuilderReturnsExpectedValues { + // Given + MDCShadowBuilder *shadowBuilder = [[MDCShadowBuilder alloc] init]; + + // When + shadowBuilder.opacity = 42; + shadowBuilder.radius = 23; + shadowBuilder.offset = CGSizeMake(1, 2); + + MDCShadow *shadow = [shadowBuilder build]; + + // Then + XCTAssertEqualWithAccuracy(shadow.opacity, 42, 1e-6); + XCTAssertEqualWithAccuracy(shadow.radius, 23, 1e-6); + XCTAssertEqualWithAccuracy(shadow.offset.width, 1, 1e-6); + XCTAssertEqualWithAccuracy(shadow.offset.height, 2, 1e-6); +} + +@end From 74301ad56f3dd902f0785d99b0399234275fbbb9 Mon Sep 17 00:00:00 2001 From: Galia Kaufman Date: Tue, 16 Mar 2021 08:50:25 -0400 Subject: [PATCH 3/5] Automatic changelog preparation for release. --- .gitattributes | 28 +++++++++++++++++++++++++--- CHANGELOG.md | 26 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index c13f46c3bdc..f56e2dfb895 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,25 @@ -# Do not merge this version into `stable`. # DO NOT CHANGE THIS FILE -snapshot_test_goldens/**/*.png filter=lfs diff=lfs merge=lfs -text # DO NOT EDIT THE LINE BELOW. -.gitattributes merge=gitattributes +# DO NOT CHANGE THIS FILE +# DO NOT EDIT THE LINE BELOW. +/.gitattributes merge=gitattributes +# DO NOT EDIT THE LINE ABOVE. +# +# You can of course edit this file, but make sure you understand what you are +# doing. This file defines a custom filter driver that prevents snapshot test +# images from being merged into `stable`. Snapshot test images are only +# valuable in `develop` because they are only intended to help developers +# identify changes in the appearance of the library. +# +# Before you change this file, please carefully consider whether such a change +# is actually necessary. When you do change this file, it should almost always +# be done in a dedicated commit directly on the `stable` branch and not part +# of a release. If you see this file being changed as part of a release, +# block the release and work with the releaser to ensure that the change needs +# to be propagated from the `develop` branch to the `stable` branch. In nearly +# all cases, it should not be propagated from `develop` to `stable`. +# +# If you are a releaser and see this file change and you're not sure why, you +# might have accidentally skipped [setting the correct +# driver in your cloned +# repository](https://github.com/material-components/material-components-ios/blob/develop/contributing/releasing.md#configure-the-merge-strategy-for-gitattributes). +# If that's the case, please either revert the accidental change manually or +# restart the release with a fresh clone and the correct driver. diff --git a/CHANGELOG.md b/CHANGELOG.md index 81d75a72c04..7b603e9cfc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,29 @@ +# #develop# + +Replace this text with a summarized description of this release's contents. +## Breaking changes + +Replace this explanations for how to resolve the breaking changes. +## New deprecations + +Replace this text with links to deprecation guides. +## New features + +Replace this text with example code for each new feature. +## API changes + +### Shadow + +**New component.** + +## Component changes + +### Shadow + +* [New in-development Shadow component (not ready for public use).](https://github.com/material-components/material-components-ios/commit/ff33bab752cb518e46d2a2d4011045d081428b80) (Nobody) + +--- + # 124.0.1 This patch release fixes a bug in BottomNavigation. From 0d5c85381655a4af568fb20611dec3d10b16d8c6 Mon Sep 17 00:00:00 2001 From: Galia Kaufman Date: Tue, 16 Mar 2021 09:28:30 -0400 Subject: [PATCH 4/5] Hand-modified CHANGELOG.md API diff. --- CHANGELOG.md | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b603e9cfc0..440c57b8758 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,26 +1,33 @@ -# #develop# +# 124.1.1 -Replace this text with a summarized description of this release's contents. -## Breaking changes - -Replace this explanations for how to resolve the breaking changes. -## New deprecations +In this minor release we added a new Shadow Component and removed the Shrine demo. -Replace this text with links to deprecation guides. ## New features -Replace this text with example code for each new feature. +A new Shadow Component. + ## API changes ### Shadow -**New component.** +Use the new Shadow component to create a shadow adjusted to your elevation: + + +```objc +MDCShadow *lowElevationShadow = MDCShadowForElevation(2); +MDCShadow *highElevationShadow = MDCShadowForElevation(24); +``` + +```swift +let lowElevation = MDCShadowForElevation(2) +let highElevation = MDCShadowForElevation(24) +``` ## Component changes ### Shadow -* [New in-development Shadow component (not ready for public use).](https://github.com/material-components/material-components-ios/commit/ff33bab752cb518e46d2a2d4011045d081428b80) (Nobody) +* [New in-development Shadow component (not ready for public use).](https://github.com/material-components/material-components-ios/commit/ff33bab752cb518e46d2a2d4011045d081428b80) (Ben Hamilton) --- From 6b168e66fe329cc46b5dec403da8c2920cfd8cd1 Mon Sep 17 00:00:00 2001 From: Galia Kaufman Date: Tue, 16 Mar 2021 09:29:27 -0400 Subject: [PATCH 5/5] Bumped version number to 124.1.1. --- MaterialComponents.podspec | 2 +- MaterialComponentsEarlGreyTests.podspec | 2 +- MaterialComponentsExamples.podspec | 2 +- MaterialComponentsSnapshotTests.podspec | 2 +- VERSION | 2 +- catalog/MDCCatalog/Info.plist | 4 ++-- catalog/MDCDragons/Info.plist | 4 ++-- catalog/MaterialCatalog/MaterialCatalog.podspec | 2 +- components/LibraryInfo/src/MDCLibraryInfo.m | 2 +- components/LibraryInfo/tests/unit/LibraryInfoTests.m | 2 +- demos/supplemental/RemoteImageServiceForMDCDemos.podspec | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/MaterialComponents.podspec b/MaterialComponents.podspec index 0b752b8ce0e..100e8d33318 100644 --- a/MaterialComponents.podspec +++ b/MaterialComponents.podspec @@ -2,7 +2,7 @@ load 'scripts/generated/icons.rb' Pod::Spec.new do |mdc| mdc.name = "MaterialComponents" - mdc.version = "124.0.1" + mdc.version = "124.1.1" mdc.authors = "The Material Components authors." mdc.summary = "A collection of stand-alone production-ready UI libraries focused on design details." mdc.homepage = "https://github.com/material-components/material-components-ios" diff --git a/MaterialComponentsEarlGreyTests.podspec b/MaterialComponentsEarlGreyTests.podspec index 3d1c99a65d8..398c1c87fcc 100644 --- a/MaterialComponentsEarlGreyTests.podspec +++ b/MaterialComponentsEarlGreyTests.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "MaterialComponentsEarlGreyTests" - s.version = "124.0.1" + s.version = "124.1.1" s.authors = "The Material Components authors." s.summary = "This spec is an aggregate of all the Material Components EarlGrey tests." s.description = "This spec is made for use in the MDC Catalog." diff --git a/MaterialComponentsExamples.podspec b/MaterialComponentsExamples.podspec index 8ea1db233c7..eec56494346 100644 --- a/MaterialComponentsExamples.podspec +++ b/MaterialComponentsExamples.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "MaterialComponentsExamples" - s.version = "124.0.1" + s.version = "124.1.1" s.authors = "The Material Components authors." s.summary = "This spec is an aggregate of all the Material Components examples." s.description = "This spec is made for use in the MDC Catalog. Used in conjunction with CatalogByConvention we create our Material Catalog." diff --git a/MaterialComponentsSnapshotTests.podspec b/MaterialComponentsSnapshotTests.podspec index 04b5ec6c15d..0269fa4fcfb 100644 --- a/MaterialComponentsSnapshotTests.podspec +++ b/MaterialComponentsSnapshotTests.podspec @@ -53,7 +53,7 @@ end Pod::Spec.new do |s| s.name = "MaterialComponentsSnapshotTests" - s.version = "124.0.1" + s.version = "124.1.1" s.authors = "The Material Components authors." s.summary = "This spec is an aggregate of all the Material Components snapshot tests." s.homepage = "https://github.com/material-components/material-components-ios" diff --git a/VERSION b/VERSION index 2c7399bd34e..e6afbd05164 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -124.0.1 +124.1.1 diff --git a/catalog/MDCCatalog/Info.plist b/catalog/MDCCatalog/Info.plist index 7110217ce7e..36af393c5b5 100644 --- a/catalog/MDCCatalog/Info.plist +++ b/catalog/MDCCatalog/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 124.0.1 + 124.1.1 CFBundleSignature ???? CFBundleVersion - 124.0.1 + 124.1.1 LSRequiresIPhoneOS UIAppFonts diff --git a/catalog/MDCDragons/Info.plist b/catalog/MDCDragons/Info.plist index d1a660cd153..3dc3c83f70f 100644 --- a/catalog/MDCDragons/Info.plist +++ b/catalog/MDCDragons/Info.plist @@ -15,9 +15,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 124.0.1 + 124.1.1 CFBundleVersion - 124.0.1 + 124.1.1 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/catalog/MaterialCatalog/MaterialCatalog.podspec b/catalog/MaterialCatalog/MaterialCatalog.podspec index 11a9296b3f0..666c4d1b069 100644 --- a/catalog/MaterialCatalog/MaterialCatalog.podspec +++ b/catalog/MaterialCatalog/MaterialCatalog.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "MaterialCatalog" - s.version = "124.0.1" + s.version = "124.1.1" s.summary = "Helper Objective-C classes for the MDC catalog." s.description = "This spec is made for use in the MDC Catalog." s.homepage = "https://github.com/material-components/material-components-ios" diff --git a/components/LibraryInfo/src/MDCLibraryInfo.m b/components/LibraryInfo/src/MDCLibraryInfo.m index 99bbd379927..b30653b8a64 100644 --- a/components/LibraryInfo/src/MDCLibraryInfo.m +++ b/components/LibraryInfo/src/MDCLibraryInfo.m @@ -19,7 +19,7 @@ // This string is updated automatically as a part of the release process and should not be edited // manually. Do not rename this constant or change the formatting without updating the release // scripts. -static NSString* const kMDCLibraryInfoVersionString = @"124.0.1"; +static NSString* const kMDCLibraryInfoVersionString = @"124.1.1"; @implementation MDCLibraryInfo diff --git a/components/LibraryInfo/tests/unit/LibraryInfoTests.m b/components/LibraryInfo/tests/unit/LibraryInfoTests.m index 748dd4cc13b..e0fc188dce2 100644 --- a/components/LibraryInfo/tests/unit/LibraryInfoTests.m +++ b/components/LibraryInfo/tests/unit/LibraryInfoTests.m @@ -26,7 +26,7 @@ - (void)testVersionFormat { // Given // This regex pattern does the following: - // Accept: "124.0.1", etc. + // Accept: "124.1.1", etc. // Reject: "0.0.0", "1.2", "1", "-1.2.3", "Hi, I'm a version 1.2.3", "1.2.3 is my version", etc. // // Note the major version must be >= 1 since "0.0.0" is used as the version when something goes diff --git a/demos/supplemental/RemoteImageServiceForMDCDemos.podspec b/demos/supplemental/RemoteImageServiceForMDCDemos.podspec index 3815555c8ff..b494171053b 100644 --- a/demos/supplemental/RemoteImageServiceForMDCDemos.podspec +++ b/demos/supplemental/RemoteImageServiceForMDCDemos.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "RemoteImageServiceForMDCDemos" - s.version = "124.0.1" + s.version = "124.1.1" s.summary = "A helper image class for the MDC demos." s.description = "This spec is made for use in the MDC demos. It gets images via url." s.homepage = "https://github.com/material-components/material-components-ios"