From 70716800b8db661d8efa744ab8a3f41e15b99f57 Mon Sep 17 00:00:00 2001 From: Nobody Date: Mon, 18 May 2020 15:41:12 +0000 Subject: [PATCH] Internal change PiperOrigin-RevId: 312085611 --- .../examples/ActionSheetTypicalUseExample.m | 33 +++ .../Banner/examples/AppBarBannerExample.m | 12 ++ .../BottomAppBarTypicalUseSupplemental.m | 11 + .../BottomNavigationTypicalUseExample.m | 24 +++ .../examples/ButtonsTypicalUseExample.m | 48 +++++ .../FloatingButtonTypicalUseExample.m | 17 ++ components/Dialogs/README.md | 200 +++++++++--------- components/Dialogs/docs/accessibility.md | 18 -- .../Dialogs/docs/assets/dialogs-anatomy.png | Bin 0 -> 66170 bytes components/Dialogs/docs/color-theming.md | 37 ---- components/Dialogs/docs/theming.md | 99 --------- components/Dialogs/docs/typical-use-alert.md | 33 --- .../Dialogs/docs/typical-use-modal-dialog.md | 34 --- components/Dialogs/docs/typography-theming.md | 37 ---- ...BottomDrawerInfiniteScrollingExample.swift | 22 +- ...ttomDrawerViewController+MaterialTheming.h | 30 +++ ...ttomDrawerViewController+MaterialTheming.m | 69 ++++++ ...MaterialNavigationDrawer+MaterialTheming.h | 16 ++ .../MDCBottomDrawerControllerSnapshotTests.m | 31 ++- components/Tabs/examples/TabBarIconExample.m | 31 ++- 20 files changed, 429 insertions(+), 373 deletions(-) delete mode 100644 components/Dialogs/docs/accessibility.md create mode 100644 components/Dialogs/docs/assets/dialogs-anatomy.png delete mode 100644 components/Dialogs/docs/color-theming.md delete mode 100644 components/Dialogs/docs/theming.md delete mode 100644 components/Dialogs/docs/typical-use-alert.md delete mode 100644 components/Dialogs/docs/typical-use-modal-dialog.md delete mode 100644 components/Dialogs/docs/typography-theming.md create mode 100644 components/NavigationDrawer/src/Theming/MDCBottomDrawerViewController+MaterialTheming.h create mode 100644 components/NavigationDrawer/src/Theming/MDCBottomDrawerViewController+MaterialTheming.m create mode 100644 components/NavigationDrawer/src/Theming/MaterialNavigationDrawer+MaterialTheming.h diff --git a/components/ActionSheet/examples/ActionSheetTypicalUseExample.m b/components/ActionSheet/examples/ActionSheetTypicalUseExample.m index 5f144bb876a..ceddf40948b 100644 --- a/components/ActionSheet/examples/ActionSheetTypicalUseExample.m +++ b/components/ActionSheet/examples/ActionSheetTypicalUseExample.m @@ -26,6 +26,7 @@ @interface ActionSheetTypicalUseExampleViewController : UIViewController @property(nonatomic, strong) MDCButton *showButton; +@property(nonatomic, strong) MDCActionSheetController *actionSheet; @property(nonatomic, strong) id containerScheme; @end @@ -92,6 +93,7 @@ - (void)showActionSheet { [actionSheet addAction:emailAction]; [actionSheet applyThemeWithScheme:self.containerScheme]; actionSheet.delegate = self; + self.actionSheet = actionSheet; [self presentViewController:actionSheet animated:YES completion:nil]; } @@ -113,3 +115,34 @@ + (NSDictionary *)catalogMetadata { } @end + +@implementation ActionSheetTypicalUseExampleViewController (SnapshotTestingByConvention) + +- (void)testDefaults { + // Given + [self resetStates]; + MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; + self.containerScheme = containerScheme; + + // When + [self showActionSheet]; +} + +- (void)testDynamic201907ColorScheme { + // Given + [self resetStates]; + MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; + containerScheme.colorScheme = + [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201907]; + self.containerScheme = containerScheme; + + // When + [self showActionSheet]; +} + +- (void)resetStates { + [self.actionSheet dismissViewControllerAnimated:NO completion:nil]; + self.actionSheet = nil; +} + +@end diff --git a/components/Banner/examples/AppBarBannerExample.m b/components/Banner/examples/AppBarBannerExample.m index 81469672054..634929254ce 100644 --- a/components/Banner/examples/AppBarBannerExample.m +++ b/components/Banner/examples/AppBarBannerExample.m @@ -137,6 +137,18 @@ @implementation AppBarBannerExample (SnapshotTestingByConvention) }; } +- (void)testDynamic201907ColorScheme { + // Given + MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; + containerScheme.colorScheme = + [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201907]; + self.containerScheme = containerScheme; + + // When + [self.appBarViewController applyPrimaryThemeWithScheme:_containerScheme]; + [self showBanner]; +} + @end #pragma mark - Typical application code (not Material-specific) diff --git a/components/BottomAppBar/examples/supplemental/BottomAppBarTypicalUseSupplemental.m b/components/BottomAppBar/examples/supplemental/BottomAppBarTypicalUseSupplemental.m index f165b84a538..64e5e2d3c2c 100644 --- a/components/BottomAppBar/examples/supplemental/BottomAppBarTypicalUseSupplemental.m +++ b/components/BottomAppBar/examples/supplemental/BottomAppBarTypicalUseSupplemental.m @@ -275,6 +275,17 @@ - (void)testFabHidden { [self.bottomBarView setFloatingButtonHidden:YES animated:NO]; } +- (void)testDynamic201907ColorSchemeWithCenteredFab { + // Given + [self resetTests]; + self.colorScheme = + [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201907]; + + // When + [self.bottomBarView setFloatingButtonPosition:MDCBottomAppBarFloatingButtonPositionCenter + animated:NO]; +} + - (void)resetTests { [self.bottomBarView setFloatingButtonPosition:MDCBottomAppBarFloatingButtonPositionCenter animated:NO]; diff --git a/components/BottomNavigation/examples/BottomNavigationTypicalUseExample.m b/components/BottomNavigation/examples/BottomNavigationTypicalUseExample.m index 1678d78f74e..f47b72f8b8e 100644 --- a/components/BottomNavigation/examples/BottomNavigationTypicalUseExample.m +++ b/components/BottomNavigation/examples/BottomNavigationTypicalUseExample.m @@ -150,3 +150,27 @@ - (void)bottomNavigationBar:(nonnull MDCBottomNavigationBar *)bottomNavigationBa } @end + +@implementation BottomNavigationTypicalUseExample (SnapshotTestingByConvention) + +- (void)testDefaults { + // Given + MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; + self.containerScheme = containerScheme; + + // When + [self.bottomNavBar applyPrimaryThemeWithScheme:self.containerScheme]; +} + +- (void)testDynamic201907ColorScheme { + // Given + MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; + containerScheme.colorScheme = + [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201907]; + self.containerScheme = containerScheme; + + // When + [self.bottomNavBar applyPrimaryThemeWithScheme:self.containerScheme]; +} + +@end diff --git a/components/Buttons/examples/ButtonsTypicalUseExample.m b/components/Buttons/examples/ButtonsTypicalUseExample.m index 4e1db6afa8d..7efb181c52e 100644 --- a/components/Buttons/examples/ButtonsTypicalUseExample.m +++ b/components/Buttons/examples/ButtonsTypicalUseExample.m @@ -22,6 +22,12 @@ static const CGSize kMinimumAccessibleButtonSize = {64.0, 48.0}; @interface ButtonsTypicalUseExample () +@property(nonatomic, strong) MDCButton *containedButton; +@property(nonatomic, strong) MDCButton *disabledContainedButton; +@property(nonatomic, strong) MDCButton *textButton; +@property(nonatomic, strong) MDCButton *disabledTextButton; +@property(nonatomic, strong) MDCButton *outlinedButton; +@property(nonatomic, strong) MDCButton *disabledOutlinedButton; @property(nonatomic, strong) MDCFloatingButton *floatingButton; @end @@ -65,6 +71,7 @@ - (void)viewDidLoad { [containedButton addTarget:self action:@selector(didTap:) forControlEvents:UIControlEventTouchUpInside]; + self.containedButton = containedButton; [self.view addSubview:containedButton]; // Disabled contained button @@ -77,6 +84,7 @@ - (void)viewDidLoad { action:@selector(didTap:) forControlEvents:UIControlEventTouchUpInside]; [disabledContainedButton setEnabled:NO]; + self.disabledContainedButton = disabledContainedButton; [self.view addSubview:disabledContainedButton]; // Text button @@ -94,6 +102,7 @@ - (void)viewDidLoad { [textButton addTarget:self action:@selector(didTap:) forControlEvents:UIControlEventTouchUpInside]; + self.textButton = textButton; [self.view addSubview:textButton]; // Disabled Text button @@ -106,6 +115,7 @@ - (void)viewDidLoad { action:@selector(didTap:) forControlEvents:UIControlEventTouchUpInside]; [disabledTextButton setEnabled:NO]; + self.disabledTextButton = disabledTextButton; [self.view addSubview:disabledTextButton]; // Outlined button @@ -124,6 +134,7 @@ - (void)viewDidLoad { [outlinedButton addTarget:self action:@selector(didTap:) forControlEvents:UIControlEventTouchUpInside]; + self.outlinedButton = outlinedButton; [self.view addSubview:outlinedButton]; // Disabled outlined button @@ -136,6 +147,7 @@ - (void)viewDidLoad { action:@selector(didTap:) forControlEvents:UIControlEventTouchUpInside]; [disabledOutlinedButton setEnabled:NO]; + self.disabledOutlinedButton = disabledOutlinedButton; [self.view addSubview:disabledOutlinedButton]; // Floating action button @@ -214,3 +226,39 @@ - (void)viewDidAppear:(BOOL)animated { } @end + +@implementation ButtonsTypicalUseExample (SnapshotTestingByConvention) + +- (void)testDefaults { + // Given + MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; + self.containerScheme = containerScheme; + + // When + [self.containedButton applyContainedThemeWithScheme:self.containerScheme]; + [self.disabledContainedButton applyContainedThemeWithScheme:self.containerScheme]; + [self.textButton applyTextThemeWithScheme:self.containerScheme]; + [self.disabledTextButton applyTextThemeWithScheme:self.containerScheme]; + [self.outlinedButton applyOutlinedThemeWithScheme:self.containerScheme]; + [self.disabledOutlinedButton applyOutlinedThemeWithScheme:self.containerScheme]; + [self.floatingButton applySecondaryThemeWithScheme:self.containerScheme]; +} + +- (void)testDynamic201907ColorScheme { + // Given + MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; + containerScheme.colorScheme = + [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201907]; + self.containerScheme = containerScheme; + + // When + [self.containedButton applyContainedThemeWithScheme:self.containerScheme]; + [self.disabledContainedButton applyContainedThemeWithScheme:self.containerScheme]; + [self.textButton applyTextThemeWithScheme:self.containerScheme]; + [self.disabledTextButton applyTextThemeWithScheme:self.containerScheme]; + [self.outlinedButton applyOutlinedThemeWithScheme:self.containerScheme]; + [self.disabledOutlinedButton applyOutlinedThemeWithScheme:self.containerScheme]; + [self.floatingButton applySecondaryThemeWithScheme:self.containerScheme]; +} + +@end diff --git a/components/Buttons/examples/FloatingButtonTypicalUseExample.m b/components/Buttons/examples/FloatingButtonTypicalUseExample.m index c11de90c318..9548205bcf2 100644 --- a/components/Buttons/examples/FloatingButtonTypicalUseExample.m +++ b/components/Buttons/examples/FloatingButtonTypicalUseExample.m @@ -193,3 +193,20 @@ + (NSDictionary *)catalogMetadata { } @end + +@implementation FloatingButtonTypicalUseExample (SnapshotTestingByConvention) + +- (void)testDynamic201907ColorScheme { + // Given + MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; + containerScheme.colorScheme = + [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201907]; + self.containerScheme = containerScheme; + + // When + [self.miniFloatingButton applySecondaryThemeWithScheme:self.containerScheme]; + [self.largeIconFloatingButton applySecondaryThemeWithScheme:self.containerScheme]; + [self.largeIconFloatingButton applySecondaryThemeWithScheme:self.containerScheme]; +} + +@end diff --git a/components/Dialogs/README.md b/components/Dialogs/README.md index e0e75a8a0f0..ac00194a799 100644 --- a/components/Dialogs/README.md +++ b/components/Dialogs/README.md @@ -21,83 +21,56 @@ involve multiple tasks. Dialogs -## Design & API documentation - - - -## Table of contents - -- [Overview](#overview) - - [Presentation and transition controller](#presentation-and-transition-controller) - - [Alert controller](#alert-controller) -- [Installation](#installation) - - [Installation with CocoaPods](#installation-with-cocoapods) - - [Importing](#importing) -- [Usage](#usage) - - [Typical use: modal dialog](#typical-use-modal-dialog) - - [Typical use: alert](#typical-use-alert) -- [Extensions](#extensions) - - [Theming Extensions](#theming-extensions) - - [Theming Actions](#theming-actions) - - [Using a Themer](#using-a-themer) -- [Accessibility](#accessibility) - - [MDCPresentationController Accessibility](#mdcpresentationcontroller-accessibility) - -- - - - -## Overview - -To display a modal using MaterialDialogs you set two properties on the view controller to be -presented. Set modalPresentationStyle to UIModalPresentationCustom and set -transitioningDelegate to and instance of MDCDialogTransitionController. Then you present the -view controller from the root controller to display it as a modal dialog. - -### Presentation and transition controller - -Presenting dialogs uses two classes: MDCDialogPresentationController and -MDCDialogTransitionController. These allow the presentation of view controllers in a material -specificed manner. MDCDialogPresentationController is a subclass of UIPresentationController -that observes the presented view controller for preferred content size. -MDCDialogTransitionController implements UIViewControllerAnimatedTransitioning and -UIViewControllerTransitioningDelegate to vend the presentation controller during the transition. +## Contents + +* [Using dialogs](#using-dialogs) +* [Making dialogs accessible](#making-dialogs-accessible) +* [Dialogs examples](#dialogs-examples) +* [Theming dialogs](#theming-dialogs) + +## Using dialogs + +The Dialogs component can be used to display Material Design alerts with things like title text and +message text, as well as optional icons and accessory views. It can also be used to modally present +custom dialogs. -### Alert controller +To use the Dialogs component when presenting your view controller, set its `modalPresentationStyle` +property to `UIModalPresentationCustom` and its `transitioningDelegate` property to an +instance of `MDCDialogTransitionController`. Then, present the view controller from the +root controller. -MDCAlertController provides a simple interface for developers to present a modal dialog -according to the Material spec. +### Dialogs Classes + +#### `MDCDialogPresentationController` and `MDCDialogTransitionController` + +The two classes involved in presenting dialogs are `MDCDialogPresentationController` and +`MDCDialogTransitionController`. These allow the presentation of view controllers in a Material +fashion. `MDCDialogPresentationController` is a subclass of `UIPresentationController` +that observes the presented view controller for preferred content size. +`MDCDialogTransitionController` implements `UIViewControllerAnimatedTransitioning` and +`UIViewControllerTransitioningDelegate` to vend the presentation controller during the transition. -## Installation +#### `MDCAlertController` - +`MDCAlertController` provides a basic alert interface that can be used when a custom dialog +view controller class is not necessary. -### Installation with CocoaPods +### Installing dialogs -Add the following to your `Podfile`: +In order to install Dialogs with [Cocoapods](https://guides.cocoapods.org/using/getting-started.html) first add the component to your `Podfile`: ```bash -pod 'MaterialComponents/Dialogs' +pod MaterialComponents/Dialogs ``` -Then, run the following command: +Then, run the installer. ```bash pod install ``` -### Importing - -To import the component: +After that, import the Dialogs target. #### Swift @@ -106,18 +79,37 @@ import MaterialComponents.MaterialDialogs ``` #### Objective-C - ```objc #import "MaterialDialogs.h" ``` +## Making dialogs accessible + +### `MDCPresentationController` Accessibility -## Usage +As `MDCPresentationController` is responsible for the presentation of your +custom view controllers, it does not implement any accessibility +functionality itself. - +#### `-accessibilityPerformEscape` Behavior -### Typical use: modal dialog +Ensure that the accessibility escape gesture in VoiceOver works by implementing +the `-performAccessibilityEscape` method in your custom dialog view controller class. + +``` +- (BOOL)accessibilityPerformEscape { + [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; + return YES; +} +``` + +## Dialogs examples + +### Custom dialog example + +The sample code below shows how to use the Dialogs component to present a custom dialog. +For a more in-depth example, see the [`DialogsCustomShadowExampleViewController`](examples/DialogsCustomShadowExampleViewController.swift). #### Swift @@ -152,9 +144,12 @@ myDialogViewController.transitioningDelegate = self.dialogTransitionController; ``` - +### `MDCAlertController` example -### Typical use: alert + +The sample code below shows how to use the Dialogs component to present an +`MDCAlertController`. For a more in-depth example, see the +[`DialogsTypicalUseExampleViewController`](examples/DialogsTypicalUseExampleViewController.m). #### Swift @@ -188,14 +183,46 @@ MDCAlertAction *alertAction = ``` +### Anatomy and key properties + +The following is an anatomy diagram of a Material dialog: + +![anatomy](docs/assets/dialogs-anatomy.png) -## Extensions +1. Container +2. Title (optional) +3. Content +4. Buttons (optional) +5. Scrim - +#### Container attributes -### Theming Extensions +  | **Attribute** | **Related methods** | **Default value** +----------------------------------- | -------------------------------------------------------- | ------------------------------------------------------ | ----------------- +**Color** | `view.backgroundColor` | `-setBackgroundColor:`
`-backgroundColor` | Surface color +**Shape** | `cornerRadius` | `-setCornerRadius:`
`-cornerRadius` | 4 -You can theme an MDCDialog to match the Material Design Dialog using your app's scheme and the Dialogs theming +#### Title attributes + +  | **Attribute** | **Related methods** | **Default value** +-------------- | ------------------------ | -------------------------------- | ----------------- +**Text label** | `title` | `-setTitle:`
`-title` | `nil` +**Text color** | `titleColor` | `-setTitleColor:`
`-titleColor` | `nil` +**Typography** | `titleFont` | `-setTitleFont:`
`-titleFont` | Headline 6 + +#### Content attributes + +**Supporting text** + +  | **Attribute** | **Related methods** | **Default value** +-------------- | ------------------------ | ------------------- | ----------------- +**Text** | `message` | `-setMessage:`
`-message` | `nil` +**Text color** | `messageColor` | `-setMessageColor:`
`-messageColor` | `nil` +**Typography** | `messageFont` | `-setMessageFont:`
`-messageFont` | Body 1 + +### Theming dialogs + +You can theme a Material Dialog to match the Material Design Dialog using your app's scheme and the Dialogs theming extension. To add the theming extension to your project add the following line to your Podfile: ```bash @@ -239,10 +266,6 @@ MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; Actions in MDCAlertController have emphasis which affects how the Dialog's buttons will be themed. High, Medium and low emphasis are supported. -
- An alert presented with a title, body, high-emphasis 'OK' button and low-emphasis 'Cancel' button. -
- #### Swift ```swift @@ -260,7 +283,7 @@ High, Medium and low emphasis are supported. // Make sure to apply theming after all actions are added, so they are themed too! alert.applyTheme(withScheme: scheme) - // present the alert + // Present the alert present(alertController, animated:true, completion:nil) ``` @@ -288,31 +311,8 @@ High, Medium and low emphasis are supported. // Make sure to apply theming after all actions are added, so they are themed too! [alert applyThemeWithScheme:scheme]; - // present the alert + // Present the alert [self presentViewController:alert animated:YES completion:...]; ``` -## Accessibility - - - -### MDCPresentationController Accessibility - -As MDCPresentationController is responsible for the presentation of your -custom view controllers, it does not implement any accessibility -functionality itself. - -#### `-accessibilityPerformEscape` Behavior - -If you intend your presented view controller to dismiss when a user -in VoiceOver mode has performed the escape gesture the view controller -should implement the accessibilityPerformEscape method. - -``` -- (BOOL)accessibilityPerformEscape { - [self.presentingViewController dismissViewControllerAnimated:YES completion:NULL]; - return YES; -} -``` - diff --git a/components/Dialogs/docs/accessibility.md b/components/Dialogs/docs/accessibility.md deleted file mode 100644 index b6520f16ed9..00000000000 --- a/components/Dialogs/docs/accessibility.md +++ /dev/null @@ -1,18 +0,0 @@ -### MDCPresentationController Accessibility - -As MDCPresentationController is responsible for the presentation of your -custom view controllers, it does not implement any accessibility -functionality itself. - -#### `-accessibilityPerformEscape` Behavior - -If you intend your presented view controller to dismiss when a user -in VoiceOver mode has performed the escape gesture the view controller -should implement the accessibilityPerformEscape method. - -``` -- (BOOL)accessibilityPerformEscape { - [self.presentingViewController dismissViewControllerAnimated:YES completion:NULL]; - return YES; -} -``` diff --git a/components/Dialogs/docs/assets/dialogs-anatomy.png b/components/Dialogs/docs/assets/dialogs-anatomy.png new file mode 100644 index 0000000000000000000000000000000000000000..279778f32436594f66eb571a10b8edf4feffb804 GIT binary patch literal 66170 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 -#### Swift -```swift -// Step 1: Import the ColorThemer extension -import MaterialComponents.MaterialDialogs_ColorThemer - -// Step 2: Create or get a color scheme -let colorScheme = MDCSemanticColorScheme() - -// Step 3: Apply the color scheme to your component -MDCAlertColorThemer.applySemanticColorScheme(colorScheme, to: component) -``` - -#### Objective-C - -```objc -// Step 1: Import the ColorThemer extension -#import "MaterialDialogs+ColorThemer.h" - -// Step 2: Create or get a color scheme -id colorScheme = [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201804]; - -// Step 3: Apply the color scheme to your component -[MDCAlertColorThemer applySemanticColorScheme:colorScheme - toAlertController:component]; -``` - diff --git a/components/Dialogs/docs/theming.md b/components/Dialogs/docs/theming.md deleted file mode 100644 index 92b3f27715c..00000000000 --- a/components/Dialogs/docs/theming.md +++ /dev/null @@ -1,99 +0,0 @@ -### Theming Extensions - -You can theme an MDCDialog to match the Material Design Dialog using your app's scheme and the Dialogs theming -extension. To add the theming extension to your project add the following line to your Podfile: - -```bash -pod 'MaterialComponents/Dialogs+Theming' -``` - -Then import the theming extension and the `MDCContainerScheme` and create an `MDCContainerScheme` instance. A container scheme -defines the design parameters that you can use to theme your dialogs. Finally, call the appropriate method on the theming extension. - - -#### Swift -```swift -// Step 1: Import the Dialog theming extension and container scheme -import MaterialComponents.MaterialDialogs_Theming -import MaterialComponents.MaterialContainerScheme - -// Step 2: Create or get a container scheme -let containerScheme = MDCContainerScheme() - -// Step 3: Apply the container scheme to your component using the desired alert style -alertController.applyTheme(withScheme: containerScheme) -``` - -#### Objective-C - -```objc -// Step 1: Import the Dialog theming extension and container scheme -#import "MaterialDialogs+Theming.h" -#import "MaterialContainerScheme.h" - -// Step 2: Create or get a container scheme -MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; - -// Step 3: Apply the container scheme to your component using the desired alert style -[alertController applyThemeWithScheme:containerScheme]; -``` - - -### Theming Actions - -Actions in MDCAlertController have emphasis which affects how the Dialog's buttons will be themed. -High, Medium and low emphasis are supported. - -
- An alert presented with a title, body, high-emphasis 'OK' button and low-emphasis 'Cancel' button. -
- - -#### Swift -```swift - // Create or reuse a Container scheme - let scheme = MDCContainerScheme() - - // Create an Alert dialog - let alert = MDCAlertController(title: "Button Theming", message: "Add item to cart?") - - // Add actions with emphases that will generate buttons with the desired appearance. - // An example of a high and a medium emphasis actions: - alert.addAction(MDCAlertAction(title:"Add Item", emphasis: .high, handler: handler)) - alert.addAction(MDCAlertAction(title:"Cancel", emphasis: .medium, handler: handler)) - - // Make sure to apply theming after all actions are added, so they are themed too! - alert.applyTheme(withScheme: scheme) - - // present the alert - present(alertController, animated:true, completion:nil) -``` - -#### Objective-C - -```objc - // Create or reuse a Container scheme - MDCContainerScheme *scheme = [[MDCContainerScheme alloc] init]; - - // Create an Alert dialog - MDCAlertController *alert = - [MDCAlertController alertControllerWithTitle:@"Button Theming" message:@"Add item to cart?"]; - - // Add actions with different emphasis, creating buttons with different themes. - MDCAlertAction *primaryAction = [MDCAlertAction actionWithTitle:@"Add Item" - emphasis:MDCActionEmphasisHigh - handler:handler]; - [alert addAction:primaryAction]; - - MDCAlertAction *cancelAction = [MDCAlertAction actionWithTitle:@"Cancel" - emphasis:MDCActionEmphasisMedium - handler:handler]; - [alert addAction:cancelAction]; - - // Make sure to apply theming after all actions are added, so they are themed too! - [alert applyThemeWithScheme:scheme]; - - // present the alert - [self presentViewController:alert animated:YES completion:...]; -``` - diff --git a/components/Dialogs/docs/typical-use-alert.md b/components/Dialogs/docs/typical-use-alert.md deleted file mode 100644 index b274fe2a20f..00000000000 --- a/components/Dialogs/docs/typical-use-alert.md +++ /dev/null @@ -1,33 +0,0 @@ -### Typical use: alert - - -#### Swift - -```swift -// Present a modal alert -let alertController = MDCAlertController(title: titleString, message: messageString) -let action = MDCAlertAction(title:"OK") { (action) in print("OK") } -alertController.addAction(action) - -present(alertController, animated:true, completion:...) -``` - -#### Objective-C - -```objc -// Present a modal alert -MDCAlertController *alertController = -[MDCAlertController alertControllerWithTitle:titleString - message:messageString]; - -MDCAlertAction *alertAction = - [MDCAlertAction actionWithTitle:@"OK" - handler:^(MDCAlertAction *action) { - NSLog(@"OK"); - }]; - -[alertController addAction:alertAction]; - -[self presentViewController:alertController animated:YES completion:...]; -``` - diff --git a/components/Dialogs/docs/typical-use-modal-dialog.md b/components/Dialogs/docs/typical-use-modal-dialog.md deleted file mode 100644 index 02d5665e9fc..00000000000 --- a/components/Dialogs/docs/typical-use-modal-dialog.md +++ /dev/null @@ -1,34 +0,0 @@ -### Typical use: modal dialog - - -#### Swift - -```swift -// The following is called from the presenting view controller and has the -// following variable defined to keep a reference to the transition -// controller. -strong var dialogTransitionController: MDCDialogTransitionController - -// To present the dialog myDialogViewController -dialogTransitionController = MDCDialogTransitionController() -myDialogViewController.modalPresentationStyle = .custom -myDialogViewController.transitioningDelegate = dialogTransitionController - -present(myDialogViewController, animated: true, completion:...) -``` - -#### Objective-C - -```objc -// self is the presenting view controller and which has the following property -// defined to keep a reference to the transition controller. -@property(nonatomic) MDCDialogTransitionController *dialogTransitionController; - -// To present the dialog myDialogViewController -self.dialogTransitionController = [[MDCDialogTransitionController alloc] init]; -myDialogViewController.modalPresentationStyle = UIModalPresentationCustom; -myDialogViewController.transitioningDelegate = self.dialogTransitionController; -[self presentViewController:myDialogViewController animated:YES completion:...]; - -``` - diff --git a/components/Dialogs/docs/typography-theming.md b/components/Dialogs/docs/typography-theming.md deleted file mode 100644 index 75ed552ef68..00000000000 --- a/components/Dialogs/docs/typography-theming.md +++ /dev/null @@ -1,37 +0,0 @@ -### Typography Theming - -You can theme a dialog with your app's typography scheme using the TypographyThemer extension. - -You must first add the Typography Themer extension to your project: - -```bash -pod 'MaterialComponents/Dialogs+TypographyThemer' -``` - - -#### Swift -```swift -// Step 1: Import the TypographyThemer extension -import MaterialComponents.MaterialDialogs_TypographyThemer - -// Step 2: Create or get a typography scheme -let typographyScheme = MDCTypographyScheme() - -// Step 3: Apply the typography scheme to your component -MDCAlertTypographyThemer.applyTypographyScheme(typographyScheme, to: component) -``` - -#### Objective-C - -```objc -// Step 1: Import the TypographyThemer extension -#import "MaterialDialogs+TypographyThemer.h" - -// Step 2: Create or get a typography scheme -id typographyScheme = [[MDCTypographyScheme alloc] init]; - -// Step 3: Apply the typography scheme to your component -[MDCAlertTypographyThemer applyTypographyScheme:colorScheme - toAlertController:component]; -``` - diff --git a/components/NavigationDrawer/examples/BottomDrawerInfiniteScrollingExample.swift b/components/NavigationDrawer/examples/BottomDrawerInfiniteScrollingExample.swift index b43c5677f35..2d833eecba7 100644 --- a/components/NavigationDrawer/examples/BottomDrawerInfiniteScrollingExample.swift +++ b/components/NavigationDrawer/examples/BottomDrawerInfiniteScrollingExample.swift @@ -16,9 +16,10 @@ import UIKit import MaterialComponents.MaterialBottomAppBar import MaterialComponents.MaterialColorScheme import MaterialComponents.MaterialNavigationDrawer +import MaterialComponents.MaterialNavigationDrawer_Theming class BottomDrawerInfiniteScrollingExample: UIViewController { - @objc var colorScheme = MDCSemanticColorScheme(defaults: .material201804) + @objc var containerScheme: MDCContainerScheming = MDCContainerScheme() let bottomAppBar = MDCBottomAppBarView() let headerViewController = DrawerHeaderViewController() @@ -26,9 +27,8 @@ class BottomDrawerInfiniteScrollingExample: UIViewController { override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = colorScheme.backgroundColor - contentViewController.colorScheme = colorScheme - + view.backgroundColor = containerScheme.colorScheme.backgroundColor + contentViewController.colorScheme = containerScheme.colorScheme as? MDCSemanticColorScheme bottomAppBar.isFloatingButtonHidden = true let barButtonLeadingItem = UIBarButtonItem() let menuImage = UIImage(named:"ic_menu")?.withRenderingMode(.alwaysTemplate) @@ -37,13 +37,13 @@ class BottomDrawerInfiniteScrollingExample: UIViewController { barButtonLeadingItem.action = #selector(presentNavigationDrawer) bottomAppBar.leadingBarButtonItems = [ barButtonLeadingItem ] - bottomAppBar.barTintColor = colorScheme.surfaceColor; - let barItemTintColor = colorScheme.onSurfaceColor.withAlphaComponent(0.6) + bottomAppBar.barTintColor = containerScheme.colorScheme.surfaceColor + let barItemTintColor = containerScheme.colorScheme.onSurfaceColor.withAlphaComponent(0.6) bottomAppBar.leadingBarItemsTintColor = barItemTintColor bottomAppBar.trailingBarItemsTintColor = barItemTintColor - bottomAppBar.floatingButton.setBackgroundColor(colorScheme.primaryColor, for: .normal) - bottomAppBar.floatingButton.setTitleColor(colorScheme.onPrimaryColor, for: .normal) - bottomAppBar.floatingButton.setImageTintColor(colorScheme.onPrimaryColor, for: .normal) + bottomAppBar.floatingButton.setBackgroundColor(containerScheme.colorScheme.primaryColor, for: .normal) + bottomAppBar.floatingButton.setTitleColor(containerScheme.colorScheme.onPrimaryColor, for: .normal) + bottomAppBar.floatingButton.setImageTintColor(containerScheme.colorScheme.onPrimaryColor, for: .normal) view.addSubview(bottomAppBar) } @@ -76,9 +76,7 @@ class BottomDrawerInfiniteScrollingExample: UIViewController { bottomDrawerViewController.headerViewController = headerViewController bottomDrawerViewController.trackingScrollView = contentViewController.tableView bottomDrawerViewController.isTopHandleHidden = false - bottomDrawerViewController.headerViewController?.view.backgroundColor = colorScheme.surfaceColor; - bottomDrawerViewController.contentViewController?.view.backgroundColor = colorScheme.surfaceColor; - bottomDrawerViewController.scrimColor = colorScheme.onSurfaceColor.withAlphaComponent(0.32) + bottomDrawerViewController.applyTheme(withScheme: containerScheme) present(bottomDrawerViewController, animated: true, completion: nil) } } diff --git a/components/NavigationDrawer/src/Theming/MDCBottomDrawerViewController+MaterialTheming.h b/components/NavigationDrawer/src/Theming/MDCBottomDrawerViewController+MaterialTheming.h new file mode 100644 index 00000000000..7f7e2db6aac --- /dev/null +++ b/components/NavigationDrawer/src/Theming/MDCBottomDrawerViewController+MaterialTheming.h @@ -0,0 +1,30 @@ +// Copyright 2020-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 "MaterialNavigationDrawer.h" +#import "MaterialContainerScheme.h" + +@interface MDCBottomDrawerViewController (MaterialTheming) + +/** + Applies the Material theme to a MDCBottomDrawerViewController instance. + + @param scheme A container scheme instance containing any desired customizations to the theming + system. + */ +- (void)applyThemeWithScheme:(nonnull id)scheme; + +@end diff --git a/components/NavigationDrawer/src/Theming/MDCBottomDrawerViewController+MaterialTheming.m b/components/NavigationDrawer/src/Theming/MDCBottomDrawerViewController+MaterialTheming.m new file mode 100644 index 00000000000..f4c6dedbb36 --- /dev/null +++ b/components/NavigationDrawer/src/Theming/MDCBottomDrawerViewController+MaterialTheming.m @@ -0,0 +1,69 @@ +// Copyright 2020-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 "MaterialElevation.h" +#import "MDCBottomDrawerViewController+MaterialTheming.h" + +static const CGFloat kCollapsedCornerRadius = 8.0f; +static const CGFloat kFullScreenCornerRadius = 0.0f; +static const CGFloat kScrimAlpha = 0.32f; +static const CGFloat kTopHandleAlpha = 0.12f; + +@implementation MDCBottomDrawerViewController (MaterialTheming) + +- (void)applyThemeWithScheme:(id)scheme { + [self applyColorThemeWithColorScheme:scheme.colorScheme]; + [self setTopCornersRadius:kCollapsedCornerRadius forDrawerState:MDCBottomDrawerStateCollapsed]; + [self setTopCornersRadius:kFullScreenCornerRadius forDrawerState:MDCBottomDrawerStateFullScreen]; +} + +- (void)applyColorThemeWithColorScheme:(id)colorScheme { + [MDCBottomDrawerViewController mdc_setResolvedBackgroundColorForBottomDrawer:self + withScheme:colorScheme]; + if (colorScheme.elevationOverlayEnabledForDarkMode) { + self.mdc_elevationDidChangeBlock = ^(id _Nonnull object, + CGFloat absoluteElevation) { + if ([object isKindOfClass:[MDCBottomDrawerViewController class]]) { + MDCBottomDrawerViewController *bottomDrawer = (MDCBottomDrawerViewController *)object; + [MDCBottomDrawerViewController mdc_setResolvedBackgroundColorForBottomDrawer:bottomDrawer + withScheme:colorScheme]; + } + }; +#if defined(__IPHONE_13_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0) + if (@available(iOS 13.0, *)) { + self.traitCollectionDidChangeBlock = ^(MDCBottomDrawerViewController *_Nonnull bottomDrawer, + UITraitCollection *_Nullable previousTraitCollection) { + if ([bottomDrawer.traitCollection + hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]) { + [MDCBottomDrawerViewController mdc_setResolvedBackgroundColorForBottomDrawer:bottomDrawer + withScheme:colorScheme]; + } + }; + } +#endif + } + self.scrimColor = [colorScheme.onSurfaceColor colorWithAlphaComponent:kScrimAlpha]; + self.topHandleColor = [colorScheme.onSurfaceColor colorWithAlphaComponent:kTopHandleAlpha]; +} + ++ (void)mdc_setResolvedBackgroundColorForBottomDrawer:(MDCBottomDrawerViewController *)bottomDrawer + withScheme:(id)scheme { + UIColor *backgroundColor = [scheme.backgroundColor + mdc_resolvedColorWithTraitCollection:bottomDrawer.traitCollection + elevation:bottomDrawer.view.mdc_absoluteElevation]; + bottomDrawer.headerViewController.view.backgroundColor = backgroundColor; + bottomDrawer.contentViewController.view.backgroundColor = backgroundColor; +} + +@end diff --git a/components/NavigationDrawer/src/Theming/MaterialNavigationDrawer+MaterialTheming.h b/components/NavigationDrawer/src/Theming/MaterialNavigationDrawer+MaterialTheming.h new file mode 100644 index 00000000000..36643e928a7 --- /dev/null +++ b/components/NavigationDrawer/src/Theming/MaterialNavigationDrawer+MaterialTheming.h @@ -0,0 +1,16 @@ +// Copyright 2020-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 "MDCBottomDrawerViewController+MaterialTheming.h" diff --git a/components/NavigationDrawer/tests/snapshot/MDCBottomDrawerControllerSnapshotTests.m b/components/NavigationDrawer/tests/snapshot/MDCBottomDrawerControllerSnapshotTests.m index cc2cbbacd21..352275e8ad7 100644 --- a/components/NavigationDrawer/tests/snapshot/MDCBottomDrawerControllerSnapshotTests.m +++ b/components/NavigationDrawer/tests/snapshot/MDCBottomDrawerControllerSnapshotTests.m @@ -15,8 +15,9 @@ #import "MaterialSnapshot.h" #import "../../src/private/MDCBottomDrawerContainerViewController.h" -#import "MaterialNavigationDrawer.h" #import "supplemental/MDCBottomDrawerSnapshotTestMutableTraitCollection.h" +#import "MaterialNavigationDrawer.h" +#import "MaterialNavigationDrawer+MaterialTheming.h" /** Fake MDCBottomDrawerContainerViewController for snapshot testing. */ @interface FakeBottomDrawerContainerViewController : MDCBottomDrawerContainerViewController @@ -60,6 +61,9 @@ @interface MDCBottomDrawerControllerSnapshotTests : MDCSnapshotTestCase /** Presenting view controller of the Bottom Drawer Container view controller. */ @property(nonatomic, strong) UIViewController *presentingViewController; +/** A container scheme. */ +@property(nonatomic, strong) MDCContainerScheme *containerScheme; + @end @implementation MDCBottomDrawerControllerSnapshotTests @@ -81,6 +85,7 @@ - (void)setUp { self.bottomDrawerViewController.contentViewController = contentViewController; self.bottomDrawerViewController.headerViewController = headerViewController; self.presentingViewController = [[UIViewController alloc] init]; + self.containerScheme = [[MDCContainerScheme alloc] init]; } - (void)tearDown { @@ -120,6 +125,30 @@ - (void)testPresentedDrawerWithColoredViews { [self generateSnapshotAndVerifyForView:self.bottomDrawerViewController.view]; } +- (void)testPresentedDrawerWithTheming { + // Given + self.presentingViewController.view.frame = CGRectMake(0, 0, 375, 667); + self.containerViewController = [[FakeBottomDrawerContainerViewController alloc] + initWithOriginalPresentingViewController:self.presentingViewController + trackingScrollView:nil]; + self.containerViewController.contentViewController = + self.bottomDrawerViewController.contentViewController; + self.containerViewController.headerViewController = + self.bottomDrawerViewController.headerViewController; + + // When + self.bottomDrawerViewController.view.bounds = CGRectMake(0, 0, 375, 667); + self.bottomDrawerViewController.contentViewController.preferredContentSize = + CGSizeMake(375, 1000); + self.bottomDrawerViewController.headerViewController.preferredContentSize = CGSizeMake(375, 80); + [self.bottomDrawerViewController.view addSubview:self.containerViewController.view]; + [self.bottomDrawerViewController addChildViewController:self.containerViewController]; + [self.bottomDrawerViewController applyThemeWithScheme:self.containerScheme]; + + // Then + [self generateSnapshotAndVerifyForView:self.bottomDrawerViewController.view]; +} + - (void)testPresentedDrawerWithColoredViewsWithVerticalSizeClassCompact { // Given self.presentingViewController.view.frame = CGRectMake(0, 0, 667, 375); diff --git a/components/Tabs/examples/TabBarIconExample.m b/components/Tabs/examples/TabBarIconExample.m index 224b087af3c..29a601ebc8a 100644 --- a/components/Tabs/examples/TabBarIconExample.m +++ b/components/Tabs/examples/TabBarIconExample.m @@ -14,10 +14,11 @@ #import "supplemental/TabBarIconExampleSupplemental.h" +#import "MaterialAppBar+ColorThemer.h" #import "MaterialAppBar.h" -#import "MaterialContainerScheme.h" -#import "MaterialTabs+Theming.h" #import "MaterialTabs.h" +#import "MaterialTabs+Theming.h" +#import "MaterialContainerScheme.h" @interface TabBarIconExample () @property(nonatomic, strong) UIBarButtonItem *addStarButtonItem; @@ -150,3 +151,29 @@ - (void)tabBar:(MDCTabBar *)tabBar didSelectItem:(UITabBarItem *)item { } @end + +@implementation TabBarIconExample (SnapshotTestingByConvention) + +- (void)testDefaults { + // Given + MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; + self.containerScheme = containerScheme; + + // When + [self.tabBar applyPrimaryThemeWithScheme:self.containerScheme]; +} + +- (void)testDynamic201907ColorScheme { + // Given + MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init]; + containerScheme.colorScheme = + [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201907]; + self.containerScheme = containerScheme; + + // When + [self.tabBar applyPrimaryThemeWithScheme:self.containerScheme]; + [MDCAppBarColorThemer applyColorScheme:self.containerScheme.colorScheme + toAppBarViewController:self.appBarViewController]; +} + +@end